曾經(jīng)愛因斯坦出了一道這樣的數(shù)學(xué)題:有一條長階梯,若每步跨2階,則后剩1階,若每步跨3階,則后剩2階,若每步跨5階,則后剩4階,若每步跨6階則后剩5階。只有每次跨7階,后才正好一階不剩。請問在 1~N 內(nèi),有多少個數(shù)能滿足?
針對于這個愛因斯坦的數(shù)學(xué)問題,那么我們用編程知識來如何解決它?下面酷叮貓來給您分析一下:
首先來問題分析,假設(shè)用變量x表示階梯數(shù),則x 應(yīng)滿足:
若每步跨2階,則后剩1階 -- x%2=1;
若每步跨3階,則后剩2階 -- x%3=2;
若每步跨5階,則后剩4階 -- x%5=4;
若每步跨6階,則后剩5階 -- x%6=5;
每次跨7階,后一階不剩 -- x%7=0。
因此,階梯數(shù)應(yīng)該同時滿足上面的所有條件。
那么,用編程該怎么做出來呢?
該問題要求輸入N值,求解出在的范圍內(nèi)存在多少個滿足要求的階梯數(shù)。在算法設(shè)計中,使用while循環(huán)以允許重復(fù)讀入多個N值。聲明一個變量假設(shè)為flag,利用語句 while(flag){循環(huán)體} 來進(jìn)行控制,當(dāng)flag的值為1時可以接著輸入,若為0則結(jié)束循環(huán)。
對每一次讀入的N值,都要判斷在 1~N 的范圍內(nèi)存在的滿足要求的階梯數(shù)個數(shù)。判斷時可采用for循環(huán),循環(huán)變量設(shè)為i,由題意,i的初值從7開始取即可,for循環(huán)的循環(huán)條件為 i。for語句的循環(huán)體中使用問題分析中列出的5個條件來檢驗每一個i值,能夠滿足所有5個條件的i值即為所求的階梯數(shù)。
下面是完整的代碼:
#include
int main()
{
long n, sum, i;
int flag=1;
while(flag)
{
printf("輸入N:");
scanf("%ld", &n);
printf("在1-%ld之間的階梯數(shù)為: ", n);
sum=0;
for( i=7; i<=n; i++ )
if( i%7 == 0 )
if( i%6 == 5 )
if( i%5 == 4 )
if( i%3 == 2 )
{
sum++;
printf("%ld ", i);
}
printf("在1-%ld之間,有%ld個數(shù)可以滿足愛因斯坦對階梯的要求。 ", n, sum);
printf("繼續(xù)請輸入1,否則輸入0: ");
scanf("%d", &flag);
}
return 0;
}
運行結(jié)果:
輸入N:123
在1-123之間的階梯數(shù)為:
119
在1-123之間,有1個數(shù)可以滿足愛因斯坦對階梯的要求。
繼續(xù)請輸入1,否則輸入0:
1
輸入N:1234
在1-1234之間的階梯數(shù)為:
119
329
539
749
959
1169
在1-1234之間,有6個數(shù)可以滿足愛因斯坦對階梯的要求。