PTA 编程题(C语言)-- 水仙花数

题目标题:水仙花数             题目作者:徐镜春  浙江大学

水仙花数是指一个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:

#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刷题助手”,或扫下面的二维码

猜你喜欢

转载自blog.csdn.net/morn_l/article/details/133889920