我正在尝试解决问题4 - 项目欧拉,我被困了。所以我需要一点帮助我的代码。这是我要解决的问题:
回文数字两种方式相同。由两个2位数字的乘积制成的最大回文是9009 = 91×99。
找出由两个3位数字的乘积制成的最大回文。
代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int is_palindrom(int number, int revrse) {
char str1[6];
char str2[6];
sprintf(str1, "%d", number);
sprintf(str2, "%d", revrse);
return strcmp(str1, str2);
}
int main(void) {
int number, revrse;
int i, j, temp;
int maks;
for(i=999;i>99;i--)
for(j=999;j>99;j--) {
temp = number = i*j;
while (temp != 0) {
revrse = revrse * 10;
revrse = revrse + temp%10;
temp = temp/10;
}
if(is_palindrom(number, revrse)==0 && number > maks)
maks = number;
}
printf("%d",maks);
return 0;
}
答案 0 :(得分:5)
revrse
var未初始化,因此其中有垃圾。记得始终初始化一个变量!
答案 1 :(得分:2)
补充@kleszcz的答案,revrse
必须始终在while
循环开始之前初始化,否则,它将保留先前的值(并在第一次迭代中进行垃圾处理,因为他明智地指出)。
另一个问题是您不需要is_palindrome
功能。您可以直接检查数字是否相等。
答案 2 :(得分:1)
要正确获得数字的反转形式,您需要首先为循环的每次迭代设置revrse
为0的初始值,否则行为未定义。它还有助于设置maks
的初始值以进行比较。最后,当你可以检查你的号码和它的反向之间的相等性时,为什么要使用一个函数来检查回文?
int main()
{
int number;
int i,j,temp;
int maks = -1;
int revrse;
for(i=999;i>99;i--) {
for(j=999;j>99;j--) {
number = i*j;
revrse = 0;
temp=number;
while (temp != 0){
revrse = revrse * 10;
revrse = revrse + temp%10;
temp = temp/10;
}
if(number == revrse) {
if(number > maks) {
maks = number;
}
}
}
}
printf("%d",maks);
return 0;
}