#include <stdio.h>
#include <math.h>
int prime (long n);
long reverse(long n);
int main(void)
{
long n;
long i, j;
puts("Enter n dight number, and we will help you find symmetrical prime number");
scanf("%ld", &n);
for (i = 11; i < (pow(10, n) - 1); i+= 2)
{
if (prime(i))
{
j = reverse(i);
if (i == j)
{
printf("%ld\n", i);
}
}
}
}
int prime (long n) //estimate whether the number n is primer number
{
int status = 0;
int j;
//1 is prime, 0 is not
if (n % 2 == 0 || n == 3)
{
if (n == 2)
status = 1;
if (n == 3)
status = 1;
else
{
n++;
status = 0;
}
}
else
{
j = 3;
while (j <= sqrt(n))
{
if (n % j == 0)
{
status = 0;
break;
}
else
status = 1;
j+= 2;
}
}
return status;
}
long reverse(long n) //reverse a number
{
int i, j, x;
long k, sum;
int digit = 0;
int ar[1000];
while (n > 0)
{
k = n;
n = n / 10;
x = (k - n*10);
digit++;
ar[digit] = x;
}
for (i = 1,j = digit - 1; i <= digit; i++, j--)
{
sum += ar[i] * pow(10, j)
}
return sum;
}
我构建了一个反向函数,以便将数字反转,例如,214到412。
这个函数在单个数字中工作正常,例如,我输入reverse(214),它返回412,这很好。但是,当我将reverse()
函数与for循环结合使用时,此函数无法正常工作......它会产生一些奇怪的数字......
所以如何解决这个问题?
答案 0 :(得分:7)
反向功能非常复杂。更好的方法是:
long reverse (long n)
{
long result = 0;
while (n != 0)
{
result *= 10;
result += n % 10;
n /= 10;
}
return result;
}
我认为代码中的问题在于以下部分
digit++;
ar[digit] = x;
首先递增位置然后分配给它,从而使ar[0]
保持未初始化。
答案 1 :(得分:2)
如何解决此问题?
您需要初始化sum
long k, sum = 0;
^
请参阅@Armen Tsirunyan的代码,了解更简单的方法。