变种水仙花

原题目水仙花来自牛客
变种水仙花
题目描述
变种水仙花数 - 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;
}

这样的表示十分清晰,一目了然不容易出错。
今天接受了一个深刻的教训:认真读题!认真读题!认真读题!
在这个题中,我把一个空格看成了两个空格(咱也不知道咋看的),然后怎么样就是找不出错误,最后还是系统题提示,说是格式有问题
这才对,真哒有时有时就是因为一个标点或是不按要求,会一点也不对,并且不容易发现错在哪里!!!!
最后,重要的事情说三遍:认真读题认真读题认真读题!!!!当然,也要认真敲代码吖

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值