C语言:习题4-6 水仙花数 错误分析

题目

习题4-6 水仙花数

水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身。例如: 153 = 1 3 + 5 3 + 3 3 153=1^3+5^3+3^3 153=13+53+33。 本题要求编写程序,计算所有N位水仙花数。

输入格式:

输入在一行中给出一个正整数N(3≤N≤7)。

输出格式:

按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:

3

输出样例:

153
370
371
407

我的做法

遍历n位数,找出水仙花数

#include 
#include 
int main(){
	int n,i,j;
	scanf("%d",&n);
	for(i=pow(10,n-1);i<pow(10,n);i++){
		int a=i;
		double num=0;
		int t;
		for(j=0;j<n;j++){
			t=a%10;
			num+=pow(t,n);
			a/=10;
		}
		if(i==num)
			printf("%d\n",i);
	}
	return 0;
}

结果n=7时,超时了
C语言:习题4-6 水仙花数 错误分析_第1张图片
而在dev-cpp上是可以做出来的,时间大概为3500ms,确实超过时间限制的2500ms

网上查询借鉴对比他人代码后更改为:

#include 
int p(int a,int b);
int main(){
	int n,i,j;
	scanf("%d",&n);
	for(i=p(10,n-1);i<p(10,n);i++){
		int a=i;
		int num=0;
		int t;
		for(j=0;j<n;j++){
			t=a%10;
			num+=p(t,n);
			a/=10;
		}
		if(i==num)
			printf("%d\n",i);
	}
	return 0;
}
int p(int a,int b){
	int t=a,i;
	for(i=1;i<b;i++){
		a=a*t;
	}
	return a;
}

C语言:习题4-6 水仙花数 错误分析_第2张图片
两段代码主要区别为pow()函数返回值是double类型,计算量较大,容易超时,所以自写一个p()函数来求x的y次方,返回值为int类型,缺点是位数大了可能会出错。

你可能感兴趣的:(C语言学习)