首页 > 解决方案 > 查找其数字平方和为素数的数(Pascal 或 C++)

问题描述

所以帮我解决这个问题:“số đẹp”(它是越南语)是一个数字,其数字平方和是质数。

例如: 12 是“số đẹp”,因为 1^2 + 2^2 是 5 ,这是一个素数。

所以给定 1 <= N <= 106 ,找到 N 放置的“số đẹp”(其中 N 是用户输入)

例如:如果你输入“1”,程序会显示第一个“sốđẹp”,即11。

如果键入“2”,将弹出 12。

Pascal 是最好的,但 C++ 很好。

这是我尝试过的(不起作用)(写的是帕斯卡):

program so_dep;
uses crt;
var n,i,c,b:integer;

function sumdigits(a:integer):integer;
var digits,sum:integer;
begin
 sum := 0;
 while a <> 0 do
  begin
  digits := a mod 10;
  a := a div 10;
  sum := sum + a*a;
  end;
 sumdigits := sum;
end;

function primecheck(a:integer):boolean;
var prime:boolean;
    i:integer;
    max:real;
begin
 if a = 2 then prime:=true
 else if (a <=1) or (a mod 2 = 0) then
  prime := false
 else begin
  prime := true; i := 3; max := sqrt(n);
  while i <= max do
   begin
    if n mod i = 0 then begin
     prime := false;exit
    end;
    i := i + 2;
   end;
end;
end;

begin
clrscr;
write('Nhap so N: ');readln(n);
for c := 2 to n do
begin
b := 0;
while b < n do
 if primecheck(sumdigits(c)) = true then
  begin
   i := c;
   inc(b);
  end;
end;
writeln('"So dep" thu ',n,' la ',i);
readln;
end.

它应该工作(这就是我的想法),但它没有。

按“1”,输出为0(应该是11)按2或以上,它根本不起作用。

标签: c++pascal

解决方案


这应该可以解决问题:

#include <iostream>
#include <cmath> // sqrt

using namespace std; // not recommended, but I'm lazy here.

bool checkNumber(int); // checks if number is a thingamabob
bool isPrime(int);     // checks if number is a prime

int main()
{
    // input your N
    int n = 0;
    cout << "Show the n-th number: " << flush;
    cin >> n;
    // check n validity
    if (cin.good() && n > 0 && n <= 106) {
        int idx = 0;    // which thingamabob-number are we at?
        int number = 0; // what is the current number?
        while (idx < n) { // run until we have arrived at the n-th thingamabob-number
            number++;     // check each number sequentially
            if (checkNumber(number)) {
                idx++; // number is a thingamabob, increment
            }
        }
        cout << "N-th number is: " << number << endl; // we have reached the nth thingamabob-number (loop exited), display it.
    }
    else {
        cout << "enter a number 0 < n <= 106" << endl;
    }
    return 0;
}

bool checkNumber(int number) {
    int digit = 0;
    int sum = 0;
    while (number > 0) {
        digit = number % 10;
        sum += digit * digit;
        number = number / 10;
    }
    return isPrime(sum);
}

bool isPrime(int number) {
    // standard prime check, check modulo for every number up to sqrt number in steps of 2
    if (number == 1) { return false; } // 1 not a prime
    if (number == 2) { return true; }  // 2 is prime
    if (number % 2 == 0) { return false; }
    for (int i = 3; i <= ceil(sqrt(number)); i += 2) {
        if (number % i == 0) { return false; }
    }
    return true;

}

推荐阅读