下列程序的功能是:寻找并输出11~999之间的数m,它满足m、m2和m3均为回文数。所谓回文数是指各位数字左右对称的整数,例如121、676、94249等。满足上述条件的数如m=11,m2=121,m3=1331皆为回文数。请编写函数int palindromevalue(long n)实现功能:如果是回文数,则函数返回1,反之则返回0。最后,把结果输出到文件OUT.dat中。
注意:部分源程序已给出。请勿改动主函数main()的内容。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int palindromevalue(long n)
{
}
main()
{ long m;
FILE *out;
out = fopen("out.dat", "w");
for (m=11; m<1000; m++)
if (palindromevalue(m) && palindromevalue(m*m) && palindromevalue(m*m*m))
{ printf("m=%4ld,m*m=%6ld,m*m*m=%8ld \n", m, m*m, m*m*m);
fprintf(out,"m=%4ld,m*m=%6ld,m*m*m=%8ld \n", m, m*m, m*m*m);
}
fclose(out);
}
试题答案及详解
【审题分析】分析题目可知,本题只要实现palindromevalue函数的功能即可。函数palindromevalue要实现的功能是:寻找并输出11至999之间的数m,它满足m、m2和m3均为回文数。因此解答本题的关键在于如何判断m是否为回文数。
【解题思路】判断数字是否为回文数,只要对比该数字的对立位置上的数是否相等即可。这里我们首先把要判断是否是回文数的数字通过ltoa函数,将其拆分成单个数字,并存入到一个字符数组中,然后从字符数组的开始位置和尾部位置同时向其中间位置逐个字符的进行比较运算。如果首尾位置的两个字符不相等,则退出循环,说明这个数不是回文数。如果比较到中间位置时都相等,则说明这个数字是回文数。
【参考答案】
int palindromevalue(long n)
{ int i, strl, half;
char temp[20];
ltoa(n, temp, 10);
strl = strlen(temp);
half = strl/2;
for (i=0; i<half; i++)
if (temp[i] != temp[--strl])
break;
if (i >= half)
return 1;
else
return 0;
}
【易错分析】字符串尾部指针的自减为--str,而不是str--。
【考点链接】字符串首尾两端字符的相等比较。
责任编辑:小草