Cc++趣味程序百例献给CC++初学者.docx
- 文档编号:7809805
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:129
- 大小:108.47KB
Cc++趣味程序百例献给CC++初学者.docx
《Cc++趣味程序百例献给CC++初学者.docx》由会员分享,可在线阅读,更多相关《Cc++趣味程序百例献给CC++初学者.docx(129页珍藏版)》请在冰豆网上搜索。
Cc++趣味程序百例献给CC++初学者
C/c++趣味程序百例(獻給C/C++初學者)
1.繪製餘弦曲線
2.繪製餘弦曲線和直線
3.繪製圓
4.歌星大獎賽
5.求最大數
6.高次方數的尾數
7.階乘尾數零的個數
8.借書方案知多少
9.楊輝三角形
10.數制轉換
11.打魚還是曬網
12.抓交通肇事犯
13.該存多少錢
14.怎樣存錢利最大
15.捕魚和分魚
16.出售金魚
17.平分七筐魚
18.有限5位數
19.8除不盡的自然數
20.一個奇異的三位數
21.4位反序數
22.求車速
23.由兩個平方三位數獲得三個平方二位數
24.阿姆斯特朗數
25.完全數
26.親密數
27.自守數
28.回文數
29.求具有abcd=(ab+cd)2性質的四位數
30.求素數
31.歌德巴赫猜想
32.可逆素數
33.回文素數
34.要發就發
35.素數幻方
36.百錢百雞問題
37.愛因斯坦的數學題
38.換分幣
39.年齡幾何
40.三色球問題
41.馬克思手稿中的數學題
42.最大公約數和最小公倍數
43.分數比較
44.分數之和
45.將真分數分解為埃及分數
46.列出真分數序列
47.計算分數的精確值
48.新娘和新郎
49.委派任務
50.誰在說謊
51.誰是竊賊
52.黑與白
53.迷語博士的難題
(1)
54.迷語博士的難題
(2)
55.哪個大夫哪天值班
56.區分旅客國籍
57.誰家孩子跑最慢
58.拉丁方陣
59.填表格
60.1~9分成1:
2:
3的三個3位數
61.1~9組成三個3位的平方數
62.由8個整數形成奇特的立方體
63.減式還原
64.乘式還原
65.乘式還原
(2)
66.除式還原
(1)
67.除式還原
(2)
68.九位累進可除數
69.魔術師的猜牌術
(1)
70.魔術師的猜牌術
(2)
71.約瑟夫問題
72.郵票組合
73.和數能表示1~23的5個正整數
74.可稱1~40磅的4塊砝碼
75.10個小孩分糖果
76.小明買書
77.波松瓦酒的分酒趣題
78.求π的近似值
79.求π的近似值
(2)
80.奇數平方的一個有趣性質
81.角谷猜想
82.四方定理
83.卡布列克常數
84.尼科徹斯定理
85.回文數的形成
86.自動發牌
87.黑白子交換
88.常勝將軍
89.搶30
90.搬山遊戲
91.人機猜數遊戲
92.人機猜數遊戲
(2)
93.漢諾塔
94.兔子產子
95.將阿拉伯數字轉換為羅馬數字
96.選美比賽
97.滿足特異條件的數列
98.八皇后問題
99.超長正整數的加法
100.數字移動
1.繪製餘弦曲線
在屏幕上用「*」顯示0~360度的餘弦函數cos(x)曲線
*問題分析與算法設計
如果在程序中使用數組,這個問題十分簡單。
但若規定不能使用數組,問題就變得不容易了。
關鍵在於餘弦曲線在0~360度的區間內,一行中要顯示兩個點,而對一般的顯示器來說,只能按行輸出,
即:
輸出第一行信息後,只能向下一行輸出,不能再返回到上一行。
為了獲得本文要求的圖形就必須在一
行中一次輸出兩個「*」。
為了同時得到餘弦函數cos(x)圖形在一行上的兩個點,考慮利用cos(x)的左右對稱性。
將屏幕的行方向定
義為x,列方向定義為y,則0~180度的圖形與180~360度的圖形是左右對稱的,若定義圖形的總寬度為62列
,計算出x行0~180度時y點的坐標m,那麼在同一行與之對稱的180~360度的y點的坐標就應為62-m。
程序
中利用反餘弦函數acos計算坐標(x,y)的對應關係。
使用這種方法編出的程序短小精煉,體現了一定的技巧。
*程序說明與註釋
#include
#include
intmain()
{
doubley;
intx,m;
for(y=1;y>=-1;y-=0.1)/*y為列方向,值從1到-1,步長為0.1*/
{
m=acos(y)*10;/*計算出y對應的弧度m,乘以10為圖形放大倍數*/
for(x=1;x printf("*");/*控制打印左側的*號*/ for(;x<62-m;x++)printf(""); printf("*\n");/*控制打印同一行中對稱的右側*號*/ } return0; } *思考題 如何實現用「*」顯示0~360度的sin(x)曲線。 在屏幕上顯示0~360度的cos(x)曲線與直線f(x)=45*(y-1)+31的迭加圖形。 其中cos(x)圖形用「*」表示, f(x)用「+」表示,在兩個圖形相交的點上則用f(x)圖形的符號。 2.繪製餘弦曲線和直線 *問題分析與算法設計 本題可以在上題的基礎上進行修改。 圖形迭加的關鍵是要在分別計算出同一行中兩個圖形的列方向點坐標 後,正確判斷相互的位置關係。 為此,可以先判斷圖形的交點,再分別控制打印兩個不同的圖形。 *程序註釋與說明 #include #include intmain() { doubley; intx,m,n,yy; for(yy=0;yy<=20;yy++)/*對於第一個y坐標進行計算並在一行中打印圖形*/ { y=0.1*yy;/*y: 屏幕行方向坐標*/ m=acos(1-y)*10;/*m: cos(x)曲線上y點對應的屏幕列坐標*/ n=45*(y-1)+31;/*n: 直線上y點對應的列坐標*/ for(x=0;x<=62;x++)/*x: 屏幕列方向坐標*/ if(x==m&&x==n)printf("+");/*直線與cos(x)相交時打印「+」*/ elseif(x==n)printf("+");/*打印不相交時的直線圖形*/ elseif(x==m||x==62-m)printf("*");/*打印不相交時的cos(x)圖形*/ elseprintf("");/*其它情況打印空格*/ printf("\n"); } return0; } *思考題 如何實現sin(x)曲線與cos(x)曲線圖形的同時顯示。 3.繪製圓 在屏幕上用「*」畫一個空心的圓 *問題分析與算法設計 打印圓可利用圖形的左右對稱性。 根據圓的方程: R*R=X*X+Y*Y 可以算出圓上每一點行和列的對應關係。 *程序說明與註釋 #include #include intmain() { doubley; intx,m; for(y=10;y>=-10;y–) { m=2.5*sqrt(100-y*y);/*計算行y對應的列坐標m,2.5是屏幕縱橫比調節係數因為屏幕的 行距大於列距,不進行調節顯示出來的將是橢圓*/ for(x=1;x<30-m;x++)printf("");/*圖形左側空白控制*/ printf("*");/*圓的左側*/ for(;x<30+m;x++)printf("");/*圖形的空心部分控制*/ printf("*\n");/*圓的右側*/ } return0; } *思考題 實現函數y=x2的圖形與圓的圖形疊加顯示 4.歌星大獎賽 在歌星大獎賽中,有10個評委為參賽的選手打分,分數為1~100分。 選手最後得分為: 去掉一個最高分和 一個最低分後其餘8個分數的平均值。 請編寫一個程序實現。 *問題分析與算法設計 這個問題的算法十分簡單,但是要注意在程序中判斷最大、最小值的變量是如何賦值的。 *程序說明與註釋 #include intmain() { intinteger,i,max,min,sum; max=-32768;/*先假設當前的最大值max為C語言整型數的最小值*/ min=32767;/*先假設當前的最小值min為C語言整型數的最大值*/ sum=0;/*將求累加和變量的初值置為0*/ for(i=1;i<=10;i++) { printf("Inputnumber%d=",i); scanf("%d",&integer);/*輸入評委的評分*/ sum+=integer;/*計算總分*/ if(integer>max)max=integer;/*通過比較篩選出其中的最高分*/ if(integer } printf("Canceledmaxscore: %d\nCanceledminscore: %d\n",max,min); printf("Averagescore: %d\n",(sum-max-min)/8);/*輸出結果*/ } *運行結果 Inputnumber1=90 Inputnumber2=91 Inputnumber3=93 Inputnumber4=94 Inputnumber5=90 Inputnumber6=99 Inputnumber7=97 Inputnumber8=92 Inputnumber9=91 Inputnumber10=95 Canceledmaxscore: 99 Canceledminscore: 90 Averagescore: 92 *思考題 題目條件不變,但考慮同時對評委評分進行裁判,即在10個評委中找出最公平(即評分最接返平均分)和最 不公平(即與平均分的差距最大)的評委,程序應該怎樣實現? 5.求最大數 問555555的約數中最大的三位數是多少? *問題分析與算法設計 根據約數的定義,對於一個整數N,除去1和它自身外,凡能整除N的數即為N的約數。 因此,最簡單的方法 是用2到N-1之間的所有數去除N,即可求出N的全部約數。 本題只要求取約數中最大的三位數,則其取值范 圍可限制在100到999之間。 *程序說明與註釋 #include intmain() { longi; intj; printf("Pleaseinputnumber: "); scanf("%ld",&i); for(j=999;j>=100;j–) if(i%j==0) { printf("Themaxfactorwith3digitsin%ldis: %d,\n",i,j); break; } } *運行結果 輸入: 555555 輸出: Themaxfactorwith3digitsin555555is: 777 6.高次方數的尾數 求13的13次方的最後三位數 *問題分析與算法設計 解本題最直接的方法是: 將13累乘13次方截取最後三位即可。 但是由於計算機所能表示的整數範圍有限,用這種「正確」的算法不可能得到正確的結果。 事實上,題目 僅要求最後三位的值,完全沒有必要求13的13次方的完整結果。 研究乘法的規律發現: 乘積的最後三位的值只與乘數和被乘數的後三位有關,與乘數和被乘數的高位無關 。 利用這一規律,可以大大簡化程序。 *程序說明與註釋 #include intmain() { inti,x,y,last=1;/*變量last保存求X的Y次方過程中的部分乘積的後三位*/ printf("InputXandY(X**Y): "); scanf("%d**%d",&x,&y); for(i=1;i<=y;i++)/*X自乘Y次*/ last=last*x%1000;/*將last乘X後對1000取模,即求積的後三位*/ printf("Thelast3digitsof%d**%dis: %d\n",x,y,last%1000);/*打印結果*/ } *運行結果 InputXandY(X**Y): 13**13 Thelast3digitsof13**13is: 253 InputXandY(X**Y): 13**20 Thelast3digitsof13**20is: 801 7.階乘尾數零的個數 100! 的尾數有多少個零? *問題分析與算法設計 可以設想: 先求出100! 的值,然後數一下末尾有多少個零。 事實上,與上題一樣,由於計算機所能表 示的整數範圍有限,這是不可能的。 為了解決這個問題,必須首先從數學上分析在100! 結果值的末尾產生零的條件。 不難看出: 一個整 數若含有一個因子5,則必然會在求100! 時產生一個零。 因此問題轉化為求1到100這100個整數中包含了多 少個因子5。 若整數N能被25整除,則N包含2個因子5;若整數N能被5整除,則N包含1個因子5。 *程序說明與註釋 #include intmain() { inta,count=0; for(a=5;a<=100;a+=5)//循環從5開始,以5的倍數為步長,考察整數 { ++count;//若為5的倍數,計數器加1 if(! (a%25))++count;//若為25的倍數,計數器再加1 } printf("Thenumberof0intheendof100! is: %d.\n",count);//打印結果 return0; } *運行結果 Thenumberof0intheendof100! is: 24. *問題進一步討論 本題的求解程序是正確的,但是存在明顯的缺點。 程序中判斷整數N包含多少個因子5的方法是與程序中的 100有關的,若題目中的100改為1000,則就要修改程序中求因子5的數目的算法了。 *思考題 修改程序中求因子5的數目的算法,使程序可以求出任意N! 的末尾有多少個零。 8.借書方案知多少 小明有五本新書,要借給A,B,C三位小朋友,若每人每次只能借一本,則可以有多少種不同的借法? *問題分析與算法設計 本問題實際上是一個排列問題,即求從5個中取3個進行排列的方法的總數。 首先對五本書從1至5進行編號 ,然後使用窮舉的方法。 假設三個人分別借這五本書中的一本,當三個人所借的書的編號都不相同時,就 是滿足題意的一種借閱方法。 *程序說明與註釋 intmain() { inta,b,c,count=0; printf("TherearediffrentmethodsforXMtodistributebooksto3readers: \n"); for(a=1;a<=5;a++)/*窮舉第一個人借5本書中的1本的全部情況*/ for(b=1;b<=5;b++)/*窮舉第二個人借5本書中的一本的全部情況*/ for(c=1;a! =b&&c<=5;c++)/*當前兩個人借不同的書時,窮舉第三個人借5本書 中的1本的全部情況*/ if(c! =a&&c! =b)/*判斷第三人與前兩個人借的書是否不同*/ printf(count%8? "%2d: %d,%d,%d": "%2d: %d,%d,%d\n",++count,a,b,c); /*打印可能的借閱方法*/ } *運行結果 TherearediffrentmethodsforXMtodistributebooksto3readers: 1: 1,2,32: 1,2,43: 1,2,54: 1,3,25: 1,3,4 6: 1,3,57: 1,4,28: 1,4,39: 1,4,510: 1,5,2 11: 1,5,312: 1,5,413: 2,1,314: 2,1,415: 2,1,5 16: 2,3,117: 2,3,418: 2,3,519: 2,4,120: 2,4,3 21: 2,4,522: 2,5,123: 2,5,324: 2,5,425: 3,1,2 26: 3,1,427: 3,1,528: 3,2,129: 3,2,430: 3,2,5 31: 3,4,132: 3,4,233: 3,4,534: 3,5,135: 3,5,2 36: 3,5,437: 4,1,238: 4,1,339: 4,1,540: 4,2,1 41: 4,2,342: 4,2,543: 4,3,144: 4,3,245: 4,3,5 46: 4,5,147: 4,5,248: 4,5,349: 5,1,250: 5,1,3 51: 5,1,452: 5,2,153: 5,2,354: 5,2,455: 5,3,1 56: 5,3,257: 5,3,458: 5,4,159: 5,4,260: 5,4,3 9.楊輝三角形 在屏幕上顯示楊輝三角形 1 11 121 1331 14641 15101051 ……………………………….. *問題分析與算法設計 楊輝三角形中的數,正是(x+y)的N次方冪展開式各項的係數。 本題作為程序設計中具有代表性的題目,求 解的方法很多,這裡僅給出一種。 從楊輝三角形的特點出發,可以總結出: 1)第N行有N+1個值(設起始行為第0行) 2)對於第N行的第J個值: (N>=2) 當J=1或J=N+1時: 其值為1 J! =1且J! =N+1時: 其值為第N-1行的第J-1個值與第N-1行第J個值 之和 將這些特點提煉成數學公式可表示為: 1x=1或x=N+1 c(x,y)= c(x-1,y-1)+c(x-1,y)其它 本程序應是根據以上遞歸的數學表達式編製的。 *程序說明與註釋 #include intmain() { inti,j,n=13; printf("N="); while(n>12) scanf("%d",&n);/*控制輸入正確的值以保證屏幕顯示的圖形正確*/ for(i=0;i<=n;i++)/*控制輸出N行*/ { for(j-0;j<24-2*i;j++)printf("");/*控制輸出第i行前面的空格*/ for(j=1;j printf("\n"); } } voidintc(intx,inty)/*求楊輝三角形中第x行第y列的值*/ { intz; if((y==1)||(y==x+1))return1;/*若為x行的第1或第x+1列,則輸出1*/ z=c(x-1,y-1)+c(x-1,y);/*否則,其值為前一行中第y-1列與第y列值之和*/ returnz; } *思考題 自行設計一種實現楊輝三角形的方法 10.數制轉換 將任一整數轉換為二進制形式 *問題分析與算法設計 將十進制整數轉換為二進制的方法很多,這裡介紹的實現方法利用了C語言能夠對位進行操作的特點。 對 於C語言來說,一個整數在計算機內就是以二進制的形式存儲的,所以沒有必要再將一個整數經過一系列 的運算轉換為二進制形式,只要將整數在內存中的二進製表示輸出即可。 *程序說明與註釋 #include voidprintb(int,int); intmain() { intx;printf("Inputnumber: "); scanf("%d",&x); printf("numberofdecimalform: %d\n",x); printf("it'sbinaryform: "); printb(x,sizeof(int)*8);/*x: 整數sizeof(int): int型在內存中所佔的字節數 sizeof(int)*8: int型對應的位數*/ putchar('\n'); } voidprintb(intx,intn) { if(n>0) { putchar('0'+((unsigned)(x&(1<<(n-1)))>>(n-1)));/*輸出第n位*/ printb(x,n-1);/*歸調用,輸出x的後n-1位*/ } } *運行結果 輸入: 8 輸出: numberofdecimalform: 8 it'sbunaryform: 0000000000001000 輸入: -8 輸出: numberofdecimalform: -8 it'sbinaryform: 111111*********0 輸入: 32767 輸出: numberofdecimalform: 32767 it'sbinaryform: 0111111111111111 輸入: -32768 輸出: numberofdecimalform: -32768 it'sbinaryform: 1000000000000000 輸入: 128 輸出: numberofdecimalform: 128 it'sbinaryform: 0000000010000000 *問題的進一步討論 充分利用C語言可以對位進行操作的特點,可以編寫許多其它高級語言不便於編寫甚至根本無法編寫的程 序。 位操作是C語言的一大特點,在深入學習C語言的過程中應力求很好掌握。 程序中使用的位運算方法不是最佳的,也可以不用遞歸操作,大家可以自行對程序進行優化。 *思考題 將任意正整數轉換為四進制或八進制數 11.打魚還是曬網 中國有句俗語叫「三天打魚兩天曬網」。 某人從1990年1月1日起開始「三天打魚兩天曬網」,問這個人在 以後的某一天中是「打魚」還是「曬網」。 *問題分析與算法設計 根據題意可以將解題過程分為三步: 1)計算從1990年1月1日開始至指定日期共有多少天; 2)由於「打魚」和「曬網」的週期為5天,所以將計算出的天數用5去除; 3)根據餘數判斷他是在「打魚」還是在「曬網」; 若餘數為1,2,3,則他是在「打魚」 否則是在「曬網」 在這三步中,關鍵是第一步。 求從1990年1月1日至指定日期有多少天,要判斷經歷年份中是否有閏年,二 月為29天,平年為28天。 閏年的方法可以用偽語句描述如下: 如果((年能被4除盡且不能被100除盡)或能被400除盡) 則該年是閏年; 否則不是閏年。 C語言中判斷能否整
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Cc 趣味 程序 献给 初学者
![提示](https://static.bdocx.com/images/bang_tan.gif)