40节穷举课后小明借书and水仙花数

【项目1-小明借书】

小明有五本新书,要借给A,B,C三位小朋友,若每人每次只能借一本,则可以有多少种不同的借法?
提示:本问题实际上是一个排列问题,即求从5个中取3个进行排列的方法的总数。首先对五本书从1至5进行编号,然后使用穷举的方法。假设三个人分别借这五本书中的一本,当三个人所借的书的编号都不相同时,就是满足题意的一种借阅方法。

代码:

/*小明借书*/
#include <stdio.h>
int main()
{
    int a,b,c,i=0;
    for(a=1;a<=5;a++)
        for(b=1;b<=5;b++)
        for(c=1;c<=5;c++)
    {
        if(a!=b&&b!=c&&c!=a)
        {
            i++;
            printf("%d %d %d\n",a,b,c);
        }
    }
    printf("一共有%d种借法\n",i);
    return 0;
    }
【项目2-水仙花数】
对于三位数字,若各位数字立方和等于该数,该数就是水仙花数。如153:153=13+53+33

代码:

/*水仙花数*/
#include <stdio.h>
int main()
{
    int s,q,w,e;
    for(s=100;s<1000;s++)
    {
        q=s/100;
        w=(s/10)%10;
        e=s%10;
        if(s==q*q*q+w*w*w+e*e*e)
        {
            printf("%d\n",s);
        }
    }
    return 0;
    }
这是穷举100-999的数判断是否是水仙花数,也可以穷举3个数字,再组合成一个三位数,判断和是否等于该三位数

代码:

/*水仙花数*/
#include <stdio.h>
int main()
{
    int s,q,w,e;
    for(q=1;q<=9;q++)
        for(w=0;w<=9;w++)
        for(e=0;e<=9;e++)
    {
        s=q*100+w*10+e;
        if(s==q*q*q+w*w*w+e*e*e)
            printf("%d\n",s);
    }
    return 0;
    }
现在我们拓展下思维,我们改变下题目求任意范围内所有的水仙花数

水仙花数是指一个 n 位数 ( n≥3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:1^3 + 5^3+ 3^3 = 153)

代码:

/*水仙花数*/
#include <stdio.h>
#include <math.h>
int main()
{
    int a,b,p,f,x,m,s,sum,d,g;
    sum=0;
    p=0;
    f=0;
    printf("请输入超过100的任意范围数值(如x-y):");
    scanf("%d-%d",&a,&b);
    for(x=a;x<=b;x++)
    {
        m=x;
        p=0;
        while(m>0)//求出幂的值,3位数幂=3,4位数幂=4,以此类推
        {
            s=m%10;
            m=m/10;
            p++;
        }
        m=x;
        sum=0;
        while(m>0)
        {
            s=m%10;
            d=1;
            for(g=1;g<=p;g++)//这里大家要注意,pow函数是double,会丢失数据,刚刚开始用pow的时候5的3次方被计算成了124,切记切记
                {
                    d*=s;
                    }
            sum+=d;

            m=m/10;
        }
        if(sum==x)
        {
            printf("%d\n",x);
            f++;
        }
    }
    printf("该范围一共有%d个水仙花数",f++);
    return 0;
    }
这里讲下思路分析,输入一个范围,我们首先判断当前循环的数是几位数的,即n位数那我们就要计算机求出n的值也就是我们所需要的幂的值

然后分别求了该数的每位数的n次幂的值相加   判断是否等于原数即可

这里尤其注意我们求int类型尽量不要用pow   pow的返回值是double型数据,会丢失数据





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值