水仙花数

"水仙花数"是指一个三位数,其各位数字立方和等于该本身。 例如:153是一个水仙花数,因为153=1^3+5^3+3^3。 

程序设计中常见的两类“水仙花数” 的题目:

1>打印输出所有水仙花数;

2>判断一个数是否为水仙花数;

 

我们先来看第一类题目:打印输出所有水仙花数

常规做法:

#include<stdio.h>
int main(void){
	int i,j,k;
	for(i = 1;i < 9;i++){
		for(j = 0;j < 9;j++){
			for(k = 0;k < 9;k++){
				if(100 * i + j * 10 + k == i * i * i + j * j * j + k * k * k) 
					printf("%d%d%d\n",i,j,k);
			}
		} 
	}
	return 0;
}

这种做法的确可以打印输出所有水仙花数,但是有一个缺点,就是比较耗费时间。在一些比赛或考试中,都是有时间限制和内存限制的,这种做法执行的时候会出现"运行超时"的错误。那我们该如何处理该问题呢?毫无疑问,优化算法!!

优化算法:

#include<stdio.h>

int main(void){
	int temp[] = {0,1,2*2*2,3*3*3,4*4*4,5*5*5,6*6*6,7*7*7,8*8*8,9*9*9};
	int a,b,c;
	
	for(int i = 100;i < 1000;i++){
		a = i / 100;
		b = (i - a * 100) / 10;
		c = i % 10;
		
		if(temp[a] + temp[b] + temp[c] == i)
			printf("%d\n",i);
	}
	
	return 0;
}

优化算法将0~9这10个数的三次方事先存放在数组里面,然后进行运算匹配,这里不需要计算三次方,因此节省时间,效率较普通算法高

第二类题目:判断一个数是否为水仙花数

#include<stdio.h>

int main(){
    int x = 1,y = 0;
    int a,c,temp,b[10];
    int i = 0;

    scanf("%d",&a);

    temp = a;

    while(a != 0){
        b[i] = a % 10;
        a = a / 10;
        i++;
    }

    c = b[0] * b[0] * b[0] + b[1] * b[1] * b[1] + b[2] * b[2] * b[2];

    if(c == temp)
        printf("%d",x);
    else
        printf("%d",y);

    return 0;
}

判断一个数是否为水仙花数,首先要将这个三位数的每一位数给拆出来,算法

  b[i] = a % 10;
  a = a / 10;

并将拆解开的每一个位数存放在一个数组内。当这三位数的每一位数的三次方等于输入的值的时候,说明该数是水仙花数,输出1,不是输出0.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

烟雨天青色

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值