水仙花数是指一个 N 位正整数(N ≥ 3),它的每个位上的数字的 N 次幂之和等于它本身。例如:153 = 1³ +5³ +3³。 本题要求编写两个函数,一个判断给定整数是否水仙花数,另一个按从小到大的顺序打印出给定区间 (m, n) 内所有的水仙花数。
函数接口定义:
int narcissistic( int number );
void PrintN( int m, int n );
函数 narcissistic 判断 numbe r是否为水仙花数,是则返回 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
来源:
来源:PTA | 程序设计类实验辅助教学平台
链接:https://pintia.cn/problem-sets/12/exam/problems/306
提交:
题解:
/*
* 判断 number 是否是水仙花数:[0]不是 [1]是
*/
int narcissistic(int number) {
// counts 统计数 number 的位数
int counts = 0;
int tmp = number;
while (tmp != 0) {
tmp /= 10;
counts++;
}
// sum 为 number 的各位数字的 number 次幂之和
int sum = 0;
tmp = number;
while (tmp != 0) {
int lastNumber = tmp % 10;
sum += (int) pow(lastNumber, counts);
tmp /= 10;
}
return sum == number ? 1 : 0;
}
/*
* 按从小到大的顺序打印出给定区间 (m, n) 内所有的水仙花数
*/
void PrintN(int m, int n) {
// 根据题意,从开区间(m,n)开始判断
for (int i = m + 1; i < n; i++) {
if (narcissistic(i) == 1) {
printf("%d\n", i);
}
}
}