原题目水仙花来自牛客
变种水仙花
题目描述
变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆分后的乘积之和等于自身,则是一个Lily Number。
例如:
655 = 6 * 55 + 65 * 5
1461 = 1461 + 1461 + 1461
求出 5位数中的所有 Lily Number。
输入描述:
无
输出描述:
一行,5位数中的所有 Lily Number,每两个数之间间隔一个空格。
第一次代码******//
错误代码
错误代码
错误代码*
#include<iostream>
using namespace std;
int fun(int n){
int a,b,c,d,e;
a=n%10;//a为个位
b=(n/10)%10;//b为十位
c=(n/100)%10;//c是百位
d=(n/1000)%10;//d是千位
e=n/10000;//e是万位
if(n==a*(b*1000+c*100+d*10+e)+(a*10+b)*(c*100+d*10+e)+(a*100+b*10+c)*(d*10+e)+(a*1000+b*100+c*10+e)*d)
return true;
else
return false;
}
int main(){
int n=11111;
for(int i=10000;i<=99999;i++){
if(fun(i))
cout<<i<<" ";
}
return 0;
}
这个代码是错的,但是想法是对的!!
思路:本题已经声明是一位五位数,那么就可以把他的万位,千位,百位,十位,个位表示出来,根据题目的要求来写出就OK了,但是由于搞乱了a,b,c,d,e的含义,代码错误,改正代码为
如下(正确的在这吖)
if(n==e*(d*1000+c*100+b*10+a)+(e*10+d)*(c*100+b*10+a)+(e*100+d*10+c)*(b*10+a)+(e*1000+d*100+c*10+b)*a)
return true;
else
return false;
从这来看,错误原因是过于长,计算就会出现问题,但是在计算中发现了一个简单的表示方式,即,把第一位,后四位,前两位,后三位,前三位,后两位,前四位,后一位分别表示出来,那样直接乘就可以了
代码如下
#include<iostream>
using namespace std;
bool fun(int n){
int a,b,c,d;
int a1,b1,c1,d1;
a=n%10;
b=n%100;
c=n%1000;
d=n%10000;
a1=n/10;
b1=n/100;
c1=n/1000;
d1=n/10000;
int m=a*a1+b*b1+c*c1+d*d1;
if(m==n)
return true;
else
return false;
}
int main(){
int n=11111;
for(int i=10000;i<=99999;i++){
if(fun(i))
{
cout<<i<<" ";
}
}
return 0;
}
这样的表示十分清晰,一目了然不容易出错。
今天接受了一个深刻的教训:认真读题!认真读题!认真读题!
在这个题中,我把一个空格看成了两个空格(咱也不知道咋看的),然后怎么样就是找不出错误,最后还是系统题提示,说是格式有问题
这才对,真哒有时有时就是因为一个标点或是不按要求,会一点也不对,并且不容易发现错在哪里!!!!
最后,重要的事情说三遍:认真读题认真读题认真读题!!!!当然,也要认真敲代码吖