实验5-9 使用函数输出水仙花数 (20分)

    技术2022-07-10  187

    水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=1​3​​+5​3​​+3​3​​。 本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间(m,n)内所有的水仙花数。

    函数接口定义:

    int narcissistic( int number ); void PrintN( int m, int n );

    函数narcissistic判断number是否为水仙花数,是则返回1,否则返回0。

    函数PrintN则打印开区间(m, n)内所有的水仙花数,每个数字占一行。题目保证100≤m≤n≤10000。

    裁判测试程序样例:

    #include <stdio.h> int narcissistic( int number ); void PrintN( int m, int n ); int main() { int m, n; scanf("%d %d", &m, &n); if ( narcissistic(m) ) printf("%d is a narcissistic number\n", m); PrintN(m, n); if ( narcissistic(n) ) printf("%d is a narcissistic number\n", n); return 0; } /* 你的代码将被嵌在这里 */

    输入样例:

    153 400

    输出样例:

    153 is a narcissistic number 370 371

    这道题有一个小小的问题,就是头文件里面没有#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); } } }

     

    Processed: 0.008, SQL: 9