user-0 提问: 水仙数问题，测试数据与实际不符合。输入153本应该为水仙数，可是每位3次方后和为152！求指点！谢谢！

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-2
content: 引用 3 楼 jianwen0529 的回复:[quote=引用 2 楼 jianwen0529 的回复:] for(i=0;i<count;i++)     sum=sum+pow(box[i],count); sum = (int)sum + f; // 0.000001 <  f < 0.999998  pow 没有计算整数的重载，估计是精度造成的  或者写一个求整数n次幂的函数  int pown(int x, int y) {     if (y <= 0) return 1;     else if (y == 1) return x;     return x * pown(x, y - 1); }[/quote] 虽然没有整型的pow，但是它的返回值给了一个整形数，它pow返回值会自动被截断为整型的数值。

user: user-2
content: /*    一个N位数，其各个数位上的数的n次方之和恰好等于原数    测试数据    153，370，371，407，1634，8208，9474；    */  #include <stdio.h> #include <math.h>  int main(void) {     int box[10];     int i = 0, t, num, count = 0, sum = 0;      printf("输入一个正整数：");     scanf("%d", &num);     t = num;     while(num)     {         count++;       //统计位数         box[i] = num % 10; //将num的每一位放入         num /= 10;         i++;     }     //看是几位数     printf("数字位数：%d\n",count);      //看数组里面装的元素     printf("数组存放：");     for(i = 0; i < count; i++)         printf("%d ", box[i]);     putchar('\n');      //看sum的值是否与num相等     for(i = 0; i < count; i++)         sum = sum + pow(box[i], count); //将num存入box[]中的每一位count次方     printf("sum=%d\n",sum);      if(sum == t)         printf("%d是水仙数\n",t);     else         printf("%d不是水仙数\n",t);      return 0; }  你的程序没有问题，请查看一下你的输入是否有问题。你是否将153输入成了152。 程序没问题，我通过了测试验证。153，370，371，407，1634，8208，9474这些通过验证结论都是水仙数。

user: user-2
content: 引用 7 楼 jianwen0529 的回复:[quote=引用 5 楼 cfjtaishan 的回复:] [quote=引用 3 楼 jianwen0529 的回复:] [quote=引用 2 楼 jianwen0529 的回复:] for(i=0;i<count;i++)     sum=sum+pow(box[i],count); sum = (int)sum + f; // 0.000001 <  f < 0.999998  pow 没有计算整数的重载，估计是精度造成的  或者写一个求整数n次幂的函数  int pown(int x, int y) {     if (y <= 0) return 1;     else if (y == 1) return x;     return x * pown(x, y - 1); }[/quote] 虽然没有整型的pow，但是它的返回值给了一个整形数，它pow返回值会自动被截断为整型的数值。[/quote]  所以就是截断的问题，不能保证int转为浮点数的时候精度有差别，比如 1 为 0.999999999... 再转换回int 就成为 0了。 如果他的步骤没有问题，那我只能猜测这方面的原因 更好的是自己提供一个计算整形数的pow[/quote] 整型数据的运算用不到小数部分，并且根据浮点数在内存保存格式，如果整形数较大时，超过了浮点数整数表示的范围就有可能报错了。但纯本问题不会出现越界的。 对于大数据建议你的方案。

user: user-3
content: 引用 5 楼 cfjtaishan 的回复:[quote=引用 3 楼 jianwen0529 的回复:] [quote=引用 2 楼 jianwen0529 的回复:] for(i=0;i<count;i++)     sum=sum+pow(box[i],count); sum = (int)sum + f; // 0.000001 <  f < 0.999998  pow 没有计算整数的重载，估计是精度造成的  或者写一个求整数n次幂的函数  int pown(int x, int y) {     if (y <= 0) return 1;     else if (y == 1) return x;     return x * pown(x, y - 1); }[/quote] 虽然没有整型的pow，但是它的返回值给了一个整形数，它pow返回值会自动被截断为整型的数值。[/quote]  所以就是截断的问题，不能保证int转为浮点数的时候精度有差别，比如 1 为 0.999999999... 再转换回int 就成为 0了。 如果他的步骤没有问题，那我只能猜测这方面的原因 更好的是自己提供一个计算整形数的pow

user: user-3
content: 引用 2 楼 jianwen0529 的回复:for(i=0;i<count;i++)     sum=sum+pow(box[i],count); sum = (int)sum + f; // 0.000001 <  f < 0.999998  pow 没有计算整数的重载，估计是精度造成的  或者写一个求整数n次幂的函数  int pown(int x, int y) {     if (y <= 0) return 1;     else if (y == 1) return x;     return x * pown(x, y - 1); }

user: user-3
content: for(i=0;i<count;i++)     sum=sum+pow(box[i],count); sum = (int)sum + f; // 0.000001 <  f < 0.999998  pow 没有计算整数的重载，估计是精度造成的  或者写一个求整数n次幂的函数