题目标题:水仙花数 题目作者:徐镜春 浙江大学
水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如:153=1^3+5^3+3^3。 本题要求编写程序,计算所有N位水仙花数。
输入格式:
输入在一行中给出一个正整数N(3≤N≤7)。
输出格式:
按递增顺序输出所有N位水仙花数,每个数字占一行。
输入样例:
3
输出样例:
153
370
371
407
思路:(1)对于输入的N,我们先算两个数A=10^(N-1),B=10^N。要计算这两个数,我们可以调用pow函数,即A = pow(10,N-1),B = pow(10,N)。
(2)用外层循环遍历[A,B)之间的所有整数i,如 for (i = A; i <B; i++) {...}。
(3)对每一个取到的i,用里层循环计算i的各个位数字的N次方的和sum,如果sum == i,则输出该数;否则,继续外层循环。
注意:在计算数num的各个位数字的N次方之和的时候,我们需要进行迭代,每次取num的最低位数字t,把t^N加到sum上,在给num /= 10;
代码1:
#include <stdio.h>
#include <math.h>
int main () {
int N,A,B,i,j,t,num,sum;
scanf("%d", &N);
A = pow(10,N-1);
B = A*10;
for (i = A; i < B; i++) {
num = i; // 因为后面计算出来的sum还要和i进行比较,所以每次把i赋值给num。
sum = 0; // 每次要给sum重新赋值为0。
for (j = 0; j < N; j++) { // 这个循环就是用来求num的各个位数字的N次方的和的
t = num%10; // 每次取最低位的数字
sum += pow(t,N);
num /= 10; // 计算完后,对num整除10
}
if (sum == i) printf("%d\n",i);
}
return 0;
}
代码1是能够正确输出的,但是时间会比较长。在PTA提交时,最后一个测试点即N=7,会计算超时。超时的原因在于每次计算一个位数的N次方时要调用pow函数,而pow函数本来时针对浮点数运算而设计的,运行时间相对较长。用pow来计算整数的N次方,显然有些浪费。我们用一个循环来取代对pow的调用。就可以完美的通过所有的测试点,
代码2:文章来源:https://www.toymoban.com/news/detail-767166.html
#include <stdio.h>
#include <math.h>
int main () {
int N,A,B,i,j,k,t,num,sum,prod;
scanf("%d", &N);
A = pow(10,N-1);
B = A*10;
for (i = A; i < B; i++) {
num = i;
sum = 0;
for (j = 0; j < N; j++) {
t = num%10;
for (k = 0, prod = 1; k < N; k++) prod *= t;
sum += prod;
num /= 10;
}
if (sum == i) printf("%d\n",i);
}
return 0;
}
更多PTA题目的的参考代码,可以在wx小程序里搜“PTA刷题助手”,或扫下面的二维码
文章来源地址https://www.toymoban.com/news/detail-767166.html
到了这里,关于PTA 编程题(C语言)-- 水仙花数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!