我只是想在 C 中使用递归找到一个回文数。然而,我犯了一个错误,这个错误我不知道。每次它给我的结果是0。
以下是源代码:
#include<stdio.h>
#include<conio.h>
int pal(int num);
void main()
{
int num=625,res=0;
res=pal(num);
printf("%d",res);
getch();
}
int pal(int num)
{
int ans=0,rem=0,index=0;
index=log10(num);
if(index==0)
{
return ;
}
index--;
rem=num%10;
ans=ans*10+rem;
return pal(index--);
}
请给我最简单的方法找到它。我需要一个易于理解的程序。
一些问题:
- 您递归地用
index
而不是num
调用pal
; - 如果
index
为 0,则需要返回一个值 - 该值应该是多少? main
返回int
,而不是void
;- 你对代码做什么的描述不清楚 - 你是否试图反转一个数字,确定它是否是回文的,什么?
假设您正在尝试反转一个数字,递归算法将如下所示:
int reverse( int num )
{
/**
* Account for negative inputs by preserving the sign and
* converting the input to positive for processing.
*/
int sign = 1;
if ( num < 0 )
{
sign = -1;
num = -num;
}
/**
* If the input is a single digit, then there's
* nothing to reverse and we return the original
* input value.
*/
if ( num < 10 )
return sign * num;
/**
* Otherwise, find and preserve the least significant digit.
*/
int remainder = num % 10;
/**
* Recursively call reverse on the higher-order digits.
*/
int rev = reverse( num / 10 );
/**
* Determine the order of magnitude of the reversed
* value, multiply the remainder by that magnitude
* to make it the new most significant digit.
*/
for ( int tmp = rev; tmp; tmp /= 10 )
remainder *= 10;
/**
* PARENTHESES MATTER HERE
*/
return sign * (remainder + rev);
}
编辑
我添加了一些文档,希望使该代码更加清晰。 我还更改了乘法remainder
的方式,使其不依赖于pow
函数。
你到底想做什么?
1.检查数字是否为回文。
2.寻找下一个最小/更大的回文。
3.找到数字的反面。
注意:回文数是从两端读取相同的数字。
例如:
12321 -> palindrome number
23143 -> not palindrome number
7 -> palindrome number
要检查一个数字是否是回文,首先找到该数字的反面,如果反向等于该数字,则该数字是回文,否则不是。
int pal(int num){
int n=0;
while (num != 0){
n = n * 10;
n = n + num%10;
num = num/10;
}
return num;
}
此函数将返回一个反向数字,您可以将其与输入进行比较,if(input == pal(input))
那么它是一个苍白数字,其他明智的不是。 希望对您有所帮助。
完全反转一个数字以将其与原始数字进行检查似乎是测试数字是否为回文的错误方法。一旦数字左端和右端的数字不匹配,你就完成了,你不需要继续反转数字。 解决方案在于过程,而不是结果。
下面是一个简单的递归回文数谓词函数:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
bool is_palindrome(unsigned long long number)
{
unsigned int logarithm = log10(number);
if (logarithm == 0)
{
return true; // single digit numbers are palindromes
}
unsigned long long power = pow(10, logarithm);
unsigned int left = number / power;
unsigned int right = number % 10;
if (left == right)
{
// ends match, so toss 'em and test what's left recursively
return is_palindrome((number - left * power) / 10);
}
return false; // ends don't match, so not a palindrome
}
int main(int argc, const char *argv[])
{
printf("%sn", is_palindrome(atoll(argv[1])) ? "Yes" : "No");
return 1;
}
测试用例
% ./a.out 6
Yes
% ./a.out 66
Yes
% ./a.out 666
Yes
% ./a.out 625
No
% ./a.out 12345678987654321
Yes
% ./a.out 31415
No