c語(yǔ)言經(jīng)典算法_第1頁(yè)
c語(yǔ)言經(jīng)典算法_第2頁(yè)
c語(yǔ)言經(jīng)典算法_第3頁(yè)
c語(yǔ)言經(jīng)典算法_第4頁(yè)
c語(yǔ)言經(jīng)典算法_第5頁(yè)
已閱讀5頁(yè),還剩124頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、PAGE PAGE 129目 錄第一章 數(shù)值處理1.1 19頭牛11.2 分錢(qián)11.3 兒子做題11.4 樂(lè)隊(duì)人數(shù)21.5 靶子趣談21.6 里程碑31.7 位等差41.8 歲數(shù)51.9 打碎的雞蛋61.10 分糖71.11 獎(jiǎng)牌71.12 同等遺產(chǎn)81.13 菜票問(wèn)題81.14 出售金魚(yú)91.15 取蘋(píng)果101.16 狐貍追兔101.17 報(bào)數(shù)111.18 娶公主121.19 遞增牛群121.20 徒子徒孫13第二章 圖形輸出2.1 左旋方陣 152.2 旋方陣 162.3 螺陣 182.4 蛇陣212.5 對(duì)角矩陣 222.6 魔方陣 242.7 倒三角 252.8 函數(shù)曲線 272.9

2、菱形1 292.10 菱形2 302.11 楊輝三角302.12 字母矩形322.13 字母菱形34第三章 數(shù)據(jù)處理3.1 勾股數(shù)363.2 求素?cái)?shù)363.3 親密數(shù)363.4 三非零數(shù)373.5 平方和373.6 數(shù)目平方383.7 四方定理393.8 求最值403.9 數(shù)字反序403.10 數(shù)值1403.11 數(shù)值問(wèn)題413.12 十進(jìn)制轉(zhuǎn)為二進(jìn)制423.13 十六進(jìn)制轉(zhuǎn)為十進(jìn)制423.14 進(jìn)制 2433.15 尾零個(gè)數(shù)443.16 求7的34次方 453.17 印度國(guó)王453.18 找最值463.19 連續(xù)合數(shù)473.20 特殊數(shù)列473.21 同和偶數(shù)483.22 環(huán)狀素?cái)?shù)493.2

3、3 回文素?cái)?shù)對(duì)503.24 求雙百513.25 素?cái)?shù)算式523.26 外圍之和53第四章 過(guò)程模擬544.1 稱(chēng)小球544.2 字符滑落564.3 抽獎(jiǎng)564.4 選舉574.5 算術(shù) 1584.6 算術(shù) 2594.7 分牌604.8 八皇后634.9 擺棋子664.10過(guò)河 694.11 走迷宮71第五章 算式求值 755.1 整數(shù)相減765.2 大數(shù)相減775.3 實(shí)數(shù)之和785.4 大數(shù)相加805.5 括號(hào)配對(duì)815.6 大、中、小括號(hào)配對(duì)835.7 數(shù)字重組835.8 計(jì)算 1855.9 優(yōu)先級(jí)855.10 計(jì)算 2865.11 計(jì)算器885.12 化簡(jiǎn)90第六章 文件、字符、指針處理

4、6.1 自定義TYPE 926.2 記錄排名926.3 記錄排序946.4 排名次956.5 自定義COMP976.6 自定義COPY 986.7 統(tǒng)計(jì)字母996.8 統(tǒng)計(jì)行數(shù)單詞996.9 語(yǔ)法檢查1006.10 長(zhǎng)度個(gè)數(shù)1016.11 統(tǒng)計(jì)單詞1026.12細(xì)胞數(shù)目1036.13最長(zhǎng)路徑106第七章 數(shù)字組合1087.1 特殊矩陣 1087.2 對(duì)角線和 1097.3 矩陣鞍點(diǎn) 1107.4 特殊三角形 1117.5 古詩(shī)算式 1117.6 填數(shù) 2 113第一章 數(shù)值處理1.1 有一個(gè)老人在臨死前把三個(gè)兒子叫到跟前,告訴他們把19頭牛分了,老大分1/2,老二分1/4,老三分1/5,說(shuō)完就

5、死了.按當(dāng)?shù)亓?xí)俗,不能宰牛.問(wèn)三個(gè)兒子各能分多少?(19頭牛.c) (答案:10,5,4) 分析:由于19與2、4、5都不能整除,所以就不能用平常的方法來(lái)解決這個(gè) 問(wèn)題。但是,如果仔細(xì)一點(diǎn)就可以發(fā)覺(jué)到:1/2+1/4+1/5=19/20,而牛的數(shù)量剛 好為19。由此,就不難得出該問(wèn)題的解決辦法: main() int i; for(i=1;i=10;i+) if(i+i/2+2*i/5=19) printf(三個(gè)兒子分別分%d頭,%d頭和%d頭.n,i,i/2,2*i/5); getch(); 1.2 一元錢(qián)分成1分、2分、5分的,問(wèn)有多少種分法?(分錢(qián).c) (答案:541種.) main(

6、) int i,j,sum=0; for (i=0;i=20;i+) /*變量i為5分錢(qián)的數(shù)量*/ for (j=0;j=(100-5*i)/2;j+) /*變量j為2分錢(qián)的數(shù)量,其余的就為一分錢(qián)*/ sum+; printf(共有%d種分法.,sum); getch(); =#include int main()int f;int t;int count=0;for(f = 0 ; f = 20 ; f+)for(t = 0 ; t = 50 ; t+)if(f * 5 + t * 2 = 100)count+;printf(%dn,count);return 0;=1.3 父親對(duì)兒子說(shuō):做

7、對(duì)一道題給8分,做錯(cuò)一道題扣5分.做完26題后,兒子得0分,問(wèn)兒子做對(duì)了幾題?(兒子做題.c) (答案10,16) #includestdio.h main() int i; for(i=0;i=26;i+) if (8*i-5*(26-i)=0) /*i為作對(duì)的題數(shù),26-i為作錯(cuò)的題數(shù)*/ printf(n做對(duì)了%d道題,做錯(cuò)了%d道題.,i,26-i); getch(); 1.4 在愛(ài)爾蘭守神節(jié)那天,舉行每年一度的慶祝游戲,指揮者若將樂(lè)隊(duì)排成10人、9人、8人、7人、6人、5人、4人、3人和2人時(shí),最后的一排總是缺少一個(gè)人,那些人想這個(gè)位置大概是給數(shù)月前死去的樂(lè)隊(duì)成員凱西還留著位置。指揮

8、者見(jiàn)到總?cè)币蝗藧阑鹆?,叫大家排成一列縱隊(duì)前進(jìn)。假定人數(shù)不超過(guò)7000人,那么樂(lè)隊(duì)究竟有多少人?(樂(lè)隊(duì)人數(shù).c) (答案:2519人。) main() int i,j; for (i=9;i=2;j-) /*模擬排隊(duì)過(guò)程*/if (i+1)%j!=0) break; /*不滿足條件則重新取值*/ if (j=1) /*已滿足條件*/printf(樂(lè)隊(duì)共有%d人。,i); exit(0); 1.5 戰(zhàn)士們做了一個(gè)靶子,靶子分五格,中心是39環(huán),從左起順時(shí)針是23、17、24 、16。 戰(zhàn)士小李射了若干槍?zhuān)恳淮味紦糁邪凶?,并且正好?00環(huán)。問(wèn)他打了幾槍?zhuān)棵繕?多小環(huán)?(靶子趣談.c) (答案:6

9、槍?zhuān)h(huán)數(shù)為17,17,17,17,16,16。) main() int i,j,k,l,m,n; for (i=0;i3;i+) /*打中39環(huán)的槍數(shù)*/ for (j=0;jk=4;j+) /*打中24環(huán)的槍數(shù)*/ for (k=0;=4;k+) /*打中23環(huán)的槍數(shù)*/ for (l=0;l=6;l+) /*打中17環(huán)的槍數(shù)*/ n=100-i*39-j*24-k*23-l*17; /*余下的就為16環(huán)的槍數(shù)*/ if (n%16=0)/*不用全部循環(huán),可以找最后一個(gè)變量在結(jié)果中必須滿足什么條件,令其符合即可,本例中剩余的環(huán)數(shù)就應(yīng)該被16整除,得得的數(shù)救贖16環(huán)的槍數(shù)*/ m=n/16;

10、printf(打中39環(huán)%d個(gè),24環(huán)%d個(gè),23環(huán)%d個(gè),17環(huán)%d個(gè),16環(huán)%d個(gè),共打了%d槍., i,j,k,l,m,i+j+k+l+m); exit(0); getch(); 1.6 甲、乙兩個(gè)城市有一條999公里長(zhǎng)的公路。公路旁每隔一公里豎立著一個(gè)里程碑,里程碑的半邊寫(xiě)著距甲城的距離,另半邊寫(xiě)著距乙城的距離。有位司機(jī)注意到有的里程碑上所寫(xiě)的數(shù)僅用了兩個(gè)不同的數(shù)字,例如000/999僅用了0和9,118/881僅用了1和8。算一算具有這種特征的里程碑共有多少個(gè),是什么樣的? (答案:40個(gè))分析:從題意中可知每對(duì)數(shù)僅用了兩個(gè)不同的數(shù)字,并且兩個(gè)數(shù)字之和衡等于9.并且,每對(duì)數(shù)之和也應(yīng)衡

11、等于999.解法一: 該解法利用三重循環(huán)分別求出每個(gè)數(shù)字的各位數(shù).因?yàn)槊總€(gè)數(shù)最多只用兩個(gè)不同的數(shù)字,所以每個(gè)數(shù)中至少有2個(gè)數(shù)字是相同的.再根據(jù)兩個(gè)不同數(shù)字之和衡等于9,不難得出如下求解過(guò)程:(里程碑1.c)main() int i,j,k,m,n=0; for (i=0;i=9;i+) for (j=0;j=9;j+) for (k=0;k=9;k+) if (i=j)&(9-i=k)|(i=k)&(9-i=j)|(j=k)&(9-k=i)|(i=j)&(j=k) m=i*100+j*10+k; printf(%d/%d ,m,999-m); n+; printf(n具有這種特征的里程碑共有%

12、d個(gè).,n); 解法二:仔細(xì)分析題意,可得出如下結(jié)論:假設(shè)兩個(gè)數(shù)字分別為a與b,則b=9-a; 由排列組合原理可知,由a和b所能組成的三位數(shù)對(duì)如下: aaa/bbb;aab/bba;aba/bab;abb/baa; bbb/aaa;bba/aab;bab/aba;baa/abb.其中,每一對(duì)數(shù)之和衡等于999(如:aab+bba=999),并且后四對(duì)數(shù)為前面四對(duì)數(shù)中每?jī)蓚€(gè)數(shù)的簡(jiǎn)單對(duì)調(diào)(如:aab/bbabba/aab).由此,便可得出如下求解過(guò)程:main()int i,j,k,n=0,a4; for (i=0;i5;i+) j=9-i; a0=i*111; a1=i*110+j; a2=i*

13、101+j*10; a3=1*100+j*11; for (k=0;k4;k+) printf(%d: %d/%d,+n,ak,999-ak); printf(%d: %d/%d,+n,999-ak,ak); printf(n具有這種特征的里程碑共有%d個(gè),n); 1.7 一個(gè)四位數(shù),其千位、百位、十位數(shù)字依次組成等差數(shù)列,百位上的數(shù)字是個(gè)位、千位數(shù)字的等比中項(xiàng),把該四位數(shù)的數(shù)字反序所得數(shù)與原數(shù)的和為11110。求原四位數(shù)。(位等差.c) (答案:2468或5555。) 分析:設(shè)該四位數(shù)為abcd,則由其千位、百位、十位數(shù)字依次組成等差數(shù)列可得(其中x為等差系數(shù)): b=a+x (1) c=a

14、+2*x (2)再由百位上的數(shù)字是個(gè)位、千位數(shù)字的等比中項(xiàng)可得:a*d=b*b (3)由(1)、(3)可得:a*d=(a+x)*(a+x) (4)main() int i,j; clrscr(); printf(原四位數(shù)為:); for (i=0;i=9;i+) for (j=(i-9)/3;j=(9-i)/3;j+) if (i+j)*(i+j)=i*(i+3*j)&(2*i+3*j)*(1000+100+10+1)=11110) printf(%d ,(i*1000+(i+j)*100+(i+2*j)*10+(i+3*j); 1.8 一位學(xué)生說(shuō)“我的歲數(shù)的三次方是個(gè)四位數(shù),四次方是個(gè)六位數(shù)

15、。要組成我歲數(shù)的三次方和四次方,需要用遍十個(gè)數(shù)字?!闭?qǐng)問(wèn)他多少歲? 解法一: 該解法先分解出歲數(shù)的三次方和四次方的每一位,然后再判斷這些數(shù)字是 否重復(fù).(歲數(shù)1.c) main() int i,j,k,a10; long k3,k4; for (k=10; k0 & k3/10000 & k4/10000010 ) a0=k3/1000; a1=k3/100-a0*10; a2=k3/10-a0*100-a1*10; a3=k3%10; a4=k4/100000; a5=k4/10000-a4*10; a6=k4/1000-a4*100-a5*10; a7=k4/100-a4*1000-a5*

16、100-a6*10; a8=k4/10-a4*10000-a5*1000-a6*100-a7*10; a9=k4%10; for(i=0; i10-1; i+) for(j=i+1;j10; j+) if (ai=aj) break; if (i=9 & j=10) printf(歲數(shù)為:%dn,k); break; 解法二:該解法與解法一比起來(lái)在判斷數(shù)字是否重復(fù)方面有其獨(dú)特之處,其在判斷函數(shù)中用一數(shù)組a10來(lái)分別表示是否出現(xiàn)該數(shù)組下標(biāo)所對(duì)應(yīng)的數(shù)字,例如:若a0=1表示零的個(gè)數(shù)為零,若a0=0,表示此前已出現(xiàn)過(guò)數(shù)字0。 int check(long a1,long a2) int i,j,a1

17、0; for (i=0;i=9;i+) ai=1; for (i=0;i=3;i+,a1/=10) if (aa1%10) aa1%10=0;/*判斷當(dāng)前最后一位是否已出現(xiàn)過(guò),若沒(méi)有,則將其清零*/ else return(0); /*若aa1%10!=0,表示該數(shù)字已重復(fù),返回0*/ for (i=0;i=5;i+,a2/=10) if (aa2%10) aa2%10=0; else return(0); return (1); main() int i,k; long k3,k4; for (k=10; k0 & k3/10000 & k4/100000=1)&t;i-) j=n/6+i;

18、 /*第i個(gè)同學(xué)分到的糖的數(shù)量*/ n=n/6*7+i; /*第i個(gè)同學(xué)分到糖之前所剩的糖的數(shù)量*/ if (j!=m) t=0; /*每個(gè)人分到的糖塊數(shù)相同.不滿足就退 出模擬過(guò)程對(duì)人數(shù)重新取值*/ printf (%6d%6dn,m-6,m-6); 1.11 運(yùn)動(dòng)會(huì)連續(xù)開(kāi)了N天,一共發(fā)了M枚獎(jiǎng)牌。第一天發(fā)了一玫再加上剩下的1/7,即第一天發(fā)了1+(M-1)/7枚;第二天發(fā)了兩枚再加上剩下的1/7,以后每天按此規(guī)律發(fā)獎(jiǎng)牌,最后一天,第N天,剛好發(fā)完剩下的N枚獎(jiǎng)牌。問(wèn)運(yùn)動(dòng)會(huì)開(kāi)了幾天?一共發(fā)了幾枚獎(jiǎng)牌?(獎(jiǎng)牌.C) main() int t=0,m,n,i,j; clrscr(); for (i

19、=2;!t;i+) m=i; t=1; /*變量i為天數(shù),m為剩余獎(jiǎng)牌數(shù),t=1假設(shè)該天滿足條件*/ for (j=i-1;j=1;j-) /*從最后一天開(kāi)始倒著往前模擬每天的發(fā)放獎(jiǎng)牌過(guò)程*/ if (m%6) /*若有一天不滿足條件就退出模擬過(guò)程對(duì)天數(shù)重新取值*/ t=0; break; m=m/6*7+j; printf(一共開(kāi)了%d天,共發(fā)了%d枚獎(jiǎng)牌。n,i-1,m); 1.12 父親臨終時(shí),讓按下列方式分配他的遺產(chǎn):大兒子分得100克朗和剩下財(cái)產(chǎn)的1/10,二兒子分得200克朗和剩下財(cái)產(chǎn)的1/10,三兒子分得300克朗和剩下財(cái)產(chǎn)的1/10。依此類(lèi)推,最后發(fā)現(xiàn)這種分法好極了,因?yàn)樗袃?/p>

20、子分得的錢(qián)數(shù)恰好相等。問(wèn)他共有幾個(gè)兒子?每個(gè)兒子分得多少遺產(chǎn)?(同等遺產(chǎn).c) (答案:9個(gè)兒子,每人900克朗) 注:該題的算法可參照分糖. main() int i,j,k,m,n; for (n=600;n=n+10) k=100+(n-100)/10; m=n-k; for (i=2;m0;i+) if (m%10!=0)|(k!=i*100+(m-i*100)/10) break; else m=(m-i*100)-(m-i*100)/10; if (m=0) printf(他共有%d個(gè)兒子,每個(gè)兒子分得%d克朗.,i,k); getch(); exit(0); 1.13 兩衣袋中裝

21、滿了一角與二角五分的菜票,但還不到20元,左右兩個(gè)衣袋中的錢(qián) 數(shù)相等。左口袋中每種菜票的數(shù)目相同,而右口袋中每種菜票的錢(qián)數(shù)相等,你能算出兩口袋中各菜票的數(shù)目嗎?(菜票問(wèn)題.c) (答案:左:10*20+25*20=700;右:10*35+25*14=700) 分析:設(shè)左口袋中每種菜票的數(shù)量都為x;右口袋中每種菜票的錢(qián)數(shù)都為 y,一角菜票的張數(shù)為m,二角五分菜票的張數(shù)為n;則可得出如下方程: 10*x+25+x=2*y (1) 10*m+25*n=2*y (2) 10*m=25*n (3) 由(3)式可得: n=m*2/5 (4) 由(1)(2)(3)式可得: x=m*20/35 (5) 根據(jù)(

22、4)、(5)兩式可得如下求解過(guò)程: main() int i; for (i=5;i=50;i+=5) if (i*10*2%35=0) printf(%4d%4d%4d,i*20/35,i,i/5*2); getch(); 1.14 出售金魚(yú)者決定將缸里的金魚(yú)分五次全部賣(mài)出:第一次賣(mài)出全部金魚(yú)的一半加 二分之一條金魚(yú);第二次賣(mài)出剩余金魚(yú)的三分之一加三分之一條金魚(yú);第三次 賣(mài)出剩余金魚(yú)的四分之一加四分之一條金魚(yú);第四次賣(mài)出剩余金魚(yú)的五公之一 加五分之一條金魚(yú)。現(xiàn)在還剩下11條金魚(yú),當(dāng)然出售金魚(yú)時(shí)不能切開(kāi)或者有任 何破損的,問(wèn)這魚(yú)缸里原有多少條金魚(yú)?(出售金魚(yú).c) (答案:魚(yú)缸里原有59條金魚(yú)

23、。) main() int m,i=1,j,n=13; for (m=13;(n!=11)|(i4 才退出該循環(huán)。*/ n=m; for (i=1;i=4;i+) /*模擬前四次賣(mài)金魚(yú)的過(guò)程*/ if (n%(i+1)=i) /*符合要求就繼續(xù)*/ n=n*i/(i+1); else break; /*否則就重新取值*/ printf(魚(yú)缸里原有%d條金魚(yú)。,m-2); 1.15 有箱蘋(píng)果,編號(hào)從1#.10#,分別裝有1,2,4,8,16,32,64,128,256和512個(gè)蘋(píng)果。要取蘋(píng)果若干(1000以?xún)?nèi)任意自然數(shù)),而不打開(kāi)箱子,應(yīng)該取哪幾箱呢?(取蘋(píng)果.C) 分析:由題意可知,箱的編號(hào)m

24、與箱中蘋(píng)果個(gè)數(shù)n存在如下對(duì)應(yīng)關(guān)系:m等于2的n-1次冪. 根據(jù)十進(jìn)制數(shù)與二進(jìn)制數(shù)之間互相轉(zhuǎn)化的原理可得出如下求解過(guò)程: main() int a10,i,sum; a0=1; for (i=1;i=0)&(sum!=0);i-) if (sum=ai) printf(%d# ,i+1); sum=sum-ai; 1.16 山上有10個(gè)洞,呈順時(shí)針排列,有一只狐貍從第10號(hào)洞開(kāi)始按第n次跨越n個(gè)洞的規(guī)則追 兔子,可是追了一天也沒(méi)有抓到兔子,求兔子可能在哪幾個(gè)洞中?(狐貍追兔.c) 分析:根據(jù)題意,只需模擬狐貍跨越100次,就可得到狐貍未經(jīng)過(guò)的洞. main() static int a10,i;

25、 clrscr(); for(i=0;i100;i+) ai*(i+1)/2%10=1; /*狐貍有經(jīng)過(guò)的洞賦1*/ printf(兔子可能在); for(i=0;i=M 則回到(1),否則程序結(jié)束. 對(duì)應(yīng)的程序如下: main() int aa255; int i,j,k=1,m,n; printf(pleasem nn ); scanf(%d%d,&m,&n); for (i=0;im;i+) aai=i+1; /*記下每個(gè)人的相應(yīng)位置*/ for (i=0,j=1;j=m;) /*m次篩選*/ while (k=n) /*1到n報(bào)數(shù)*/ i=(i+1)%m; /*位置下移一個(gè)*/ if

26、(aai!=0) k+; /*若當(dāng)前位置有人則所報(bào)的數(shù)加1*/ if (aai=1) aai=m+1; /*避免所輸出的最大位置變成0*/ printf(%6d,aai-1); /*輸出剛出圈的人的位置*/ aai=0; /*該位置置空*/ k=1; j+; /*當(dāng)前所報(bào)的數(shù)置1,出圈次數(shù) j 加1*/ 1.18 若干求婚者排成一行,一二報(bào)數(shù),報(bào)單數(shù)的退場(chǎng)。余下的人靠攏后再一二報(bào)數(shù),報(bào)單數(shù)的退場(chǎng),最后剩下的一位就可以娶公主為妻。若現(xiàn)在你站出來(lái)數(shù)一下,共有101人在你前面,你應(yīng)站到哪一個(gè)位置才能娶到公主呢?(娶公主.c) (答案:第64個(gè)位置。) main() int aa103,total=1

27、02,i,j,m,n; for (i=1;i=102;i+) aai=i; /*初始化(記下每個(gè)人的最初位置)*/ do n=1; for (i=2;i1); /*剩下的最后一個(gè)人即能娶到公主*/ printf(%d,aa1); /*輸出娶到公主的人的最初位置*/ 1.19 遞增的牛群:若一頭小母牛,從第四年開(kāi)始每年生一頭母牛,按此規(guī)則,N年以后將有多少頭牛? 分析:對(duì)該問(wèn)題首先可用枚舉法列出前幾年的結(jié)果: 第一年: 第二年: 第三年: 第四年: 第五年: 第六年: 第七年: 第八年: 第九年: 第十年: 從以上數(shù)據(jù)可以看出:從第四年開(kāi)始,每年的數(shù)據(jù)都是前一年的數(shù)據(jù) 與前三年的數(shù)據(jù)之和。這樣,

28、就不難得出問(wèn)題的解決方案。(遞增牛群1.c) 解法一: 該解法利用f3,f2,f1,f這幾個(gè)變量來(lái)保存前一、二、三年以及本年的牛的數(shù)量。 main() int i,year,f,f1,f2,f3; printf(請(qǐng)輸入年份:); scanf(%d,&year); for(i=1;i=year;i+) if(i4) f=f1=f2=f3=1; else f=f1+f3;f1=f2;f2=f3;f3=f; printf(第%d年有%d頭牛.n,i,f); 解法二: 該解法利用一個(gè)數(shù)組來(lái)實(shí)現(xiàn)循環(huán)隊(duì)列的功能。其中變量i相當(dāng)于隊(duì) 列指針,把它與隊(duì)列結(jié)點(diǎn)取模之后,隨著i值的遞增就能實(shí)現(xiàn)循環(huán)地遍歷數(shù)組的 功

29、能。(遞增牛群2.c) main() int i,year,f4=1,1,1,1; printf(請(qǐng)輸入年份:); scanf(%d,&year); for(i=1;(i=year)&(i4);i+) printf(第%d年有%d頭牛.n,i,fi); for(i=4;i=year;i+) f(i+3)%4=fi%4+f(i+2)%4; printf(第%d年有%d頭牛.n,i,f(i+3)%4); 1.20 某人學(xué)藝,兩年滿師,滿師后,每年招一徒,其徒滿師后亦如此招徒.問(wèn):此人自從師即日起至第15年其徒子徒孫共有多少人?(徒子徒孫.c) 注:該題的算法可參照遞增牛群. main() long

30、 int f1,f2,f3; int i; clrscr(); f1=1; f2=1; for(i=3;i=15;i+) f3=f1+f2; f1=f2; f2=f3; printf(15年后其徒子徒孫共為=%ld,f3-1); 第二章 圖形輸出2.1 在屏幕上輸出一個(gè)n階方陣(1=n=20)的右旋方陣, 方陣的元素由1.n2組成, 排列由外向內(nèi), 順時(shí)針?lè)较蛐D(zhuǎn). 如下是4階左旋方陣:(左旋方陣.C) 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 分析:用t的值來(lái)表示當(dāng)前方陣的旋轉(zhuǎn)方向,根據(jù)t的值進(jìn)行不同的運(yùn)算。 main() int t=0,n,i,j,k,

31、l1,l0,c1,c0; int aa2020; printf(請(qǐng)輸入n階方陣的階數(shù)n:); scanf(%d,&n); i=l0=0,l1=n-1,j=c0=0,c1=n-1;/*l0,l1分別表示左右邊界,c0,c1分別表示上下邊界*/ k=1; for(k=1;kc1) /*判斷是否已超出右邊界*/ j-;i+;t+;l0+;/*改變行列及t和左邊界的值*/ break; case 1: /*t=1表示方陣的旋轉(zhuǎn)方向?yàn)閺纳系较?/ i+; if (il1) /*判斷是否已超出下邊界*/ i-;j-;t+;c1-; break; case 2: /*t=2表示方陣的旋轉(zhuǎn)方向?yàn)閺挠业阶?/

32、j-; if (jc0) /*判斷是否已超出左邊界*/ j+;i-;t+;l1-; break; case 3: /*t=3表示方陣的旋轉(zhuǎn)方向?yàn)閺南碌缴?/ i-; if (il0) /*判斷是否已超出上邊界*/ i+;j+;t=0;c0+; break; printf(所得的方陣是:n); for(i=0;in;i+) for (j=0;jn;j+) printf(%5d,aaij); printf(n); getch(); 2.2 鍵盤(pán)輸入正整數(shù) n (1n20) ,打印nn階右手旋轉(zhuǎn)方陣。 例如, 若 n=4 則輸出: (右旋方陣.C) 1 12 11 10 2 13 16 9 3 14

33、 15 8 4 5 6 7 若 n=5 則輸出: 1 16 15 14 13 2 17 24 23 12 3 18 25 22 11 4 19 20 21 10 5 6 7 8 9分析:本例題的關(guān)鍵在于控制該矩陣的旋轉(zhuǎn)方向,下面的解法是用變量row與當(dāng)前行列值i,j來(lái)控制其旋轉(zhuǎn)方向. 1. row=1且jn/2,其旋轉(zhuǎn)方向?yàn)閺纳系较? 2. row=0且in/2,其旋轉(zhuǎn)方向?yàn)閺南碌缴? 4. row=0且jn/2,其旋轉(zhuǎn)方向?yàn)閺挠业阶?int a2020;/*將數(shù)組a作為全局變量,可初始化數(shù)組a,將其元素清零*/main() int i,j,k; int n,row=1; i=0; j=0;

34、printf(Please input n:); scanf(%d,&n); for (k=1; k=n*n; k+) aij=k; if (row) if(j=n | aij) /*判斷當(dāng)前行是否已越界或aij是否已賦值*/ i-; row=0; /*改變旋轉(zhuǎn)方向?yàn)闄M向*/ j+; else i-; if (i0 | aij) /*判斷當(dāng)前行是否已越上界或aij是否已賦值*/ i+; row=0; j-; else if (in/2) j-; if (j=n | aij) j-; row=1; i-; for (i=0;in;i+) for (j=0; jn; j+) printf(%3d,

35、aij); printf(n); 2.3 輸入行列的值,打印出左手旋轉(zhuǎn)矩陣。 例如,輸入4 3 ,則輸出: 1 2 3 10 11 4 9 12 5 8 7 6 解法1:螺陣_1.C main() int m,n,c1,c2,l1,l2,a,b,i,t=1; static aa2121; printf(請(qǐng)輸入矩陣的行數(shù)與列數(shù):); scanf(%d%d,&m,&n); a=b=1; c1=l1=1; c2=n; l2=m; for (i=1;i=m*n;i+) aaab=i; if (a=l1)&(t=1) if (b=c2) a+;l1+;t=2; else b+; continue; if

36、 (b=c2)&(t=2) if (a=l2) b-;c2-;t=3; else a+; continue; if (a=l2)&(t=3) if (b=c1) a-;l2-;t=4; else b-; continue; if (b=c1)&(t=4) if (a=l1) b+;c1+;t=1; else a-; printf(所得的螺旋矩陣是:n); for (a=1;a=m;a+) for (b=1;b=n;b+) printf(%4d,aaab); printf(n); getch(); 解法2:螺陣_2.C main() int m,n,c1,c2,l1,l2,a,b,i,t=0;

37、static aa2121; printf(請(qǐng)輸入矩陣的行數(shù)與列數(shù):); scanf(%d%d,&m,&n); a=b=i=1; c1=l1=1; c2=n; l2=m; while (+t=(m+1)/2&t=(n+1)/2) while (b=c2) aaab+=i+; l1+; b-; while (ac1&l1l1&c1=c2) aa-ab=i+; b+;c1+; printf(所得的螺旋矩陣是:n); for (a=1;a=m;a+) for (b=1;b=n;b+) printf(%7d,aaab); printf(n); getch(); 解法3:螺陣_3.C main() in

38、t m,n,c1,c2,l1,l2,a,b,i,t=1; static aa2121; printf(請(qǐng)輸入矩陣的行數(shù)與列數(shù):); scanf(%d%d,&m,&n); a=b=1; c1=l1=1; c2=n; l2=m; for (i=1;i=m*n;i+) aaab=i; switch(t) case 1: if (b=c2) a+;l1+;t=2; else b+; break; case 2: if (a=l2) b-;c2-;t=3; else a+;break; case 3: if (b=c1) a-;l2-;t=4; else b-;break; case 4: if (a=

39、l1) b+;c1+;t=1; else a-; printf(所得的螺旋矩陣是:n); for (a=1;a=m;a+) for (b=1;b=n;b+) printf(%7d,aaab); printf(n); getch(); 2.4 打印蛇陣.如鍵盤(pán)輸入 4 5,則屏幕上輸出如下矩陣: 1 2 3 4 5 10 9 8 7 6 11 12 13 14 15 20 19 18 17 16 再定義一個(gè)函數(shù),把該矩陣存入文件shezhen.f1,然后再?gòu)脑撐募x出該矩陣 并把它輸出到屏幕上.(蛇陣.C) #include stdio.h #define s4 fread #define s3

40、 fwrite #define FIL1 shezhen.f1 #define FIL2 shezhen.f2 int aa2121; int m,n,a,b; void prin() for (a=1;a=m;a+) for (b=1;b=n;b+) printf(%4d,aaab); printf(n); void proc1(s1,s2,k) char *s1,*s2; int k; FILE *fp; if (fp=fopen(s1,s2)=NULL) printf(Cant open file!); return; for (a=1;a=m;a+) for (b=1;b=n;b+)

41、if (k=3)?s3:s4)(&aaab,2,1,fp)!=1) printf (file proc error!n); return; fclose(fp); main() int i; clrscr(); printf(請(qǐng)輸入矩陣的行數(shù)與列數(shù):); scanf(%d%d,&m,&n); b=1; i=1; for (a=1;a=m;a+) if (b=1) /*從左往右填入數(shù)據(jù)*/ while (b1) aaa-b=i+; printf(所得的矩陣是:n); proc1(FIL1,wb,3); proc1(FIL1,rb,4); prin(); getch(); 2.5 輸入M、N,顯示

42、數(shù)字排列,并存入文件Talk1.dat。如輸入、:1 3 6 10 14 182 5 9 13 17 214 8 12 16 20 237 11 15 19 22 24 另編函數(shù)prin(),將Talk1.dat顯示屏幕上。(對(duì)角矩陣.C) #include stdio.h #include stdlib.h void prin(); main() int m,n,c1,l1,a,b,i,j; static aa2121; FILE *fp; clrscr(); printf(請(qǐng)輸入矩陣的行列:); scanf(%d%d,&m,&n); if (fp=fopen(talk1.dat,w)=NU

43、LL) printf(File open error!); exit(1); a=b=l1=c1=1; /*a、b為當(dāng)前行列號(hào),l1保存目前最大行號(hào),c1為目前的起始列號(hào)。 如執(zhí)行到如下時(shí),則a=2,b=2,l1=3,c1=1。1 32 54 */ for (i=1;i=m*n;i+) aaab=i; /*i保存當(dāng)前行列a,b位置上的內(nèi)容*/ if (-an) /*同一對(duì)角線上行號(hào)遞減,列號(hào)遞增。當(dāng)行號(hào)小于一時(shí),如果目前最大行號(hào)l1小于 m,則l1值遞增,否則起始列號(hào)c1值遞增。*/ if(l1m) l1+; b=c1; else b=+c1; a=l1; for (a=1;a=m;a+) /

44、*往文件打印結(jié)果*/ for (b=1;b=n;b+)fprintf(fp,%4d,aaab); fprintf(fp,n); fclose(fp); prin(); /*往屏幕上輸出文件*/ getch(); void prin() char ch=j; FILE *fp; fp=fopen(talk1.dat,rb); while (ch!=EOF) ch=fgetc(fp); putch(ch); fclose(fp); 2.6 打印“魔方陣”。所謂“魔方陣”是指這樣的方陣,它的每一行、每一列以及對(duì)角線之和均相等。例如,三階魔方陣為:8 1 63 5 74 9 2 要求打印由1到n*n的

45、奇數(shù)構(gòu)成的魔方陣。(魔方陣.C) 分析:魔方陣中各數(shù)的排列規(guī)律如下: (1) 將1放在第一行中間一列; (2) 從2開(kāi)始直到n*n止各數(shù)依次按下列規(guī)則存放:每一個(gè)數(shù)存放的 行比前一個(gè)數(shù)的行數(shù)減1,列數(shù)加1; (3) 如果上一數(shù)的行數(shù)為1,則下一數(shù)的列數(shù)為n(指最下一行); (4) 當(dāng)上一個(gè)數(shù)的列數(shù)為n時(shí),下一個(gè)數(shù)的列數(shù)應(yīng)為1,行數(shù)減1; (5) 如果按上面規(guī)則確定的位置上已有數(shù),或上一個(gè)數(shù)是第一行第n列 時(shí),則把下一個(gè)數(shù)放在上一個(gè)數(shù)的下面. main() int n,i,j,k; static aa2121; printf(請(qǐng)輸入魔方的階數(shù):); scanf(%d,&n); i=1; j=n/

46、2+1; aaij=1; for (k=2;k=n*n;k+) if (aa-i+j!=0)|(i=0)&(j=n+1) j-;i+=2; else if (j=n+1) j=1; if (i=0) i=n; aaij=k; for (i=1;i=n;i+) for (j=1;j1)行中的第一個(gè)數(shù)等于前一行的第一個(gè)數(shù)加上當(dāng)前的行號(hào): VALi1=(VALi-11+i)%10 (a) 再根據(jù):VAL11=1 可得: VALi1=(i*(i+1)/2)%10; (b) (4) 第i行第j(j1)列的數(shù)據(jù)與第i行第j-1列的數(shù)據(jù)之間存在如下關(guān)系: if (j=N/2-i+2) VALij=(VALi

47、j-1+i+j-2)%10 (c) =(i+(i+j-1)*(i+j-2)/2)%10; (d) else VALij=(VALij-1+N-j-i+3)%10; (e) 其實(shí)現(xiàn)過(guò)程如下: 解法一: 該解法利用了以上規(guī)律中的(1)、(2)以及(a)、(c)、(e).(98技能4_1.C) main() int i,j,k,x,t,a,b,m,n; printf(Please enter N:); scanf(%d,&n); t=1; for (i=1;i=n/2+1;i+) m=i; a=0; b=0; x=i*(i+1)/2; for (j=1;j=(i-1)*2;j+) printf( )

48、; for (j=1;j=n-(i-1)*2;j+) if (j=n/2-i+2) x=(x+i+j-2)%10; else x=(x+n-j-i+3)%10; printf(%2d,x); if (x%2)=0) b+=x; else a+=x; for (j=1;j=(i-1)*2;j+) printf( ); printf(%10d%10dn,a,b); getch(); 解法二: 該解法利用了以上規(guī)律中的(1)、(2)以及(d)、(e).(98技能4_2.C) main() int i,j,x,a,b,n; printf(Please enter N:); scanf(%d,&n);

49、for (i=1;i=n/2+1;i+) a=0; b=0; for (j=1;j=(i-1)*2;j+) printf( ); for (j=1;j=n-(i-1)*2;j+) if (j=n/2-i+2) x=(i+(i+j-1)*(i+j-2)/2)%10; else x=(x+n-i-j+3)%10; printf(%2d,x); if (x%2)=0) b+=x; else a+=x; for (j=1;j=(i-1)*2;j+) printf( ); printf(%10d%10dn,a,b); getch(); 2.8 在屏幕上輸出 Y=SINX 和 Y=COS(2x+30)2

50、兩條曲線 ,每隔10打一點(diǎn)。(要求在文本狀態(tài)下,顯示的圖形如下所示)(98技能_2.C) *# | # * # | * # | * # | * # | * # | * # | * # | * # | * # | * | # * | # * | # * | # * | # | * # | * # * # * | #* # | * # | * # |* # | * # | * # | * # | * # | * # | * | # * | # * | # * | # * | # * | # * | # * # #include math.h #define PI 3.141596 #define

51、X0 40 /*定義右移的空格數(shù)*/ main() float x1,x2; int y,i; for (y=0;y36;y+) /*將圖形分成36行打印*/ x1=X0+20*cos(y*10*PI/180); x2=X0+20*sin(y*20+30)*PI/180)/2; if (x1x2) /*判斷先打印x1還是x2*/ for (i=1;ix1;i+) printf( ); printf(%c,*); for (i=1;ix2-x1;i+) printf( ); printf(%cn,#); else for (i=1;ix2;i+) printf( ); printf(#); fo

52、r (i=1;ix1-x2;i+) printf( ); printf(*n); getch(); 2.9 請(qǐng)用*打印出邊長(zhǎng)為10的菱形。(菱形_1.C) main() int i,j; printf( %cn,*); for (i=1;i=i;j-) printf(%c, ); printf(%c,*); for (j=0;j=1;i-) for (j=35;j=i;j-) printf(%c, ); printf(%c,*); for (j=1;j=i*2-1;j+) printf(%c, ); printf(%cn,*); printf( %cn,*); 2.10 編一程序,要求輸入一正

53、整數(shù),打印出相應(yīng)的菱形.如:輸入3,則應(yīng)打印出 * * * * * * * * * * * * (菱形_2.C) 注:本題的解題特色是沒(méi)有分開(kāi)打印上下兩部分. #include math.h main() int i,j,m; scanf(%d,&m); m-; printf( %cn,*); for (i=0;i=m-fabs(m-i);j-) printf(%c, ); printf(%c,*); for (j=0;j=(m-fabs(m-i)*2;j+) printf(%c, ); printf(%cn,*); printf( %cn,*); getch(); 2.11 編一程序:要求輸

54、入一正整數(shù),打印出楊輝三角,如輸入5,則輸出: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 (楊輝三角.C) 分析:可用一數(shù)組來(lái)完成,仔細(xì)觀察,可將該三角看成如下圖形: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1仔細(xì)觀察該圖形,可知該數(shù)組的第一列與對(duì)角線上的元素均為1, 從第三行到第n行的aaij=aai-1j-1+aai-1j. #includestdio.h main() FILE *fp; int i,j,n; static aa2140; /*0行0列不用*/ clrscr(); if(fp=fopen(c:tctext.txt,w+)=NULL) pr

55、intf(打開(kāi)文件錯(cuò)誤!); exit(0); printf(請(qǐng)輸入打印的行數(shù):); scanf(%d,&n); aa11=1; for (i=2;i=n;i+) /*給第一列和對(duì)角線上的元素賦1*/ aai1=aaii=1; for (i=1;i=i;j-) printf( ); fprintf(fp, ); for (j=1;j=a) ch=ch-a+A; j=(ch-A)*2; for(ch1=A;ch1=ch;ch1+) for(i=1;i=j;i+) printf( ); for(i=1;i=A;ch1-) for(i=ch1;ich;i+) printf( ); for(i=A*2

56、;i=a)&(m=Z)|(m=A) printf(n輸入出錯(cuò),請(qǐng)重輸!); else k=1; if (fp=fopen(ff,wb)=NULL) printf (不能打開(kāi)文件!n); exit(0); m=m-A; for (i=0;i=2*(m-fabs(m-i);j-) /*使圖形打印在中間*/ fprintf(fp, ); for(j=0;j=2*(m-fabs(m-i);j+) fprintf(fp,%c ,A+(i=a)&(mZ)|(mA) printf(n輸入出錯(cuò),請(qǐng)重輸!); else k=1; m=m-A; for (i=0;i=m-fabs(m-i);j-) printf(

57、 ); for(j=0;j=m-fabs(m-i);j+) printf(%c ,j+A); printf(n); 第三章 數(shù)據(jù)處理3.1 編寫(xiě)一個(gè)程序,求出100之內(nèi)所有勾股數(shù)。(勾股數(shù)c)分析:可設(shè)置I為一斜邊(0=i100,j,m為直角邊(j,ki,用兩重循環(huán)求出反有滿足條件的i,j值時(shí)m的值,并對(duì)m進(jìn)行判斷,判斷m是否是一個(gè)小于斜邊i的完全平方數(shù)。若滿足該條件,則記數(shù)變量n加1.#include main() int i,j,k,m,n=1; clrscr(); for (i=1;i100;i+) for (j=1;ji;j+) m=sqrt(i*i-j*j); if (m*m=i*i

58、-j*j)&(m=j) printf(%d %d %d %dn,n+,i,j,m); 3.2 打印輸出前一百個(gè)素?cái)?shù)。(求素?cái)?shù).c) (答案:2.541) 分析:本題可用一變量m來(lái)統(tǒng)計(jì)已求的素?cái)?shù)個(gè)數(shù),求素?cái)?shù)的方法是:判斷所求的數(shù)是否被所有的小等于該數(shù)的開(kāi)方的數(shù)整除,則所求的數(shù)不是素?cái)?shù)。#include main()int i,j,t,m=2; printf(2,3,); for (i=5;m2)&(t=0);j-) if (i%j=0) t=1; if (t=0) printf(%d,i);m+; 33 求出10000以?xún)?nèi)的親密數(shù).親密數(shù):如果A的因子和為B,B的因子和為A,則A與B為親密數(shù).

59、正整整A的因子:能整除A的所有正整數(shù)(除A本身),12的因子為:1,2,3,4,5,6.(親密數(shù).C) (答案:200 284,284 220,1184 1210 1184,2620 2924,2924 2620,5020 5564,5564 5020,6232 6368,6368 6232) 分析:本題用一函數(shù)來(lái)計(jì)算所求數(shù)的因子和,可降低其復(fù)雜度。fsum(int a) int i,sum=1; for (i=2; i=a/2; i+) if(a%i=0) sum+=i; return sum;main() int a,b,c; for (a=1;a=10000;a+) b=fsum(a);

60、 c=fsum(b); if ( a=c & b!=a) printf(%8d,%8dn,a,b); 3.4 有三個(gè)非零數(shù),用它們可能組合的所有三位數(shù)之和是2886,若把三個(gè)數(shù)字自大到小排和自小到大排成三位數(shù),差為495。求三數(shù)字。(三個(gè)非零數(shù).c) (答案:7,4,2。) 分析:設(shè)三數(shù)字為X,Y,Z且XYZ,由已知條件可列出二個(gè)方程: 200(X+Y+Z)+20(X+Y+Z)+2(X+Y+Z)=2886即X+Y+Z=13 (1) 100(Z-X)+(X-Z)=495即Z-X=5 (2)main() int i,j,k; for (i=1;i=9;i+) for (j=i;j=j)&(k-i=

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論