例4 水仙花數 題目描述 一個三位整數(100~999),若各位數的立方和等於該數自身,則稱其為“水仙花數”(如:153=13+53+33),找出所有的這種數。 輸入格式 沒有輸入 輸出格式 若幹行,每行1個數字。 輸入樣例 無 輸出樣例 153 * * * ... * * * (輸出被和諧了) ( ...
例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;
}