水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=13+53+33。 本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。
函数narcissistic判断number是否为水仙花数,是则返回1,否则返回0。
函数PrintN则打印开区间(m, n)内所有的水仙花数,每个数字占一行。题目保证100≤m≤n≤10000。
这道题有一个小小的问题,就是头文件里面没有#include <math.h>,不能用pow函数。有三种方法可以解决这个问题:
1. 在函数前面加上#include <math.h>,这样似乎不符合头文件的规范,但是能通过编译,提交也正确
2. 自己写一个简单的pow函数
3. 不使用pow函数,改用循环中变量自身相乘解决
本题使用方法1,简单解决,代码如下:
//直接在这里增加一个头文件 #include <math.h> int narcissistic( int number ){ int ret = 0, i = 0,cnt = 0,sum = 0; int number_copy = number; //cnt为位数 while (number_copy > 0){ number_copy /= 10; cnt++; } //每个位数数字存入数组 number_copy = number; int a[cnt]; for (i = 0; i < cnt; i++){ a[i] = number_copy % 10; number_copy /= 10; } //求和 for (i = 0; i < cnt; i++){ sum += pow(a[i],cnt); } //判断 if (sum == number){ ret = 1; } return ret; } void PrintN( int m, int n ){ int i = 0; for (i = m + 1; i < n;i++){ if (narcissistic(i) == 1){ printf("%d\n",i); } } }