所有回文数均由两个3位数字的乘积组成

时间:2015-02-07 06:07:32

标签: c++ palindrome

这个程序应该打印由两个3位数字的乘积形成的所有回文数,但我不能用这个程序得到它。 程序中的错误是什么?请帮助。

#include <iostream>
using namespace std;
int main()
{
    int a[100000] = {};
    int b[5];
    int k = 0;
    int temp;
    int sum;
    int rever;
    int r;
    for (int i = 100; i <= 999; i++)
    {
        for (int j = 100; j <= 999; j++)
        {
            a[k] = i * j;
            k++;
        }
    }
    for (int i = 0; a[i] != NULL; i++)
    {
        temp = a[i];
        while (temp)
        {
            r = temp % 10;
            temp = temp / 10;
            rever = rever * 10 + r;
        }
        if (rever == a[i])
            cout << a[i];
    }
    return 0;
}

4 个答案:

答案 0 :(得分:1)

你必须将i从100循环到999,但j从 i 到999导致231 * 952与952 * 231相同。使用字符串也更容易。

在C:

#include <stdio.h>
#include <string.h>
int main() {
    char ch[7], k, l;
    for (int i = 100; i < 1000; i++) {
        for (int j = i; j < 1000; j++) {
            sprintf(ch, "%d", i*j);
            l=strlen(ch)-1;
            k=0;
            while(ch[k++]==ch[l--]) {
                    if (k>=l) {
                            printf("%d*%d=%s\n", i,j,ch);
                            break;
                    }
            }
        }
    }
    return 0;
}

答案 1 :(得分:0)

首先,你的格式是令人讨厌的不一致。全部缩进,并且它将更容易帮助。

第二个i循环的测试显然是错误的。它应该运行多少次,它的停止条件应该是多少?从a开始测试需要多少个值?

答案 2 :(得分:0)

我在您的代码中看到的错误:

  1. a的大小。你已宣布

    int a[100000] = {};
    

    但是,您尝试在其中设置900 x 900 = 810,000个元素的值。那应该是

    int a[SIZE] = {};
    

    其中SIZE810,000或更高。

  2. a[i] != NULL声明中使用for是不对的。你应该使用:

    for (int i = 0; i < k; i++)
    
  3. for循环中,您要检查数字是否为回文数,rever永远不会重置。此外,rever在使用之前未初始化。

  4. 打印回文编号的行需要在输出中添加换行符。否则,所有数字都将以非常长的数字串形式出现。

  5. 这是一个带有修复程序的更新版本:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
       const int SIZE = 810000;
       int a[SIZE] = {};
       int b[5];
       int k = 0;
       int temp;
       int sum;
       int r;
       for (int i = 100; i <= 999; i++)
       {
          for (int j = 100; j <= 999; j++)
          {
             a[k] =  i * j;
             k++;
          }
       }
       for (int i = 0; i < k; i++)
       {
          temp = a[i];
          int rever = 0;
          while (temp)
          {
             r =  temp % 10;
             temp = temp/10;
             rever = rever * 10 + r;
          }
          if (rever == a[i])
             cout << a[i] << endl;
       }
       return 0;
    }
    

答案 3 :(得分:0)

不需要2个循环和许多变量以及你制作的长数组 你的第二个循环终止条件也不正确。

for(i=0;a[i]!=NULL;i++)

我们知道只有900个3位数字,因此我们可以终止900 x 900的循环,即810000

for(i=0;i<810000;i++)

问题陈述的解决方案。我发现了很多错误,所以我编码了它。

#include <iostream>
#include <conio.h>
using namespace std;
int main()
{

int i,j;
long int number, reverse,temp;
for (i = 100; i <= 999; i++)
{
    for (j = 100; j <= 999; j++)
    {

        number = i*j;
        temp = number;
        reverse = 0;
        for (; temp != 0;)
        {
            reverse = reverse * 10;
            reverse = reverse + temp % 10;
            temp = temp / 10;
        }
        if (reverse == number)
            cout << number<<endl;


    }
}

_getch();
return 0;

}