第一篇:山科大 C語言程序設計編程精選44例
問題 1: 三個數比較大小
題目描述
從鍵盤上輸入0~100之間的三個數,按從小到大的順序輸出。
輸入
輸入只有一行,為三個整數。
輸出
按從小到大輸出這三個數。
樣例輸入 10 20 樣例輸出 15 20 提示
用if語句判斷各種情況可以解決這個問題。
解答:
#include
int a,b,c;
scanf(“%d%d%d”,&a,&b,&c);
if(a>=b)
{
if(b>=c)
printf(“%d %d %d”,c,b,a);
else
{
if(a>=c)
printf(“%d %d %d”,b,c,a);
else
printf(“%d %d %d”,b,a,c);
}
}
else
{
if(b printf(“%d %d %d”,a,b,c); else { if(a printf(“%d %d %d”,a,c,b); else printf(“%d %d %d”,c,a,b); } } } 問題 2: 輸出是m的倍數或n的倍數、但不是m和n的公倍數的數 題目描述 輸出1~k之間是m的倍數或n的倍數、但不是m和n的公倍數的數,其中1<=m,n 輸入 輸入三個整數,依次為k、m、n。 輸出 從小到大輸出符合題意的所有整數,兩數之間用一個空格分開。 樣例輸入 2 3 樣例輸出 3 4 8 9 10 14 15 提示 難點在于輸出格式的控制:空格在數的中間,學會用循環時邊界情況的特殊處理。 解答: #include a=n;else a=m;printf(“%d”,a);for(i=a+1;i<=k;i++) if(i%m==0||i%n==0) { if(i%m==0&&i%n==0) printf(“"); else printf(” %d“,i); } } 問題 3: A+B Problem 題目描述 計算a+b,0<=a,b<1000。 輸入 輸入有多對整數a和b組成,每對a和b占一行,a,b用空格分開。 輸出 每行輸出一個a+b的值,順序與輸入對應。 樣例輸入 2 10 20 樣例輸出 3 30 提示 OJ系統上測試輸入結束符為EOF(End Of File),其值為-1。用scanf()把文件所有內容讀完后,會讀到EOF,所以可以用來判斷輸入是否完成,測試時可以用Ctrl+Z產生EOF。本題解法參看FAQ。 解答: #include printf(”%dn“,a+b);} 問題 4: A+B Problem(II): Input/Output Pratice 題目描述 計算a+b,0<=a,b<1000。 輸入 輸入的第一行是一個整數N,后面有N對整數a和b,每對a和b占一行,a,b用空格分開。 輸出 每行輸出一個a+b的和,順序與輸入對應。 樣例輸入 1 2 10 20 樣例輸出 3 30 提示 N給出了測試樣例數,用for循環處理方便。 解答: #include scanf(”%d%d“,&a,&b); printf(”%dn“,a+b);} } 問題 5: A+B Problem(III): Input/Output Pratice 題目描述 計算a+b,0<=a,b<1000。 輸入 輸入有多對整數a和b組成,每對a和b占一行,a,b用空格分開。當測試樣為0 0時表示輸入結束,0 0不參與運算。 輸出 每行輸出一個a+b的值,順序與輸入對應。 樣例輸入 2 10 20 0 0 樣例輸出 30 提示 練習break的使用。 解答: #include if(a==0&&b==0) break; printf(”%dn“,a+b);} } 問題 6: A+B Problem(IV): Input/Output Pratice 題目描述 計算a+b,0<=a,b<1000。 輸入 輸入有多對整數a和b組成,每對a和b占一行,a,b用空格分開。 輸出 每行輸出一個a+b的值,順序與輸入對應。每個格式樣例之間用一個空行分隔開。 樣例輸入 2 10 20 15 35 樣例輸出 30 50 提示 由于輸出的和比空行多一個,所以全部計算放在一個循環里是不行的,必須要特殊處理開頭或者結尾。 解答: #include printf(”n%dn“,a+b);} 問題 7: n個數的最大值和最小值 問題描述 找出n個數中最大的數和最小的數,并將它們的值輸出出來。 輸入 輸入為n+1個整數,都在int類型范圍內。這些數可能用若干空格或者換行符分隔開。輸入的第1個數為n,表示后續有n個數輸入。從輸入的第2個數開始,求出直到第n+1個數中最大的數和最小的數。輸出 輸出為兩行,格式見sample。 樣例輸入 0 1-1 樣例輸出 The maximum number is 1.The minimum number is-1.提示 分隔符是空格還是回車都是空白符,對scanf(”%d“)來說沒有區別;先讀入n,然后用for循環就很容易控制讀入n個數的過程。 解答: #include scanf(”%d“,&a); if(a>max) max=a; if(a min=a;} printf(”The maximum number is %d.n“,max);printf(”The minimum number is %d.“,min);} 問題 8: 成績的等級 題目描述 把百分制的考試成績轉換成五級制的成績: 90~100:Excellent 80~89:Good 70~79:Average 60~69:Pass 0~59:Failing 不在0~100之間的輸入是非法數據,輸出“Error”。 輸入 輸入多行,每行一個整數。 輸出 輸入所對應的成績等級。 樣例輸入 -1 81 92 35 68 72 100 樣例輸出 Error Good Excellent Failing Pass Average Excellent 提示 用switch語句解決這個問題比較方便。 解答: #include if(a<0||a>100) printf(”Errorn“); else { switch(a/10) { case 0: case 1: case 2: case 3: case 4: case 5:printf(”Failingn“);break; case 6:printf(”Passn“);break; case 7:printf(”Averagen“);break; case 8:printf(”Goodn“);break; case 9: case 10:printf(”Excellentn“);break; } } } 問題 9: 只有一個二元運算符的表達式運算 題目描述 編程序讀入并計算只有一個二元運算符的表達式的值。用到的二元運算符有:“+”、“-”、“*”、“/”、“%”,與C語言的語法一致。 輸入 每行輸入一個表達式,格式為:二個整型的操作數a和b,中間用一個符號分開,這個符號就是運算符。測試樣例不存在除數為0的情況。輸入以a和b為0,且用一個空格分開結束。輸出 每行對應輸入的運算符為“+”、“-”、“*”、“/”、“%”,則計算a+b、a-b、a*b、a/b、a%b的值;否則輸出“invalid op”。 樣例輸入 33+5 8*9 2.2 1-6 17/3 9%3 0 0 樣例輸出 invalid op-5 5 0 提示 教材上有非常相似的例題可以參考。#include if(a==0&&c==' '&&b==0) goto loop; else switch(c){ case'+': printf(”%dn“,a+b); break;case'-': printf(”%dn“,a-b); break;case'*': printf(”%dn“,a*b); break;case'/': printf(”%dn“,a/b); break;case'%': printf(”%dn“,a%b); break;default: printf(”invalid opn“); } } loop: i=101;} 問題 10: 求100以內的素數 題目描述 素數是只能被1和自身整除的正整數,根據數學定義1不是素數。素數也叫質數。 輸入 輸入為兩個整數m和n,滿足0<=m<=n<=100。 輸出 從大到小輸出m~n之間的所有素數,一個素數一行。如果m~n之間沒有素數,則不輸出任何數。 輸出的所有數在兩行“=====”之間。 樣例輸入 12 樣例輸出 ===== 11 7 5 3 2 ===== 提示 利用素數的數學規律可以很容易的解出此題,題目給出的數據范圍是關鍵。 解答: #include q=0; for(i=2;i { if(j%i!=0) q++; } if(q==j-2) printf(”%dn“,j);} printf(”=====“);} 問題 11: 攝氏——華氏溫度轉換表 題目描述 已知華氏溫度F,轉換為攝氏溫度C的公式為C=(F-32)*5/9。 輸出給定范圍(從low到high)和步長(step)的攝氏——華氏溫度轉換表 輸入 第1行若為“C->F”表示輸出:攝氏——華氏溫度轉換表,若為“F->C”表示輸出:華氏——攝氏溫度轉換表。 第2、3行為兩個整數:high和low,其值在-100到200之間。第4行為step,step精確到小數點后1位。 輸出 輸出第一行為C和F,分別表示攝氏和華氏,與小數點對齊。若輸出攝氏——華氏溫度轉換表,則C在前、F在后;反之,則輸出華氏——攝氏溫度轉換表。 從輸出的第2行開始為從溫度low到溫度high(包括low和high)的轉換表,溫度輸出精確到小數點后1位,表格被“->”分為兩個寬度相同的部分,其它的測試樣例也不會給出超出寬度的數據,格式詳見sample。 樣例輸入 C->F-10 40 2.5 樣例輸出 C-> F-10.0-> 14.0-7.5-> 18.5-5.0-> 23.0-2.5-> 27.5 0.0-> 32.0 2.5-> 36.5 5.0-> 41.0 7.5-> 45.5 10.0-> 50.0 12.5-> 54.5 15.0-> 59.0 17.5-> 63.5 20.0-> 68.0 22.5-> 72.5 25.0-> 77.0 27.5-> 81.5 30.0-> 86.0 32.5-> 90.5 35.0-> 95.0 37.5-> 99.5 40.0-> 104.0 提示 輸出格式可以通過sample分析出來,因為兩欄的總寬度是固定的。一個隱藏的陷阱是step是浮點數,某些浮點數是無法精確存儲的,因此經過一定量的計算后這個誤差會影響到浮點數的相等性判斷,需要加上精度控制。 解答: #include double low,high; double step,c,f; char ch1,ch2; scanf(”%c->%c“,&ch1,&ch2); if(ch1=='C'&&ch2=='F') { scanf(”%lf%lf%lf“,&low,&high,&step); f=(double)9/5*low+32; if(low==-100||f<=-100) { printf(” C-> F“); while(low<=high+0.01) { f=low*9.0/5.0+32; printf(”n%6.1lf-> %6.1lf“,low,f); low+=step; } return 0; } printf(” C-> F“); while(low<=high+0.01) { f=low*9.0/5.0+32; printf(”n%5.1lf-> %5.1lf“,low,f); low+=step; } return 0; } else if(ch1=='F'&&ch2=='C') { scanf(”%lf%lf%lf“,&low,&high,&step); c=(low-32)*((double)5/9); if(low==-100||c<=-100) { printf(” F-> C“); while(low<=high+0.01) { c=(low-32)*5/9.0; printf(”n%6.1lf-> %6.1lf“,low,c); low+=step; } return 0; } printf(” F-> C“); while(low<=high+0.01) { c=(low-32)*5/9.0; printf(”n%5.1lf-> %5.1lf“,low,c); low+=step; } return 0; } } 問題 12: 1!+2!+…+k!=? 題目描述 求1!+2!+…+k!=?,并判斷是否溢出。 輸入 輸入為一個正整數k。 輸出 若1!+2!+…+k!的值溢出unsigned(無符號整型)的范圍輸出“overflow”,否則輸出1!+2!+…+k!的結果。 樣例輸入 樣例輸出 153 提示 如果一個值溢出某個變量的數據類型存儲范圍,但仍然存入該變量,那么存入該變量中的值實際上是什么? 解答: #include int i,j; unsigned int s,b,a;s=0; scanf(”%d“,&j); b=1; for(i=1;i<=j;i++) { a=b; b=b*i; if((double)b/a { printf(”overflown“); return 0; } s=s+b; } printf(”%un“,s); return 0;} 問題 13: 輸出整數的最低兩位 題目描述 把一個整數的最低兩位打印出來,不輸出整數的符號。 輸入 輸入為一個整數n,不會超出int類型的數據范圍。 輸出 輸出n的最低兩位數字。但是,輸入的數字本身不足兩位時,不應當補0。如,輸入為“1”,則輸出為“1”。 樣例輸入 -102 樣例輸出 02 提示 printf函數可以完成補0的操作。 解答: #include c=-a; if(c<100) printf(”%d“,c); else { b=c-100*(c/100); printf(”%.2d“,b); } } else { if(a<100) printf(”%d“,a); else { b=a-100*(a/100); printf(”%.2d“,b); } } } 問題 14: 產生等差序列之一 題目描述 根據給出的初始數、公差和序列長度求等差序列。 輸入 輸入為一行,格式見sample。其中,start為初始數,step為公差,times為序列長度。滿足,times>0,step不為0。 輸出 把這個等差序列輸出在一行里,序列兩數之間用一個空格分隔。 樣例輸入 start = 1, step = 2, times = 100 樣例輸出 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107 109 111 113 115 117 119 121 123 125 127 129 131 133 135 137 139 141 143 145 147 149 151 153 155 157 159 161 163 165 167 169 171 173 175 177 179 181 183 185 187 189 191 193 195 197 199 解答: #include st=st+s; printf(” %d“,st); } } 問題 15: 產生等差序列之二 題目描述 根據給出的初始數、公差和終止條件求等差序列。 輸入 輸入為一行,格式見sample。其中,start為初始數,step為公差,end為終止條件。滿足,step不為0,并且start和end的大小關系與step的方向一致。end不一定是序列的最后一個數。 輸出 把這個等差序列輸出在一行里,序列兩數之間用一個空格分隔。 樣例輸入 start = 1, step = 2, end = 200 樣例輸出 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107 109 111 113 115 117 119 121 123 125 127 129 131 133 135 137 139 141 143 145 147 149 151 153 155 157 159 161 163 165 167 169 171 173 175 177 179 181 183 185 187 189 191 193 195 197 199 提示 根據start和step的大小關系,判斷序列終止的條件可能不同。 解答: #include for(st=st+s;st<=end;st=st+s) printf(” %d“,st); } else { for(st=st+s;st>=end;st=st+s) printf(” %d“,st);} } 問題 16: 輾轉相除法 題目描述 輾轉相除法,也稱歐幾里得算法,是求最大公約數的算法。輾轉相除法首次出現于歐幾里得的《幾何原本》(第VII卷,命題i和ii)中,而在中國則可以追溯至東漢出現的《九章算術》。兩個整數的最大公約數(亦稱公約數)是能夠同時整除它們的最大的正整數。輾轉相除法基于如下原理:兩個整數的最大公約數等于其中較小的數和兩數的差的最大公約數。例如,252和105的最大公約數是21(252 = 21 × 12;105 = 21 × 5);因為252 ? 105 = 147,所以147和105的最大公約數也是21。在這個過程中,較大的數縮小了,所以繼續進行同樣的計算可以不斷縮小這兩個數直至其中一個變成零。這時,所剩下的還沒有變成零的數就是兩數的最大公約數。例如,計算a = 1071和b = 462的最大公約數的過程如下:從1071中不斷減去462直到小于462(可以減2次,即商q0 = 2),余數是147: 1071 = 2 × 462 + 147.然后從462中不斷減去147直到小于147(可以減3次,即q1 = 3),余數是21: 462 = 3 × 147 + 21.再從147中不斷減去21直到小于21(可以減7次,即q2 = 7),沒有余數: = 7 × 21 + 0.此時,余數是0,所以1071和462的最大公約數是21。 輸入 輸入為多行,每行有一對非負整數a,b,且a*b不會超出int類型的數據范圍。輸入至EOF結束。 輸出 每行輸出一對a,b的最大公約數和最小公倍數,順序與輸入對應。 樣例輸入 1 2 3 2 2 3 2 4 6 7 5 12 6 18 9 24 36 樣例輸出 1 1 6 2 2 1 6 2 12 1 35 6 12 9 18 12 72 提示 按照題目描述所給的算法解題,注意以下幾點:輾轉相除法對兩個數的大小關系有要求,根據倍數和約數的數學定義,一個非0數和0的約數是多少?輾轉相除法的計算過程是符合這種定義的。 解答: #include c=a*b; if(a==0&&b!=0) printf(”%d %dn“,b,a); else if(a!=0&&b==0) printf(”%d %dn“,a,b); else { while(a!=b) { if(a>b) a=a-b; if(a b=b-a; } printf(”%d %dn“,a,c/a); } } } 問題 17: Sum Problem 題目描述 計算若干整數的和,這些整數都是小于1000的非負整數。 輸入 輸入為多行,每行為一組測試樣例。每個測試樣例以一個整數N開始,后面接著是N個整數。 輸出 每組測試樣例對應一行輸出,輸出所給的N個整數之和,順序與輸入對應。 樣例輸入 1 2 3 5 10 15 20 30 50 樣例輸出 125 提示 用雙重循環解決這個問題,外層循環控制用例的輸入,內層循環控制讀取N個整數。 解答: #include s=0; for(i=1;i<=n;i++) { scanf(”%d“,&a); s=s+a; } printf(”%dn“,s);} } 問題 18: Sum Problem(II): Input/Output Pratice 題目描述 計算若干整數的和,這些整數都是小于1000的非負整數。 輸入 輸入的第一行是一個整數M,后面有M個測試樣例。每個測試樣例以一個整數N開始,后面接著是N個整數。 輸出 每組測試樣例對應一行輸出,為所給的N個整數之和,順序與輸入對應。 樣例輸入 3 1 2 3 5 10 15 20 30 50 樣例輸出 125 提示 用雙重循環解決這個問題,外層循環控制用例的輸入,內層循環控制讀取N個整數。 解答: #include scanf(”%d“,&n);{ s=0; for(i=1;i<=n;i++) { scanf(”%d“,&a); s=s+a; } } } } printf(”%dn“,s);問題 19: Sum Problem(III): Input/Output Pratice 題目描述 計算若干整數的和,這些整數都是小于1000的非負整數。 輸入 輸入為多行,每行為一組測試樣例。每個測試樣例以一個整數N開始,后面接著是N個整數。當輸入的N為0時表示輸入結束。 輸出 每組測試樣例對應一行輸出,為所給的N個整數之和,順序與輸入對應。 樣例輸入 1 2 3 5 10 15 20 30 50 0 樣例輸出 125 提示 用雙重循環解決這個問題,外層循環控制用例的輸入,內層循環控制讀取N個整數。 解答: #include { if(n==0) break; else { s=0; for(i=1;i<=n;i++) { scanf(”%d“,&a); s=s+a; } printf(”%dn“,s); } } } 問題 20: Sum Problem(IV): Input/Output Pratice 題目描述 計算若干整數的和,這些整數都是小于1000的非負整數。 輸入 輸入的第一行是一個整數M,后面有M個測試用例。每個測試用例以一個整數N開始,后面接著是N個整數。 輸出 每組測試用例對應一行輸出,為所給的N個整數之和,順序與輸入對應。兩樣例的輸出之間用一個空行分隔開。 樣例輸入 3 1 2 3 5 10 15 20 30 50 樣例輸出 6 125 提示 用雙重循環解決這個問題,外層循環控制用例的輸入,內層循環控制讀取N個整數。 解答: #include scanf(”%d“,&n);{ s=0; for(i=1;i<=n;i++) { scanf(”%d“,&a); s=s+a; } printf(”%dn“,s);} for(j=2;j<=m;j++){ scanf(”%d“,&n);{ s=0; for(i=1;i<=n;i++) { scanf(”%d“,&a); s=s+a; } printf(”n%dn“,s);} } } 問題 21: 序數的后綴 題目描述 英文中經常用阿拉伯數字加上字母后綴表示“第幾“這樣的序數詞。比如,”第10次會面“通常寫成”10th meeting“。 后綴來源于英文的序數詞:第1的英文是first,寫成”1st‘;第2的英文是second,寫成“2nd”;第3的英文是third,寫成“3rd”,第4是fourth,寫成“4th”,以后的數字都加“th”。在這里規定,所有后綴為1的數字都寫成“st”結尾,后綴為2的數字寫成“nd”結尾,后綴為3的英文寫成“rd”結尾,其他的寫成“th”結尾。 輸入 輸入為多個很小的正整數,當輸入為0時表示輸入結束。 輸出 輸出為多行,每行對應一個輸入數字的序數表示。 樣例輸入 2 3 4 5 10 11 12 13 14 0 樣例輸出 1st 2nd 3rd 4th 5th 10th 11st 12nd 13rd 14th 提示 用if語句似乎更容易些。 解答: #include if(a==0) break; else { if(a%10==1) printf(”%dstn“,a); if(a%10==2) printf(”%dndn“,a); if(a%10==3) printf(”%drdn“,a); } } } if(a%10==4||a%10==5||a%10==6||a%10==7||a%10==8||a%10==9||a%10==0)printf(”%dthn“,a);問題 22: Sequence Problem : Array Pratice 題目描述 整數序列是一串按特定順序排列的整數,整數序列的長度是序列中整數的個數,不可定義長度為負數的整數序列。 兩整數序列A、B的和定義為一個新的整數序列C,序列C的長度是A、B兩者中較長的一個,序列C的每個位置上的整數都是A、B對應位置之和。若序列A、B不等長,不妨假設A比B整數多,那么序列C中多出B的那部分整數視作A的對應位置上的整數與0相加。你的任務是計算符合某些要求的整數序列的和,這些序列中的整數都是小于1000的非負整數。 輸入 輸入為多行,直到文件末尾結束。每行第一個整數為N(N<=1000),后接一個長度為N的整數序列。 輸出 對輸入的整數序列兩兩相加:第1行和第2行相加、第3行和第4行相加……按順序輸出結果:每行輸出一個整數序列,每兩個整數之間用一個空格分隔。若序列數目不為偶數,則視作補一個長度為0的整數序列相加。 值得注意的是一個長度為0的整數序列也應該有輸出,即使沒有整數輸出,也應該占有一行,因為“每行輸出一個整數序列”。 樣例輸入 1 2 3 5 10 15 20 30 50 4 100 200 300 400 樣例輸出 11 17 23 30 50 100 200 300 400 提示 這里最少要用到一個數組來存數整數序列或整數序列的和。 解答: #include j++; if(j%2!=0) { for(i=0;i scanf(”%d“,&a[i]); } else { for(p=0;p scanf(”%d“,&b[p]); } if(j%2!=1) { if(i<=p) { for(k=0;k { if(k==0) { printf(”%d“,a[k]+b[k]); a[k]=0; b[k]=0; } else { printf(” %d“,a[k]+b[k]); a[k]=0; b[k]=0; } } printf(”n“); } else { for(k=0;k { if(k==0) { printf(”%d“,a[k]+b[k]); a[k]=0; b[k]=0; } else { printf(” %d“,a[k]+b[k]); a[k]=0; b[k]=0; } } printf(”n“); } } } if(m!=0&&j%2==1) { for(i=0;i { if(i==0) printf(”%d“,a[i]); else printf(” %d“,a[i]); } printf(”n“); } if(m==0&&j%2==1) printf(”n“);} 問題 23: Sequence Problem(II): Array Pratice 題目描述 整數序列是一串按特定順序排列的整數,整數序列的長度是序列中整數的個數,不可定義長度為負數的整數序列。 兩整數序列A、B的和定義為一個新的整數序列C,序列C的長度是A、B兩者中較長的一個,序列C的每個位置上的整數都是A、B對應位置之和。若序列A、B不等長,不妨假設A比B整數多,那么序列C中多出B的那部分整數視作A的對應位置上的整數與0相加。你的任務是計算符合某些要求的整數序列的和,這些序列中的整數都是小于1000的非負整數。 輸入 輸入的第一行為一個整數M(M>0),后面有M行輸入。每行輸入為不超過1000個整數的整數序列,每個整數序列的輸入均以0結束。 輸出 對輸入的整數序列兩兩相加:第1行和第2行相加、第3行和第4行相加……按順序輸出結果:每行輸出一個整數序列,每兩個整數之間用一個空格分隔。若序列數目不為偶數,則視作補一個長度為0的整數序列相加。 值得注意的是一個長度為0的整數序列也應該有輸出,即使沒有整數輸出,也應該占有一行,因為“每行輸出一個整數序列”。 樣例輸入 1 2 3 0 10 15 20 30 50 0 100 200 300 400 0 樣例輸出 17 23 30 50 100 200 300 400 提示 這里最少要用到一個數組來存數整數序列或整數序列的和。一個省事的做法是把數組定義的稍微大一點,因為有時你的程序可能會邊界處理的不是太好。 解答: #include int i,j,x,y,q;y=0; scanf(”%d“,&x); if(x%2==0) { for(q=0;q { int a[2000]={0},b[2000]={0},c[2000]={0}; for(j=0;scanf(”%d“,&a[j]);j++) { if(a[j]==0) break; } for(i=0;scanf(”%d“,&b[i]);i++) { if(b[i]==0) break; } if(i>j) j=i; i=0; while(i { if(i==0) printf(”%d“,a[0]+b[0]); else printf(” %d“,a[i]+b[i]); i++; } printf(”n“); } } else { for(q=0;q<(x+1)/2;q++) { int a[2000]={0},b[2000]={0},c[2000]={0}; j=0; y=y+2; if(x+2-y>1) { for(j;scanf(”%d“,&a[j]);j++) { if(a[j]==0) break; } for(i=0;scanf(”%d“,&b[i]);i++) { if(b[i]==0) break; } if(i>j) j=i; i=0; while(i { if(i==0) printf(”%d“,a[0]+b[0]); else printf(” %d“,a[i]+b[i]); i++; } printf(”n“); } } } } else { for(j=0;scanf(”%d“,&a[j]);j++){ if(a[j]==0) break;} i=0;while(i printf(”%d“,a[0]);else printf(” %d“,a[i]);i++;} printf(”n“);} 問題 24: Sequence Problem(III): Array Pratice 題目描述 整數序列是一串按特定順序排列的整數,整數序列的長度是序列中整數的個數,不可定義長度為負數的整數序列。 兩整數序列A、B的和定義為一個新的整數序列C,序列C的長度是A、B兩者中較長的一個,序列C的每個位置上的整數都是A、B對應位置之和。若序列A、B不等長,不妨假設A比B整數多,那么序列C中多出B的那部分整數視作A的對應位置上的整數與0相加。你的任務是計算符合某些要求的整數序列的和,這些序列中的整數都是小于1000的非負整數。 輸入 輸入的第一行為一個整數M(M>0),后面有M行輸入。每行第一個整數為N(N<=1000),后接一個長度為N的整數序列。 輸出 對輸入的整數序列兩兩相加:第1行和第2行相加、第2行和第3行相加……按順序輸出結果:每行輸出一個整數序列,每兩個整數之間用一個空格分隔。若最后序列不足兩個,則視作補一個長度為0的整數序列相加。 值得注意的是一個長度為0的整數序列也應該有輸出,即使沒有整數輸出,也應該占有一行,因為“每行輸出一個整數序列”。樣例輸入 3 1 2 3 5 10 15 20 30 50 4 100 200 300 400 樣例輸出 17 23 30 50 110 215 320 430 50 100 200 300 400 提示 這里最少要用到兩個數組來存儲整數序列。 解答: #include if(i%2!=0) { scanf(”%d“,&y); for(j=0;j scanf(”%d“,&a[j]); if(i!=1) { if(y>p) x=y; else x=p; if(x==0) printf(”n“); else { j=0; while(j { if(j==0) printf(”%d“,a[j]+b[j]); else printf(” %d“,a[j]+b[j]); b[j]=0; j++; } printf(”n“); } } if(q==1&&q!=1) { if(y==0) printf(”n“); else { for(j=0;j { if(j==0) printf(”%d“,a[j]); else printf(” %d“,a[j]); } } } if(i==q) { for(j=0;j { if(j==0) printf(”%d“,a[j]); else printf(” %d“,a[j]); } printf(”n“); } } else { scanf(”%d“,&p); for(j=0;j scanf(”%d“,&b[j]); if(y>p) x=y; else x=p; if(x==0) printf(”n“); else { j=0; while(j { if(j==0) printf(”%d“,a[j]+b[j]); else printf(” %d“,a[j]+b[j]); a[j]=0; j++; } printf(”n“); } } } if(i==q){ j=0; while(j { if(j==0) printf(”%d“,b[j]); else printf(” %d“,b[j]); j++; } printf(”n“);} } 問題 25: Matrix Problem : Array Pratice 題目描述 求一個m×n階矩陣A的轉置矩陣AT。矩陣A的每個元素都在int類型的范圍之內。 輸入 輸入的第一行為一個整數M(M>0),后面有M組輸入數據。每組數據以兩個正整數m和n開始,滿足0 輸出 輸出為多組,每組輸出A的轉置矩陣AT。矩陣的輸出為:每行兩個元素之間用一個空格分開,每行最后一個元素之后為一個換行,在下一行開始輸出矩陣的下一行。每兩組輸出之間用一個空行分隔開。 樣例輸入 3 3 1 2 3 4 5 6 7 8 9 樣例輸出 1 4 7 2 5 8 3 6 9 提示 二維數組存儲矩陣。 解答: #include scanf(”%d%d“,&m,&n);for(i=0;i for(j=0;j scanf(”%d“,&a[i][j]);for(i=0;i for(j=0;j printf(”%d “,a[j][i]); printf(”%d“,a[m-1][i]); printf(”n“);} for(k=1;k scanf(”%d%d“,&m,&n); for(i=0;i for(j=0;j scanf(”%d“,&a[i][j]); printf(”n“); for(i=0;i { for(j=0;j printf(”%d “,a[j][i]); printf(”%d“,a[m-1][i]); printf(”n“); } } } 問題 26: Matrix Problem(II): Array Pratice 題目描述 求兩個矩陣A、B的和。根據矩陣加法的定義,只有同階的矩陣才能相加。可以確保所有運算結果都在int類型的范圍之內。 輸入 輸入數據為多個矩陣,每個矩陣以兩個正整數m和n開始,滿足0 輸出 對輸入的矩陣兩兩相加:第1個和第2個相加、第3個和第4個相加……按順序輸出矩陣相加的結果:每行兩個元素之間用一個空格分開,每行最后一個元素之后為一個換行,在下一行開始輸出矩陣的下一行。 若輸入的矩陣不為偶數個,最后剩余的矩陣不產生任何輸出。 不滿足矩陣加法定義的數據輸出“Not satisfied the definition of matrix addition!” 每兩組輸出之間用一個空行分隔開。 樣例輸入 3 1 2 3 4 5 6 7 8 9 3 3 9 8 7 6 5 4 3 2 1 3 3 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 1 1 0 0 0 樣例輸出 10 10 10 10 10 10 10 10 Not satisfied the definition of matrix addition!提示 矩陣的加法就是對應位置上的元素相加。 解答: #include for(i=0;;i++) { int a[200][200]={0},b[200][200]={0}; scanf(”%d%d“,&m,&n); if(m==0&&n==0) break; else { for(j=0;j for(k=0;k scanf(”%d“,&a[j][k]); } for(;scanf(”%d%d“,&e,&f)!=EOF;) { x=2; y=y+1; for(j=0;j for(k=0;k scanf(”%d“,&b[j][k]); break; } if(e==0&&f==0) break; if(y!=2) printf(”n“); } } if(x==2){ if(m!=e||n!=f){ printf(”Not satisfied the definition of matrix addition!“); printf(”n“);} else { j=0;while(j k=0; while(k { if(k==0) printf(”%d“,a[j][k]+b[j][k]); else printf(” %d“,a[j][k]+b[j][k]); k++; } if(j printf(”n“); j++;} printf(”n“);} } 問題 27: Matrix Problem(III): Array Pratice 題目描述 求兩個矩陣A、B的乘積C=AB。根據矩陣乘法的定義,只有A的列數和B的行數相同才能相乘。可以確保所有運算結果都在int類型的范圍之內。 輸入 輸入數據為多個矩陣(最少2個),每個矩陣以兩個正整數m和n開始,滿足0 輸出 對輸入的矩陣兩兩相乘:第1個和第2個相乘、第1個和第2個相乘的結果和第3個相乘……按順序輸出矩陣相乘的結果:每行兩個元素之間用一個空格分開,每行最后一個元素之后為一個換行,在下一行開始輸出矩陣的下一行。 若前k個矩陣相乘的結果和第k+1個矩陣無法相乘(即不滿足矩陣乘法定義),則輸出“Not satisfied the definition of matrix multiplication!”。然后用第k+1個矩陣去和第k+2個矩陣相乘。最后一個矩陣只做乘數。 每兩組輸出之間用一個空行分隔開。 樣例輸入 3 1 1 1 1 1 1 3 3 1 2 3 4 5 6 7 8 9 3 1 0 0 0 0 0 樣例輸出 15 18 12 15 18 0 0 提示 矩陣的乘法就是一行乘以一列加起來做一個元素。 解答: #include int m,n,i,j,p,k,c,d,o,q; int a[100][100]={0},b[100][100]={0},e[100][100]={0}; for(k=1;;k++) { if(k==1&&k%2==1) { scanf(”%d“,&m); scanf(”%d“,&n); } else if(k%2==0) { scanf(”%d“,&m); scanf(”%d“,&n); } if(m==0&&n==0) return 0; else { if(k==1) { i=0; while(i { j=0; while(j { scanf(”%d“,&a[i][j]); j++; } i++; } } else if((k>1)&&(k%2!=0)) { for(i=0;i for(j=0;j a[i][j]=e[i][j]; } else { for(p=0;p for(q=0;q scanf(”%d“,&b[p][q]); if(j==p) { for(c=0;c { d=0; while(d { e[c][d]=0; for(o=0;o e[c][d]+=a[c][o]*b[o][d]; d++; } } for(c=0;c { for(d=0;d { if(d==0) printf(”%d“,e[c][d]); else printf(” %d“,e[c][d]); } printf(”n“); } } else { printf(”Not satisfied the definition of matrix multiplication!n“); for(c=0;c for(d=0;d e[c][d]=b[c][d]; } } } if(k%2==0) printf(”n“); } } 問題 28: 十進制整數轉二進制 題目描述 給出一個十進制的非負整數x,x<=216,把它轉換成二進制數輸出。 輸入 輸入為多行,每行一個整數x,至讀入EOF結束。 輸出 每行輸出x對應的二進制數值。 樣例輸入 0 1 3 33 65535 樣例輸出 0 1 11 100001 ***1 提示 本題有多種解法:可以用循環迭代對2的除法和取余操作,不過處理的順序與輸出順序相反,需要利用數組存儲;用取對數或從大到小減去2的整數次冪的方法計算與輸出順序是相同的;也可以用printf()把十進制的數值處理成十六進制,然后1位十六進制轉4位二進制;也可以用位運算處理。 解答: #include if(x==0) printf(”%dn“,x); else { i=0; int a[100]={0}; for(;x!=0;) { y=x%2; x=x/2; a[i]=y; i++; } for(j=i-1;j>=0;j--) printf(”%d“,a[j]); printf(”n“); } } } 問題 29: 魔方陣 題目描述 所謂N階魔方陣,是一個N*N的方陣,其元素由1到N^2組成,且方陣每行每列以及對角線的元素和相等。如三階魔方陣: 8 1 6 3 5 7 4 9 2 魔方陣的規律如下: 從1~N*N的 各個數依次如下規則存放:(1)1在第一行中間一列; (2)每一個數存放的行比前一個數的行數減一,列數加一(如上的三階方陣5在4的上一行,后一列); (3)如果上一個數在第一行,則下一個數在最后一行,列數加一;(4)如果上一個數在最后一列,則下一個數在第一列,行數減一; (5)如果按上述規則確定的位置已經有數,或上一個數在第一行第N列,則下一個數放在上一個數的正下方。 輸入 輸入包含多組數據,每組為一個小于100的正奇數。 輸出 對于每個輸入的N,輸出N階魔方陣;兩組數據之間用一個空行分隔。方陣中每行每兩個數之間有一個空格,行首和行末沒有多余的空格。 樣例輸入 樣例輸出 1 6 3 5 7 4 9 2 解答: #include sqrt[row][col]=i; temp_row=row; temp_col=col; if(row==1&&col==n) row++; else { row--; col++; if(row==0) row=n; if(col>n) col=1; if(sqrt[row][col]!=0) { row=temp_row+1; col=temp_col; if(row>n) row=1; } } } j=1;while(j<=n){ k=1; while(k<=n) { if(k%n==0) printf(”%dn“,sqrt[j][k]); else printf(”%d “,sqrt[j][k]);k++; } j++;} for(;scanf(”%d“,&n)!=-1;){ printf(”n“);int sqrt[100][100]={0};col=(n+1)/2;for(i=1;i<=n*n;i++){ sqrt[row][col]=i; temp_row=row; temp_col=col; if(row==1&&col==n) { row++; } else { row--; col++; if(row==0) row=n; if(col>n) col=1; if(sqrt[row][col]!=0) { row=temp_row+1; col=temp_col; if(row>n) row=1; } } } j=1;while(j<=n){ k=1; while(k<=n) { if(k%n==0) printf(”%dn“,sqrt[j][k]); else printf(”%d “,sqrt[j][k]);k++; } j++;} } } 問題 30: 兔子的繁殖問題 題目描述 假設一對兔子每月能生一對小兔(一雌一雄),每對小兔出生后的下一個月是沒有繁殖能力的,至出生后的第三個月開始又可以每月生一隊小兔,問從一對剛出生的小兔開始,經過若干個月后一共有多少兔子(假設在此過程中兔子沒有死亡)? 這個問題是意大利數學家菲波那契(Fibonacci)在他1202年出版的《算盤全書》中提出來的,從第一對剛出生的小兔開始每月的兔子數被乘坐菲波那契序列。 輸入 輸入的第一個數為n,接下來有n個數字。每個數字為一個月份m(m<=45)。 輸出 輸出為n行,每行為第m個月后的兔子總數。 樣例輸入 1 2 3 4 5 10 樣例輸出 2 3 5 8 89 提示 可以先計算出菲波那契序列并存儲下來,然后查詢出每月兔子數。 解答: #include a[i]=a[i-1]+a[i-2]; i++;} scanf(”%d“,&x); for(i=1;i<=x;i++){ scanf(”%d“,&n); b[i]=a[n];} for(i=1;i<=x;i++) printf(”%dn“,b[i]);} 問題 31: 簡單的整數排序 題目描述 對給出的若干整數按從小到大排序。 輸入 輸入的第一個數為n(n<=1000),后接n個整數。 輸出 按從小到大的順序輸出這些整數,每兩個整數之間用一個空格分隔開,最后一個整數后面沒有空格。 樣例輸入 3 9 1 5 2 8 5 6 7 3 樣例輸出 2 3 3 5 5 6 7 8 9 提示 排序前必須把所有的整數都存儲下來。因為只有最多1000個數,1秒的時間足夠任何排序算法運行處結果來。 解答: /*本題使用插入排序*/ #include scanf(”%d",&a[i]);for(j=1;j p=0; while(p { if(a[p]>a[j]) break; else p++; } m=a[j]; for(i=j;i>p;i--) a[i]=a[i-1]; a[p]=m; } C語言程序設計習題(編程類) 1、從鍵盤輸入任意的字符,按下列規則進行分類計數。 第一類 '0','1','2','3','4','5','6','7','8','9' 第二類 '+','-','*','/','%','=' 第三類 其它字符 當輸入字符''時先計數,然后停止接收輸入,打印計數的結果。參考答案: #include class1=class2=class3=0; /* 初始化分類計數器 */ do { ch=getch(); switch(ch){ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': class1++; break; /* 對分類1計數 */ case '+': case '-': case '*': case '/': case '%': case '=': class2++; break; /* 對分類2計數 */ default: class3++; break; /* 對分類3計數 */ } }while(ch!= ''); /* 字符''在C程序中要使用轉義符'' */ printf(“class1=%d, class2=%d, class3=%dn”, class1, class2, class3); } 2、從鍵盤輸入十個整數,用插入法對輸入的數據按照從小到大的順序進行排序,將排序后的結果輸出。參考答案: void main(){ int i,j,num,a[10]; for(i=0;i<10;i++){ printf(“Enter No.%d:”, i+1); scanf(“%d”,&num); for(j=i-1;j>=0&&a[j]>num;j--)a[j+1]=a[j]; a[j+1]=num; } for(i=0;i<10;i++)printf(“No.%d=%dn”, i+1, a[i]); } 3、輸入一個正整數,要求以相反的順序輸出該數。例如輸入12345,輸出位54321。參考答案: void main(){ int n; printf(“Please enter n:”); scanf(“%d”,&n); while(n>0){ printf(“%d”,n%10); n=n/10; } } 4、編寫程序,讀入一個整數N;若N為非負數,則計算N到2×N之間的整數和;若N為一個負數,則求2×N到N之間的整數和。分別利用for和while寫出兩個程序。參考答案: void main(){ int i,n; long s1=0,s2=0; printf(“Please enter N:”); scanf(“%d”,&n); if(n>=0)for(i=n;i<=2*n;i++)s1=s1+i; else for(i=n;i>=2*n;i--)s1=s1+i; i=n; if(i>=0)while(i<=2*n)s2=s2+i++; else while(i>=2*n)s2=s2+i--; printf(“Result1=%ld result2=%ldn”,s1,s2); } 5、一個自然數被8除余1,所得的商被8除也余1,再將第二次的商被8除后余7,最后得到一個商為a。又知這個自然數被17除余4,?所得的商被17除余15,最后得到一個商是a的2倍。編寫程序求這個自然數。參考答案: void main(){ int i,n,a; for(i=0; ;i++){ if(i%8==1){ n=i/8; if(n%8==1){ n=n/8; if(n%8==7)a=n/8; } } if(i%17==4){ n=i/17; if(n%17==15)n=n/17; } if(2*a==n){ printf(“result=%dn”,i); break; } } } 6、編寫程序,輸出用一元人民幣兌換成1分、2分和5分硬幣的不同兌換方法。參考答案: void main(){ int f1,f2,f5,count=0; for(f5=0;f5<=20;f5++)for(f2=0;f2<=(100-f5*5)/2;f2++){ f1=100-f5*5-f2*2; if(f5*5+f2*2+f1==100)printf(“No.%2d >> 5: %4d 2: %2d 1: %2dn”,++count,f5,f2,f1); } } 7、將一個數的數碼倒過來所得到的新數叫原數的反序數。如果一個數等于它的反序數,則稱它為對稱數。求不超過1993的最大的二進制的對稱數。參考答案: void main(){ int i,j,n,k,a[16]={0}; for(i=1;i<=1993;i++){ n=i;k=0; while(n>0)/* 將十進制數轉變為二進制數 */ { a[k++]=n%2; n=n/2; } for(j=0;j 8、十個小孩圍成一圈分糖果,老師分給第一個小孩10塊,第二個小孩2塊,第三個小孩8塊,第四個小孩22塊,第五個小孩16塊,第六個小孩4塊,第七個小孩10塊,第八個小孩6塊,第九個小孩14 塊,第十個小孩20塊。然后所有的小孩同時將自己手中的糖分一半給右邊的小孩;糖塊數為奇數的人可向老師要一塊。問經過這樣幾次調整后大家手中的糖的塊數都一樣?每人各有多少塊糖? 參考答案: void main(){ int i,count=0,a[11]={0,10,2,8,22,16,4,10,6,14,20}; while(1){ for(i=1;i<=10;i++)a[i-1]=a[i-1]/2+a[i]/2; a[10]=a[10]/2+a[0]; for(i=1;i<=10;i++)if(a[i]%2==1)a[i]++; for(i=1;i<10;i++)if(a[i]!=a[i+1])break; if(i==10)break; else { a[0]=0; count++; } } printf(“count=%d number=%dn”,count,a[1]); } 9、輸入5×5的數組,編寫程序實現:(1)求出對角線上各元素的和; (2)求出對角線上行、列下標均為偶數的各元素的積;(3)找出對角線上其值最大的元素和它在數組中的位置。參考答案: void main(){ int i,j,s1=0,s2=1,a[5][5]; for(i=0;i<5;i++)for(j=0;j<5;j++){ printf(“%d %d: ”,i,j); scanf(“%d”,&a[i][j]); } for(i=0;i<5;i++){ for(j=0;j<5;j++)printf(“%5d”,a[i][j]); printf(“n”); } j=0; for(i=0;i<5;i++){ s1=s1+a[i][i]; if(i%2==0)s2=s2*a[i][i]; if(a[i][i]>a[j][j])j=i; } printf(“SUN=%dnACCOM=%dna[%d]=%dn”,s1,s2,j,a[j][j]); } 10、編寫程序,以字符形式輸入一個十六進制數,將其變換為一個十進制整數后輸出。參考答案: #include “stdio.h” void main(){ int i,n=0,a[4]={0}; printf(“Please enter a digit:”); for(i=0;i<4 &&(a[i]=getchar())!='n';i++); for(i=0;i<4;i++)if(a[i]>=48&&a[i]<=57)a[i]=a[i]-48; else if(a[i]>=65&&a[i]<=69)a[i]=a[i]-55; else if(a[i]>=97&&a[i]<=102)a[i]=a[i]-87; else printf(“input Error!”); for(i=0;i<4;i++)n=n*16+a[i]; printf(“%d”,n); } 11、編寫程序,輸入一個十進制整數,將其變換為二進制后儲存在一個字符數組中。參考答案: void main(){ int i,n,k=16,a[16]={0}; printf(“Please enter a digit:”); scanf(“%d”,&n); while(n>0)/* 將十進制數轉變為二進制數 */ { a[--k]=n%2; n=n/2; } for(i=0;i<16;i++)printf(“%2d”,a[i]); } 12、對數組A中的N(0<N<100=個整數從小到大進行連續編號,輸出各個元素的編號。要求不能改變數組A中元素的順序,且相同的整數要具有相同的編號。例如數組是:A=(5,3,4,7,3,5,6)則輸出為:(3,1,2,5,1,3,4)參考答案: void main(){ int i,j,k,n,m=1,r=1,a[2][100]={0}; printf(“Please enter n:”); scanf(“%d”,&n); for(i=0;i for(j=i;j 13、求這樣一個三位數,該三位數等于其每位數字的階乘之和。 即: abc = a!+ b!+ c!參考答案: void main(){ int a[5],i,t,k; for(i=100;i<1000;i++){ for(t=0,k=1000;k>=10;t++){ a[t]=(i%k)/(k/10); k/=10; } if(f(a[0])+f(a[1])+f(a[2])==i)printf(“%d ”,i); } } f(m)int m; { int i=0,t=1; while(++i<=m)t*=i; return(t); } 14、編寫一個函數實現將字符串str1和字符串str2合并,合并后的字符串按其ASCII碼值從小到大進行排序,相同的字符在新字符串中只出現一次。參考答案: #include “string.h” strcmbn(a,b,c)/* 數組合并函數:將數組a、b合并到 */ char a[],b[],c[]; { char tmp; int i,j,k,m,n; m=strlen(a); n=strlen(b); for(i=0;i tmp=a[i]; a[i]=a[k]; a[k]=tmp; } for(i=0;i tmp=b[i]; b[i]=b[k]; b[k]=tmp; } i=0;j=0;k=0; while(i第二篇:C語言程序設計習題試題(編程題)