zoukankan      html  css  js  c++  java
  • C语言程序设计100例之(4):水仙花数

    例4    水仙花数

    题目描述

    一个三位整数(100~999),若各位数的立方和等于该数自身,则称其为“水仙花数”(如:153=13+53+33),找出所有的这种数。

    输入格式

    没有输入

    输出格式

    若干行,每行1个数字。

    输入样例

    输出样例

    153

    * * *

    ...

    * * *

    (输出被和谐了)

          (1)编程思路1。

            对三位数n(n为100~999之间的整数)进行穷举。对每个枚举的n,分解出其百位a(a=n/100)、十位b(b=n/10%10)和个位c( c=n%10),若满足a*a*a+b*b*b+c*c*c== n,则n是水仙花数。

          (2)源程序1。

    #include <stdio.h>

    int main()

    {

           int n, a, b, c;        //n、a、b和c分别为三位数自身及其百位、十位和个位

           for(n=100 ;n<=999;n++)          

           {

                        a=n/100;

                        b=n/10%10;

                        c=n%10;           

                        if(a*a*a+b*b*b+c*c*c== n)

                                printf("%d ",n);

          }

         return 0;    

    }

           (3)编程思路2。

            用一个三重循环对一个3位数的百位a(a的范围为1~9)、十位b(b的范围为0~9)和个位c(c的范围为0~9)进行穷举,在循环体中,计算出3位数n(n=100*a+10*b+c),然后进行判断,若满足a*a*a+b*b*b+c*c*c== n,则n是水仙花数。

          (4)源程序2。

    #include <iostream>

    using namespace std;

    int main()

    {

         int n, a, b, c;        //n、a、b和c分别为三位数自身及其百位、十位和个位

         for(a=1 ;a<=9;a++)          

            for (b=0; b<=9;b++)

               for(c=0;c<=9;c++)                

               {

                  n=100*a+10*b+c;           

                  if(a*a*a+b*b*b+c*c*c== n)

                       printf("%d ",n);

              }

    return 0;    

    习题4

    4-1  子数整数

            本题选自洛谷题库 (https://www.luogu.org/problem/P1151)

    题目描述

    对于一个五位数a1a2a3a4a5,可将其拆分为三个子数:

    sub1=a1a2a3

    sub2=a2a3a4

    sub3=a3a4a5

    例如,五位数20207可以拆分成

    sub1=202

    sub2=020(=20)

    sub3=207

    现在给定一个正整数K,要求你编程求出10000到30000之间所有满足下述条件的五位数,条件是这些五位数的三个子数sub1 ,sub2 ,sub3都可被K整除。

    输入格式

    一个正整数K

    输出格式

    每一行为一个满足条件的五位数,要求从小到大输出。不得重复输出或遗漏。如果无解,则输出“No”。

    输入样例

    15

    输出样例

    22555

    25555

    28555

    30000

             (1)编程思路。

            本题关键是分离出一个五位数n的三个子数sub1 ,sub2 和sub3。由于sub1是n的高3位数,因此,sub1=n/100;sub2是n的中间3位数,因此,sub2=n/10%1000;sub3是n的低3位数,因此,sub3=n%1000。

             用循环for (n=10000;n<=30000;n++)对每个五位数n进行穷举判断即可。

            (2)源程序。

    #include <stdio.h>

    int main()

    {

             int i,sub1,sub2,sub3,k,f=0;

            scanf("%d",&k);

            for (i=10000;i<=30000;i++)

            {

                       sub1=i/100;

                       sub2=i/10%1000;

                       sub3=i%1000;

                       if (sub1%k==0 && sub2%k==0 && sub3%k==0)

                       {

                                printf("%d ",i);

                                f=1;

                       }

             }

             if (f==0) printf("No ");

       return 0;

    }

    4-2  4位分段和平方数

    题目描述

    一个4位自然数分为前后两个2位数,若该数等于所分两个2位数和的平方,则称为4位分段和平方数。例如,2025=(20+25)2

    编写程序求出所有4位分段和平方数。

    输入格式

    没有输入

    输出格式

    若干行,每行1个数字。

    输入样例

    输出样例

    2025

    * * *

    ...

    * * *

    (输出被和谐了)

             (1)编程思路1。

             对所有的4位整数n进行穷举,n的范围为1000~9999,共9000个数。对每个数n,分离出高两位数x(x=n/100)和低两位数y(y=n%100),然后进行判断,若满足n==(x+y)*(x+y),则n是一个4位分段和平方数。

           (2)源程序1。

    #include <stdio.h>

    int main()

    {

             int n,x,y;

             for(n=1000;n<=9999;n++)

             {

                       x=n/100;

                       y=n%100;

                       if (n==(x+y)*(x+y))

                                printf("%d ",n);

             }

        return 0;

    }

               (3)编程思路2。

             思路1的穷举次数为9000次。实际上,由于4位分段和平方数一定首先是一个平方数,因此只需要穷举4位数中的平方数即可,即穷举sqrt(1000)~sqrt(9999)之间的数a,在循环体中,先计算出4位数n=a*a,再分离出高两位数x(x=n/100)和低两位数y(y=n%100),然后进行判断,若满足a==(x+y),则n是一个4位分段和平方数。显然,这样穷举,循环次数会大为减少。

            (4)源程序2。

    #include <stdio.h>

    #include <math.h>

    int main()

    {

             int a,n,x,y;

             for(a=(int)sqrt(1000);a<=(int)sqrt(9999);a++)

             {

                       n=a*a;

                       x=n/100;

                       y=n%100;

                       if (a==x+y)

                                printf("%d ",n);

             }

        return 0;

    }

    4-3  特定的四位数

    题目描述

    有这样一些特定的四位数,它的千位数字与十位数字之和等于百位数字与个位数字之积。例如,3136,  3+3=1*6 ,故3136就是一个特定的四位数。

    输入格式

    一个正整数K(1111<=K<=9999)

    输出格式

    一个不大于K的最大的特定四位数。

    输入样例

    8000

    输出样例

    7921

           (1)编程思路。

            从k开始对四位数i进行穷举,对每个四位数i分离出千位a(a=i/1000)、百位b(b=(i-a*1000)/100)、十位c(c=(i-a*1000-b*100)/10)和个位d(d=i%10)。

          (2)源程序。

    #include<stdio.h>

    int main()

    {

       int i,k,a,b,c,d;

       scanf("%d",&k);

       for (i=k; i>=1000; i--)

       {

          a=i/1000 ;

          b=(i-a*1000)/100;

          c=(i-a*1000-b*100)/10;

          d=i%10;

          if  (a+c==b*d)

          {

              printf("%d ",i);

              break;

          }

       }

       return 0;

    }

  • 相关阅读:
    牛牛的揠苗助长(二分)
    树型DP简单入门
    Rational Ratio(一道思维题)
    Tima goes to Xentopia(条件最短路)
    中国剩余定理
    求解逆元的三种方法
    samba 基本配置及自定义控制
    vue之虚拟DOM、diff算法
    vue-cli3构建ts项目
    VMware+node+nginx+vue
  • 原文地址:https://www.cnblogs.com/cs-whut/p/11854563.html
Copyright © 2011-2022 走看看