题目描述:
设有一个3位数,它的百位数、十位数、个位数的立方和正好等于这个3位数,如153=1+125+27。 编写函数,返回小于等于传入参数n且满足该条件的三位数(称为水仙花数)的个数。 (指定函数原型:int find(int n)) 输入输出格式要求: 编写函数int find(int n); 返回值要求:如果传入参数n不是三位数或者在该范围内没有找到,则find返回0, 否则返回找到的水仙花数的个数。 注意:不要在find函数中打印(如调用printf或puts等函数)任何数据,否则视为错误。 例如: n为:400 find函数应返回3
参考代码:
#include<stdio.h>
int find(int n)
{
if(n<100||n>999) return 0;
int num=0,i,a,b,c;
for(i=100;i<=n;i++)
{
a=i/100;
b=i%100/10;
c=i%10;
if(a*a*a+b*b*b+c*c*c==i)
{
num++;
}
}
return num;
}
int main(){
int a;
scanf("%d",&a);
printf("%d",find(a));
return 0;
}
讲解:
题目整体偏易,从100到n(如果n在范围内)暴力枚举,每次分离出i的百位、十位、个位,求三者的立方和并进行判断。
但这里要介绍一种不按常规出牌的做法:打表。
对于水仙花数这种东西,其实他的数量早就已经确定了,我们没必要再遍历一遍判断是否是水仙花数了。根据已有经验(百度),可直接写出小于等于n的水仙花数。
下面是打表代码:
int find(int n)
{
if(n<153||n>999) return 0;
if(n<370) return 1;
if(n==370) return 2;
if(n<407) return 3;
return 4;
}
求实求真,大气大为。