C語言程序設計100例之(4):水仙花數

例4    水仙花數

題目描述ios

一個三位整數(100~999),若各位數的立方和等於該數自身,則稱其爲「水仙花數」(如:153=13+53+33),找出全部的這種數。c++

輸入格式編程

沒有輸入spa

輸出格式io

若干行,每行1個數字。stream

輸入樣例循環

程序

輸出樣例margin

153di

* * *

...

* * *

(輸出被和諧了)

      (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;

}

相關文章
相關標籤/搜索