为什么这个反向函数不能在for循环中工作?

时间:2016-07-11 12:30:48

标签: c

#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循环结合使用时,此函数无法正常工作......它会产生一些奇怪的数字......

所以如何解决这个问题?

2 个答案:

答案 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的代码,了解更简单的方法。