我在Project Euler上创建了问题4的解决方案。 但是,我发现将print语句(打印答案)放在不同的位置会打印出不同的答案。由于某种原因,结果的最高值是580085.不应该是906609吗?我的isPalindrome()方法有问题吗?
#include <stdio.h>
#include <stdbool.h>
int isPalindrome(int n);
//Find the largest palindrome made from the product of two 3-digit numbers.
int main(void)
{
int i = 0;
int j = 0;
int result = 0;
int palindrome = 0;
int max = 0;
//Each iteration of i will be multiplied from j:10-99
for(i = 100; i <= 999; i++)
{
for(j = 100; j <= 999; j++)
{
result = i * j;
if(isPalindrome(result) == 0)
{
//printf("Largest Palindrome: %d\n", max); //906609
//printf("Result: %d\n", result); //580085
if(result > max)
{
max = result;
//printf("Largest Palindrome: %d\n", max); //927340
}
printf("Largest Palindrome: %d\n", max); //906609
}
}
}
//printf("Largest Palindrome: %d\n", max); //998001
system("PAUSE");
return 0;
} //End of main
//Determines if number is a palindrome
int isPalindrome(int num)
{
int n = num;
int i = 0;
int j = 0;
int k = 0;
int count = 0;
int yes = 0;
//Determines the size of numArray
while(n/10 != 0)
{
n%10;
count++;
n = n/10;
}
int numArray[count];
//Fill numArray with each digit of num
for(i = 0; i <= count; i++)
{
numArray[i] = num%10;
//printf("%d\n", numArray[i]);
num = num/10;
}
//Determines if num is a Palindrome
while(numArray[k] == numArray[count])
{
k = k + 1;
count = count - 1;
yes++;
}
if(yes >= 3)
{
return 0;
}
}//End of Function
答案 0 :(得分:4)
我记得前一段时间我正在做这个问题而我只是制作了一个is_palindrome()
函数并且强行强迫它。我从999 * 999向下开始测试。
我检测回文的方法与你的不同。我会将给定的数字转换为字符串,并将第一个字符与第n个字符进行比较,第二个字符串与n-1进行比较,依此类推。
这很简单(也可能效率低下),但答案会“立即”出现。
答案 1 :(得分:3)
查找号码时代码没有问题 根据你的代码片段:
.
.
}
printf("Largest Palindrome: %d\n", max); //906609
}
}
}
//printf("Largest Palindrome: %d\n", max); //998001
system("PAUSE");
.
.
.
一旦找到回文数字,就会得到结果。
你应该将回文存储在变量max中,并让代码进一步运行,因为有可能进一步找到更大的回文。
请注意,对于i=800,j=500
,与i*j
相比,i=999,j=100
会更大。
只需理解这里的逻辑。
答案 2 :(得分:1)
//Determines if number is a palindrome
bool isPalindrome(int num) // Change this to bool
{
int n = num;
int i = 0;
int j = 0;
int k = 0;
int count = 1; // Start counting at 1, to account for 1 digit numbers
int yes = 0;
//Determines the size of numArray
while(n/10 != 0)
{
// n%10; <-- What was that all about!
count++;
n = n/10;
}
int numArray[count];
//Fill numArray with each digit of num
for(i = 0; i < count; i++) // This will crash if you use index=count; Array indices go from 0 to Size-1
{
numArray[i] = num%10;
//printf("%d\n", numArray[i]);
num = num/10;
}
//Determines if num is a Palindrome
/*
while(numArray[k] == numArray[count-1]) // Again count-1 not count; This is really bad though what if you have 111111 or some number longer than 6. It might also go out of bounds
{
k = k + 1;
count = count - 1;
yes++;
}
*/
for(k = 1; k <= count; k++)
{
if(numArray[k-1] != numArray[count-k])
return false;
}
return true;
}//End of Function
这就是我能找到的全部。
您还需要更改此
if(isPalindrome(result) == 0)
要
if(isPalindrome(result))
进行修改后的代码输出:Link
答案 3 :(得分:1)
isPalindrome
函数中的一些问题:
numArray
数组太小(假设您的编译器支持像开始那样创建数组)yes
中的值可能不正确,因此函数的结果也是如此。答案 4 :(得分:1)
在遍历所有可能的值之后,正确的printf是for之后的那个
您使用int来存储palidrome的值,但结果大于65536, 你应该使用未签名的
result = i * j;
这段代码错了:
while(n/10 != 0) {
n%10;
count++;
n = n/10;
}
它应该是:
while(n != 0) {
count++;
n = n/10;
}
以及P.R sugested的变化。
你可以做这样的事情来确定数字是否为回文:
int isPalindrom(unsigned nr) {
int i, len;
char str[10];
//convert number to string
sprintf(str, "%d", nr);
len = strlen(str);
//compare first half of the digits with the second half
// stop if you find two digits which are not equal
for(i = 0; i < len / 2 && str[i] == str[len - i - 1]; i++);
return i == len / 2;
}
答案 5 :(得分:1)
我将数字转换为String,因此我可以将数字作为char数组重复:
private static boolean isPalindrom(long num) {
String numAsStr = String.valueOf(num);
char[] charArray = numAsStr.toCharArray();
int length = charArray.length;
for (int i = 0 ; i < length/2 ; ++i) {
if (charArray[i] != charArray[length - 1 - i]) return false;
}
return true;
}
答案 6 :(得分:0)
我对这个问题得到了正确答案,但我想知道我的编码风格是好还是坏。我需要知道如何改进我的编码,如果它是坏的和更通用的方式。
#include<stdio.h>
#define MAX 999
#define START 100
int main()
{
int i,j,current,n,prev = 0;
for(i = START;i<=MAX;i++)
{
for(j=START;j<=MAX;j++)
{
current = j * i;
if(current > prev) /*check the current value so that if it is less need not go further*/
{
n = palindrome(current);
if (n == 1)
{
printf("The palindrome number is : %d\n",current);
prev = current; // previous value is updated if this the best possible value.
}
}
}
}
}
int palindrome(int num)
{
int a[6],temp;
temp = num;
/*We need a array to store each element*/
a[5] = temp % 10;
a[4] = (temp/10) %10;
a[3] = (temp/100) %10;
a[2] = (temp/1000) %10;
a[1] = (temp/10000) %10;
if(temp/100000 == 0)
{
a[0] = 0;
if(a[1] == a[5] && a[2] == a[4])
return 1;
}
else
{
a[0] = (temp/100000) %10;
if(a[0] == a[5] && a[1] == a[4] && a[2] == a[3])
return 1;
else
return 0;
}
}
答案 7 :(得分:-1)
否,最大应该是:906609。 这是我的程序:
def reverse_function(x):
return x[::-1]
def palindrome():
largest_num = max(i * x
for i in range(100, 1000)
for x in range(100, 1000)
if str(i * x) == reverse_function(str(i * x)))
return str(largest_num)
print(palindrome())