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",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",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\n",i);

                            f=1;

                   }

         }

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

   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",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",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\n",i);

          break;

      }

   }

   return 0;

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM