C語言經(jīng)典競賽程序_第1頁
C語言經(jīng)典競賽程序_第2頁
C語言經(jīng)典競賽程序_第3頁
C語言經(jīng)典競賽程序_第4頁
已閱讀5頁,還剩101頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

試1不等式對指定的正整數(shù)m,試求滿足不等式,V2V3 y[n 1 1-,??H <+1

3 5 2n-l的正整數(shù)n。輸入正整數(shù)m(l<m<10000),輸出正整數(shù)n所在的區(qū)間。例如忻2,輸出正整數(shù)n的區(qū)間為:[4,8]測試數(shù)據(jù):HF1000m=2012程序設計:/Z解不等式,tlttinclude<stdio.h>#include<math.h>voidmainO{longc,d,i,m;doubles;printf("請輸入m:つ;scanf("%ld",&m);i=0;s=0;while(s<m){i=i+l;s=s+sqrt(i)/(2*i-l);}c=i:while(s<m+l){i=i+l;s=s+sqrt(i)/(2*i-l);}d=i-l;printfC'n滿足不等式的正整數(shù)n為:[%ld,%ld]\n\c,d);)數(shù)據(jù)測試:請輸入m:1000滿足不等式的正整數(shù)n為:[999550,1001549]請輸入m:2012滿足不等式的正整數(shù)n為:[4047237,4051260]變通:如果和式中增加有規(guī)律的“ノ號,如何求解?實訓1:解不等式,11111,1m<\-\ 1 1 1"…土一其中m為從鍵盤輸入的正整數(shù),式中符號為二個“+”號后ー個“-”號,即分母能被3整除時為f輸入正整數(shù)m,輸出滿足不等式的n。測試數(shù)據(jù):(1)m=4 (2)m=7試2不定方程試求四元二次不定方程x+y+z=w在指定區(qū)間[a,b]的正整數(shù)解。輸入正整數(shù)a,b(l^a<b<10000),輸出方程在該區(qū)間[a,b]內的正整數(shù)解x,y,z,w(約定aWx〈y〈z〈wWb)的組數(shù)。例如輸入a,b:1,10;求得方程在[1,10]有2組解:{1,4,8,91,{2,3,6,7}?輸出:2。測試數(shù)據(jù):600,10001000,2012求解要點:設指定區(qū)間為[a,b],一般設置4重循環(huán)在指定區(qū)間內窮舉x、y、z、w(x〈y〈z),若滿足方程式則用n統(tǒng)計級數(shù)。程序設計:/Z求指定區(qū)間內不定方程解的組數(shù)t21tfinclude<stdio.h>#include<math.h>voidmainO{longa,b,n,x,y,z,w;printf(<請輸入?yún)^(qū)間[a,b]的上下限a,b:");scanf(*%ld,%ld*,&a,&b);n=0;for(x=a;x<=b-3;x++)for(y=x+l;y<=b-2;y++)for(z=y+l;z<=b-l;z++)for(w=z+l;w<=b;w++)if(x*x+y*y+z*z=w*w)/Z滿足不定方程式時統(tǒng)計n++;if(n=0)printf(?方程在該區(qū)間內沒有解。、n");elseprintf("方程在1%Id,%ld]內有%Id組解。、n”,a,b,n);)優(yōu)化循環(huán)參數(shù):/Z求指定區(qū)間內不定方程解的組數(shù)t22#include<stdio.h>tfinclude<math.h>voidmainO{longa,b,n,x,y,z,w;printfC請輸入?yún)^(qū)間[a,b]的上下限a,b:");scanf("%ld,%ld”,&a,&b);n=0;for(x=a;x<=sqrt(b*b/3);x++)for(y=x+l;y<=sqrt((b*b-x*x)/2);y++)for(z=y+l;z<=sqrt(b*b-x*x-y*y);z++)for(w=z+l;w<=b;w++)if(x*x+y*y+z*z==w*w)/Z滿足不定方程式時統(tǒng)計n++;if(n=0)printf(?方程在該區(qū)間內沒有解。'n");elseprintf(“方程在[%ld,%ld]內有%Id組解。、n”,a,b,n);}數(shù)據(jù)測試:請輸入?yún)^(qū)間[a,b]的上下限a,b:500,1000方程在[500,1000]內有13I組解。請輸入?yún)^(qū)間[a,b]的上下限a,b:1000,2012方程在[1000,2012]內有617組解。精簡循環(huán)設計:設指定區(qū)間為[a,b],精簡w循環(huán),設置3重循環(huán)在指定區(qū)間內窮舉x,y,z(xくy〈z),應用方程式計算d=x*x+y*y+z*z,w=sqrt(d):若w>b或w不滿足方程,返回;否則用n統(tǒng)計級數(shù)。/Z求指定區(qū)間內不定方程解的組數(shù)t23ftinclude<stdio.h>#include<math.h>voidmainO{longa,b,d,n,x,y,z,w;printfC請輸入?yún)^(qū)間[a,b]的上下限a,b:");scanfC%ld,%ld*,&a,&b);n=0;for(x=a;x<=sqrt(b*b/3);x++)for(y=x+l;y<=sqrt((b*b-x*x)/2);y-H-)for(z=y+l;z<=sqrt(b*b-x*x-y*y);z++){d=x*x+y*y+z*z;w=(int)sqrt(d); 〃w為x,y,z的平方和開平方if(w>b)break;if(w*w=d)n++;/Z滿足方程式時統(tǒng)計)if(n=0)printfC區(qū)間內沒有勾股數(shù)組。'n");elseprintfC方程在1%Id,%ld]內有%Id組解。ゝn”,a,b,n);)變通:可把要求統(tǒng)計解數(shù)變?yōu)檩敵瞿承┙?或輸出某些量。實訓2:求最大值設指定區(qū)間[a,b]內的正整數(shù)x,y,z,w滿足x'+y+z=w'其中aWxくy〈z〈wWb,試求s=x+y+z+w的最大值。輸入正整數(shù)a,b(lWa〈bく10000),輸出s的最大值。測試數(shù)據(jù):a=500,b=1000a=1000,b=2012試3喝汽水某學院的m個學生參加南湖春游,休息時喝汽水.南湖商家的公告:買1瓶汽水定價L40元,喝1瓶汽水(瓶不帶走)1元。為節(jié)約資源,規(guī)定3個空瓶可換回1瓶汽水,或20個空瓶可換回7瓶汽水。(3)為方面顧客,可先借后還。例如借1瓶汽水,還3個空瓶;或借7瓶汽水,還20個空瓶問m個學生每人喝1瓶汽水,至少需多少元?輸入正整數(shù)m(2<m<10000),輸出至少需多少元(精確到小數(shù)點后第2位)。測試數(shù)據(jù):11112012設計要點:建立x=0,1,2, ,int(m/20)循環(huán):1)把m人分為x個大組,每組20人.每組買13瓶汽水(借7瓶汽水),飲完后還20個空瓶(即相當于換回7瓶汽水還給商家),兩清.2)剩下t=m-x*20人,分為y=t/3個小組,每組3人.每組買2瓶汽水(借1瓶汽水),飲完后還3個空瓶(即相當于換回1瓶汽水還給商家),兩清。3)剩下t=m-x*20-y*3人,每人花1元喝1瓶。對每ー個x,所求得最低費用(13*x+2*y)*1.40+t與最小值變量mi比較,求得最低費用.程序設計:/Z喝汽水t31#include<stdio.h>voidmainO{longm,t,x,y;doublep,mi;printf(?請輸入m:*);scanf(*%ld*,&m);p=l.40;mi=2*m; 〃最小值mi賦初值for(x=0;x<=m/20;x++)〃分x個大組,每組買13瓶汽水,借7瓶{t=m-20*x; /Z剩下大組外的t人y=t/3; 〃剩下t人分y個小組,每組買2瓶汽水,借1瓶t=m-20*x-3*y;/Z剩下大小組外的t人,每人花1元喝1瓶if((13*x+2*y)*p+t<mi)/Z比較求最小值mi=(13*x+2*y)*p+t;)printfC喝%Id瓶汽水,需%.2f元。ゝn”,m,mi);)數(shù)據(jù)測試:請輸入m:1111喝1111瓶汽水,需1011.40元。請輸入m:2012喝2012瓶汽水,需1831.20元。設計求解優(yōu)化:(1)大組人數(shù)為20人,買13瓶汽水(借7瓶汽水,還20個空瓶),花費13*1.40元,人均13*1.40/20=0.91元。(2)小組人數(shù)為3人,買2瓶汽水(借1瓶汽水,還3個空瓶),花費2*1.40元,人均2*1.40/3=0.93333元。(3)零散人數(shù)可能為1或2人,每人喝1瓶汽水(瓶不帶走),各花費1元注意到0.91“.933333。,顯然大組優(yōu)先小組,小組優(yōu)先零散。改進程序設計:/Z喝汽水t32#include<stdio.h>voidmainO{longm,x,y,z;printf(?請輸入m:*);scanf(*%ld*,&m);x=m/20; //分x個大組,每組買13瓶汽水,借7瓶y=(m-20*x)/3;/Z剩下人分y個小組,每組買2瓶汽水,借1瓶z=m-20*x-3*y;/Z剩下零散z人,每人花1元喝1瓶printf("喝%Id瓶汽水,需%.2f元。'n”,m,(x*13+y*2)*l.40+z);)試4交通網(wǎng)岳陽新城區(qū)的方格交通網(wǎng)如圖1所示,其中金鶉山占據(jù)了交通網(wǎng)中(3,2).(4,2)與(4,3)這三個交叉點尚未開通,另有從(2,3)至(2,4)與(6,4)至(7,4)的兩條打“義”路段正在維護,禁止通行。試統(tǒng)計從始點(0,0)到終點(m,n)的不同最短路線(路線中各段只能從左至右、從下至上)的條數(shù)。圖1交通網(wǎng)格示意圖輸入正整數(shù)m,n(7<m<=20,5<n<=20),輸出從始點(0,0)到終點(叫n)的最短路線的條數(shù)。測試數(shù)據(jù):m=10,n=8m=20,n=12設計要點:如果沒有障礙的方格交通網(wǎng),每一條路線共m+n段,其中橫向m段,縱向n段,每ー條不同路線對應從m+n個元素中取m個元素(以放置橫向段)的組合數(shù)。因而不同路線條數(shù)為C;:*,,=因而不同路線條數(shù)為C;:*,,=n-¥tnn-¥m—\n+1今設置了諸多障礙,試應用遞推求解.設f(x,y)(0〈xWm,0〈y《n)為從始點(0,0)到終點(x,y)的不同最短路線的條數(shù)。(1)遞推關系f(x,y)=f(x-1,y)+f(x,y-1)(2)邊界條件f(x,0)=1(O〈xWm)f(0,y)=l(O〈yWn)(3)障礙處理①城區(qū)的一座山所占據(jù)網(wǎng)中的(3,2)、(4,2)、(4,3)三個交叉點,可令f(3,2)=f(4,2)=f(4,3)=0;②從(2,3)至(2,4)段禁止通行,則對f⑵4)的賦值只有f(1,4),即f[2][4]=f[l][4];同理 f⑺[4]=f[7][3];程序設計:/Z帶障礙的交通路線問題t41^include<stdio.h>voidmainO{intm,n,x,y,f[50][50];printf(”請輸入正整數(shù)m,n:");scanf("%d,%d",&m,&n);for(x=l;x<=m;x++)f[x][0]=l;for(y=l;y<=n;y++)f[0][y]=l;/Z確定邊界條件/Z實施遞推得目標值/Z實施遞推得目標值f(m,n)if(x=3&&y=2IIx=4&&y=211x=4&&y=3)f[x][y]=0;elseif(x=2&&y=4)f[x][y]=f[x-l][y];elseif(x=7&&y==4)f[x][y]=f[x][y-1];elsef[x][y]=f[x-l][y]+f[x][y-1];printf(?不同最短路線條數(shù)為:%d\n*,f[m][n]):}數(shù)據(jù)測試:請輸入正整數(shù)m,n:10,8不同最短路線條數(shù)為:11008請輸入正整數(shù)叫n:20,12不同最短路線條數(shù)為:70679215附無障礙交通路線問題程序/Z無障礙完整交通路線問題t42ftinclude<stdio.h>voidmainO{intk,m,n,x,y,z,f[50][50];printf(?請輸入正整數(shù)m,n:つ;scanf("%d,%d",&m,&n);for(x=1:x<=m:x++)f[x][0]=l;for(y=l;y<=n;y++)f[0][y]=l!〃確定邊界條件for(x=l;x<=m;x++)for(y=l;y<=n;y++) /Z實施遞推得目標值f(m,n)f[x][y]=f[x-1][y]+f[x][y-1];printfC不同最短路線條數(shù)為:%d\n\f[m][n]);z=l;for(k=l;k<=m;k++)z=z*(n+k)/k;printfC不同最短路線組合數(shù)為:%d\n”,z);}請輸入正整數(shù)m,n:7,10不同最短路線條數(shù)為:19448實訓3帶中轉站的交通路線在某城區(qū)的完整方格交通網(wǎng)中,中轉站(a,b)與終點(m,n)為交通網(wǎng)中的任意兩交叉點,這里a,b,m,n為非負整數(shù)。試統(tǒng)計從始點(0,0)經(jīng)中轉點(a,b)到終點(m,n)的不同最短路線(路線中各段只能靠近目標點而不能遠離目標點)的條數(shù)。(注:若a>m且b>n時,從(0,0)點至中轉站(a,b)這一段允許經(jīng)過終點(m,n)點)交通網(wǎng)格示意圖輸入非負整數(shù)a,bg,n,輸出從始點(0,0)經(jīng)中轉站(a,b)到終點(m,n)的最短路線的條數(shù)。測試數(shù)據(jù):a=9,b=7,m=20,n=12a=20,b=12,m=9,n=7試5三角網(wǎng)格把ー個正三角形的三邊n等分,分別與各邊平行連接各分點,得n一三角網(wǎng)格。例如n=6時6一三角網(wǎng)格如圖2所示。對指定正整數(shù)n,試求n一三角網(wǎng)格中不同三角形(大小不同或方位不同)的個數(shù),以及所有這些三角形的面積之和(設網(wǎng)格中最小的單位三角形的面積為1)。圖26一三角網(wǎng)格輸入整數(shù)n(l<n<120),輸出n一三角網(wǎng)格中不同三角形的個數(shù),所有這些三角形的面積之和。測試數(shù)據(jù):25100統(tǒng)計求解要點:1)設n一三角網(wǎng)格中所含單位三角形數(shù)為p(n),顯然從最上層開始的第1層為1個,第2層3個,…,底層為2n-l個。因而有p(n)=1+3+…+(2n-l)一般地,設k一三角網(wǎng)格中所含單位三角形數(shù)為p(k),則P(k)=l+3+―+(2k-l) (k=l,2,3,…,n)計算出P(D,p(2),p(n),為后續(xù)計算面積和時使用。2)統(tǒng)計三角形數(shù)與面積和時,設三角形的水平邊為底,頂角在上或在下把所有三角形分為“正立”與“倒立”兩類。設正立三角形的個數(shù)為S1,其面積之和為SS1.正立三角形從大到小統(tǒng)計:邊為n的三角形1個,其面積為p(n);邊為n-1的三角形1+2個,每個面積為p(n-l);邊為1的三角形l+2+?“+n個,每個面積為p(l).sl=l+(1+2)+(1+2+3)+—+(1+2+—+n)ssl=l*p(n)+(1+2)*p(n-1)+…+(1+2+…+n)*p(l)3)設倒立三角形的個數(shù)為s2,其面積之和為ss2。倒立三角形從小到大統(tǒng)計:邊為1的三角形1+2+…+(n-l)個,每個面積為p(l);邊為2的三角形1+2+…+(n-3)個,每個面積為p(2);??????①當n為偶數(shù)時,邊為n/2的三角形1個,每個面積為p(n/2);s2=l+(1+2+3)+—+(1+2+—+(n-1))ss2=l*p(n/2)+(1+2+3)*p(n/2~l)+,,,+(1+2+—+(n-1))*p(1)②當n為奇數(shù)時,邊為(n-1)/2的三角形1+2個,每個面積為p((n-l)/2);s2=(l+2)+(l+2+3+4)+—+(l+2+—+(n-l))ss2=(l+2)*p((n-1)/2)+(1+2+3+4)*p((n-l)/2)+??,+(1+2+—+(n-l))*p(l)4)所求n-三角網(wǎng)格中不同三角形的個數(shù)為sl+s2,所有這些三角形的面積之和(即所含單位三角形的個數(shù)之和)為ssl+ss2。程序設計://n-三角網(wǎng)格中的不同三角形個數(shù)及面積之和t51#include<stdio.h>voidmainO{intk,m,n,u,p[1000];longt,tl,t2,si,s2,ssl,ss2;printf(”請輸入正整數(shù)n:");scanf("%d",&n);for(t=0,k=l;k<=n;k++){t=t+(2*k-l);p[k]=t;}tl=t2=sl=s2=ssl=ss2=0;for(k=l;k<=n;k++) /Z求正立三角形個數(shù)及其面積之和{tl=tl+k;sl=sl+tl;ssl=ssl+tl*p[n+l-k];)m=(n%2==0?l:2);for(k=m;k<=n-l;k=k+2)/Z求倒立三角形個數(shù)及其面積之和{t2=t2+(k-1)+k;u=(n+l-k)/2;s2=s2+t2;ss2=ss2+t2*p[u]:)printfC三角網(wǎng)格中共有三角形個數(shù)為:%ld\n\sl+s2);printfC三角網(wǎng)格中所有三角形面積之和為:%ld\n",ssl+ss2);)數(shù)據(jù)測試:請輸入正整數(shù)n:25三角網(wǎng)格中共有三角形個數(shù)為:4303三角網(wǎng)格中所有三角形面積之和為:244153請輸入正整數(shù)n:100三角網(wǎng)格中共有三角形個數(shù)為:256275三角網(wǎng)格中所有三角形面積之和為:201941895點評:難點在于統(tǒng)計“倒立”三角形時,需對k分奇數(shù)與偶數(shù)兩種情形分別總結規(guī)律。另外,求三角形面積之和時,p數(shù)組的建立大大簡化了計算。試6雙碼二部數(shù)雙碼二部數(shù)定義:由兩個不同數(shù)碼組成,每個數(shù)碼多于1位時相連而不分開的正整數(shù)稱為雙碼二部數(shù)。顯然,10是最小雙碼二部數(shù),3335是一個4位雙碼二部數(shù),477是ー個3位雙碼二部數(shù);而333只有一個數(shù)碼,4474的數(shù)碼4呈分開狀態(tài),都不是雙碼二部數(shù)。對指定的正整數(shù)n,探求出n位雙碼二部數(shù)從小到大排序的序列中第m項。依次輸入n,m(2<n<100),輸出n位雙碼二部數(shù)序列的第m項。測試數(shù)據(jù):10,50030,2012求解要點:設雙碼二部數(shù)為a“?ab…b(1よaW9,0WbW9),其髙部數(shù)字a有l(wèi)a位,低部數(shù)字b有1b位,顯然有l(wèi)a+lb=n(1WlaWn-1)為了確保從小到大枚舉雙碼二部數(shù),要注意枚舉循環(huán)的先后次序:首先,髙部數(shù)字a須從小到大,范圍為1—9;當a確定后,髙部位數(shù)la簡單地從小到大或從大到小都不能確保雙碼二部數(shù)從小到大變化,需配合b分以下3步完成.為便于理解,以le=4,a=4的遞增進程實施標注。la增長(1 le-2)段,lb=le-la,b遞增(0 a-l)取值。4000411142224333(la=l,lb=3,b:0——3)4400441144224433(la=2,lb=2,b:0——3)la與lb取定值段,la=le-l,lb=l,b遞增(0——9)取值(當b=a時跳過)。444044414442444344454446444744484449(la=3,lb=l,b:0——9.其中b=4時跳過)la減小(le-2 1)段,lb=leTa,b遞增(a+1 9)取值。4455 4466 4477 4488 4499 (la=2,lb=2,b:5——9)4555 4666 4777 4888 4999 (la=l,lb=3,b:5 9)以上3步驟中每一步驟中都是遞增的,且3個步驟銜接中沒有重復與遺漏,從而可確保la位的雙碼二部數(shù)從小到大遞增,沒有重復與遺漏。程序代碼:/Z探求n位雙碼二部數(shù)從小到大排序的第m個t61#include<stdio.h>#include<math.h>voidmain(){inta,b,aO,bO,i,n,m,la,lb,laO,IbO,s;printfC 請依次輸入整數(shù)n,m:");scanf(*%d,%d”,&n,&m);s=0;for(a=l;a<=9:a++) //高部數(shù)字a從小到大枚舉{for(la=l;la<=n-2;la++) //高部位數(shù)la分3步驟枚舉{lb=n-la;for(b=0;b<=a-l;b++){s++; /Z變量s統(tǒng)計個數(shù)if(s=m) /Z記錄第m個數(shù)的信息{aO=a;bO=b;laO=la;lbO=lb:}))la=n-l;lb=l;for(b=0;b<=9;b++){if(a!=b) /Z當a=b時跳過{s++;if(s=m){aO=a;bO=b;laO=la;lbO=lb;}))for(la=n-2;la>=l;la—){lb=n-la;for(b=a+l:b<=9;b++){s++;if(s=m){aO=a;bO=b;laO=la;lbO=lb;})))if(m<=s){printfC %d位雙碼二部數(shù)從小到大第%d個數(shù)為:*,n,m);for(i=l;i<=laO;i++)printf("%d",aO);for(i=l;i<=lbO;i++)printf(*%d*,bO);printf("\n*);}elseprintf(" %d位雙碼二部數(shù)的個數(shù)不到%d個。'n=n,m);數(shù)據(jù)測試:

請依次輸入整數(shù)n,m:10,50010位雙碼二部數(shù)從小到大第500個數(shù)為:7766666666請依次輸入整數(shù)n,m:30,201230位雙碼二部數(shù)從小到大第2012個數(shù)為:888888888888888888888888000000設計改進:/Z探求n位雙碼二部數(shù)從小到大排序的第m個t62ttinclude<stdio.h>#include<math.h>voidmainO{inta,b,aO,bO,i,n,m,la,laO,IbO,s;printfC 請依次輸入整數(shù)n,國:");scanf("%d,%d",&n,&m);a=l;b=0;la=l;s=l;while(la<n-l||a<9||b<8)//此時b//此時b不能增!,有以下2種選擇//①a增1后,b從〇開始//②a段長增1后,b從a+1開始//a與la不變,b增1if(la=l){a++;b=0;}else{la-;b=a+l;}elseif(b!=a-l)b++;elseif(la!=n-l){la++:b=O;}//a段長增1后,b從。開始elseif(b<8)b+二elseif(b<8)b+二2;s-h-;//b增2跳過a=b情形if(s=m){a0=a;bO=b;la0=la;lbO=n-la;}}if(m<=s){printf(" %d位雙碼二部數(shù)從小到大第%d個數(shù)為:らn,m)for(i=l;i<=laO;i++)printf("%d",aO);for(i=l;i<=lbO;i++)printf("%d",bO);printf("\n");}elseprintf(" %d位雙碼二部數(shù)的個數(shù)不到%d個。\n",n,m);}實訓4雙碼二部數(shù)序列試求雙碼二部數(shù)升序序列的第m項。測試數(shù)據(jù):m=2012;m=201241解不等式其中m為從鍵盤輸入的正整數(shù),式中符號為二個“+”號后ー個“-”號,即分母能被3整除時為“ノ。輸入正整數(shù)m,輸出滿足不等式的n。測試數(shù)據(jù):(1)m=4 (2)m=7設計要點1:式中出現(xiàn)減運算,導致不等式的解可能分段。設置條件循環(huán),每三項(包含二正一負)ー起求和,得一個區(qū)間解。然后回過頭來ー項項求和,得個別離散解。為敘述方便,記i+丄ー丄+丄+丄ー丄+…土丄23456ー〃通過循環(huán)知s(d+l)>m,且n=d+!為“-”,可得n=d為ー個解;而n=d+2時L0/(n+3)為可得s(d+2)>m;以后各項中,“一”項小于其前面的“+”項,可知對于n>d+2有s(n)>m成立。因而有區(qū)間解:n》d在n<d時是否有解,逐個求和檢驗確定離散解。這ー步不能省,否則出現(xiàn)遺解。程序設計1://解不等式:mく1+1/2-1/3+1/4+1/5-1/6+.??+-1/n?(include<stdio.h>voidmainO{longd,n,m,k;doubles;printf("\n請輸入m:");scanf("%d",&m);n=-2;s=0;while(s<=m){n=n+3;s=s+l.0/n+l.0/(n+l)-l.0/(n+2);}d=n+l;s=0; /Z可確定區(qū)間解n2d(1)for(k=l;k<=n;k++){if(k%3>0)s=s+l.0/k;elses=s-l.0/k;if(s>m)printf(*n=%ld,ゝk); 〃逐個得離散解}printf("n>=%ld\n",d);)程序運行示例:請輸入m:4n=10151,n=10153,n>=10154請輸入m:7n=82273511,n=82273513,n>=82273514注意:要特別注意,不要把離散解遺失。思考:如果把后一個離散解寫入?yún)^(qū)間解中?設計要點2:為敘述方便,記s(〃)=i+丄」+丄+丄」+…土丄(1)通過循環(huán)累加,當加到s=s+l.O/n+1.0/(n+l)-l.0/(n+2);得s(n+2)>m,令d=n+1,可知:n2d為解;(2)此時,s(n)有可能大于叫因而在原s基礎上s-L0/d+L0/(d+l)得s(n):若s(n)>m,合并得區(qū)間解:n^d-1;若s(n)く叫區(qū)間解為:n2d;(因可肯定s(n-l)くm)但s(n-2)還有可能大于叫因而在上s基礎上s+1.0/(d-2)-l.0/(d-l),得s(n-2):若s(n-2)》叫得一個離散解:n=d-3;若s(n-2)くm,沒有離散解。程序設計2://解不等式:m<l+l/2-l/3+l/4+l/5-l/6+...+-l/n#include<stdio.h>voidmainO{longd,n,m;doubles;printfC\n請輸入m:");scanf("%d",&m);n=-2;s=0;while(s<=m){n=n+3;s=s+l.0/n+l.0/(n+l)-l.0/(n+2);}d=n+l; /Z可確定區(qū)間解n,d(1)s=s-l.0/d+l.0/(d+l); /Z得s(n)if(s>m)printf(*n>=%ld\n*,d-1);/Z輸出區(qū)間解elseprintf(<n>=%ld\n”,d);s=s+l.0/(d-2)-l.0/(d-l): 〃得s(n-2)if(s>m)printf("n=%ld\n”,d-3);/Z輸出ー個離散解}數(shù)據(jù)測試:請輸入m:4n>=10153n=10151請輸入m:7n>=82273513n=82273511程序設計3:請判斷以下程序是否正確?//解不等式:m<l+l/2-l/3+l/4+l/5-l/6+...+-l/n#include<stdio.h>voidmainO{doublen,m,s;printf("\n請輸入m:“);scanf("%lf”,fan);n=0;s=3.0/2;

while(s<=m){n=n+3;s=s-l.0/n+l.0/(n+l)+l.0/(n+2);}d=n+2;/Z得一個離散解(1)/Z得一個離散解(1)/Z可確定區(qū)間解nNd(2)//??s=s-l.0/(n+3)+l.0/(n+4);d=n+4;if(s>m)printf("n>=%.Of\n",d);elseprintf("n>=%.0f\n",d+1);)(1)首先s(d)>m,n=d為ー個解;而s(d-3)く=m,n=d-2為“-”項,其絕對值大于n=d-l的“+”項,可得s(d-l)く叫且知n<d時無解。同時由一丄+丄+」 !_<〇,可得s(d+l)くm,即n=d為ー個離散解。nn+1n+2n+3(2)當s(n+4)>m時,以后的項絕對值小于其前面的“+”項,故得區(qū)間解n2d;當s(n+4)<=m時,因———+ +—>0可知s(n+5)>m?但不能確定s(n+6)>0,〃+3〃+4〃+5因而不能確定n2d+l為區(qū)間解!2求最大值設指定區(qū)間[a,を內的正整數(shù)x,y,z,w滿足x2+y2+z2=w2其中くyくzくwWb,試求s=x+y+z+w的最大值。輸入正整數(shù)a,b(IWaくbく10000),輸出s的最大值。測試數(shù)據(jù):a=500,b=1000a=1000,b=2012設計要點:對每ー組滿足條件的解,通過比較求得最大值。程序設計:/Z求最大值tfinclude<stdio.h>#include<math.h>voidmainO{longa,b,d,s,x,y,z,w,max;printf("請輸入?yún)^(qū)間[a,b]的上下限a,b:");scanf("%ld,%ld",&a,&b);max=0;for(x=a;x<=sqrt(b*b/3);x++)for(y=x+l;y<=sqrt((b*b-x*x)/2);y-H-)for(z=y+l;z<=sqrt(b*b-x*x-y*y);z++){d=x*x+y*y+z*z;w=(int)sqrt(d): 〃w為x,y,z的平方和開平方if(w>b)break;if(w*ff==d) /Z滿足條件時統(tǒng)計{s=x+y+z+w;if(s>max)max=s;)}printf(*s的最大值為:%ld\n*,max);}數(shù)據(jù)測試:請輸入?yún)^(qū)間[a,b]的上下限a,b:500,1000s的最大值為:2728請輸入?yún)^(qū)間[a,b]的上下限a,b:1000,2012s的最大值為:54963帶中轉站的交通路線在某城區(qū)的完整方格交通網(wǎng)中,中轉站(a,b)與終點(m,n)為交通網(wǎng)中的任意兩交叉點,這里a,b,m,n為非負整數(shù)。試統(tǒng)計從始點(0,0)經(jīng)中轉點(a,b)到終點(m,n)的不同最短路線(路線中各段只能靠近目標點而不能遠離目標點)的條數(shù)。(注:若a>m且b>n時,從(0,0)點至(a,b)點這一段允許經(jīng)過(m,n)點)交通網(wǎng)格示意圖輸入非負整數(shù)a,b,叫n,輸出從始點(0,0)經(jīng)(a,b)到終點(m,n)的最短路線的條數(shù)。測試數(shù)據(jù):a=9,b=7,m=20,n=12a=20,b=12,m=9,n=7設計要點:如果路線中沒有設指定的必經(jīng)點,從始點(0,0)到終點(m,n)每一條路線共m+n段,其中橫向m段,縱向n段,每一條不同路線對應從m+n個元素中取m個元素(以放置橫向段)的組合數(shù),不同路線條數(shù)為宀”〃+n-¥tn—\n+1今設置了路線中的必經(jīng)點(a,b),須分以下兩步統(tǒng)計。設從始點(0,0)到交叉點(a,b)的不同路線條數(shù)為y?從交叉點(a,b)到終點(m,n)的不同路線條數(shù)為z.據(jù)乘法原理,從始點(0,0)經(jīng)(a,b)到終點(m,n)的最短路線的條數(shù)為yz。為了求y,分以下兩種情形計算:1)若a=0或b=0,即必經(jīng)點與起點在橫向或縱向同線,y=l.2)若a>0且b>0,即a,b為正整數(shù)時,尸C工。為了求z,分以下兩種情形計算:1)若m=a或n=b,即必經(jīng)點與終點在橫向或縱向同線,z=lo2)若mWa且nKb,必經(jīng)點與終點在橫向相差什布在縱向相差|皿,Zぐ:二:L/。程序設計:/Z帶中轉站的最短路線tfinclude<stdio.h>#include<math.h>voidmainO{doublea,b,c,d,myn,k,y,z;printf(?請輸入正整數(shù)a,b:*);scanf%lf*,&a,&b);printfC請輸入正整數(shù)叫n:つ;scanf%lf\&m,&n);y=i;if(a*b>0)for(k=l;k<=a;k++)y=y*(b+k)/k; /Z計算C(a+b,a)z=l;if((m-a)?(n-b)!=0){c=fabs(m-a);d=fabs(n-b);for(k=l;k<=c;k++)z=z*(d+k)/k; /Z計算C(|m-a|+|n-b|,|nra|)}printfC不同最短路線條數(shù)為:%.Of\n*?y*z);}數(shù)據(jù)測試:請輸入正整數(shù)a,b:9,7請輸入正整數(shù)m,n:20,12不同最短路線條數(shù)為:49969920請輸入正整數(shù)a,b:20,12請輸入正整數(shù)m,n:9,7不同最短路線條數(shù)為:986263125120附無障礙無中轉站的交通路線問題程序:/Z無障礙完整交通路線問題#include<stdio.h>voidmain(){intk,m,n,x,y,z,f[50][50];printf(“請輸入正整數(shù)m,n:つ;scanf("%d,%d”,fan,&n);for(x=l;x<=m;x++)f[x][0]=l;

for(y=l;y<=n;y++)f[0][y]=l:〃確定邊界條件for(x=l;x<=m;x++)for(y=l;y<=n;y++) /Z實施遞推得目標值f(叫n)f[x][y]=f[x-1][y]+f[x][y-1];printf(<不同最短路線條數(shù)為:%d\n*,f[m][n]);z=l;for(k=l;k<=m;k++)z=z*(n+k)/k;printfC不同最短路線組合數(shù)為:%d\n',z);請輸入正整數(shù)m,n:7,10不同最短路線條數(shù)為:194484雙碼二部數(shù)序列試求雙碼二部數(shù)升序序列的第m項。測試數(shù)據(jù):nF2012;m=20124設計1:把雙碼二部數(shù)升序序列的第m項換算為n位的第m0項。注意到2位雙碼二部數(shù)共9*9=81個:3位雙碼二部數(shù)共2*9*9=2*8I個;//求雙碼二部數(shù)升序序列的第m項#include<stdio.h>^include<math.h>voidmainO{inta,b,aO,bO,i,n,m,mO,la,lb,laO,IbO,s;printfC 請依次輸入整數(shù)m:");scanf("%d",&m);s=0;n=0;while(s<m){n++;s=s+n*81;}m0=m-(s-n*81);n++;s=0;//換算為n位的第mO項for(a=l;a<=9;a++){for(la=l;la<=n-2;la++){lb=n-la;for(b=0;b<=a-l;b++){s++;if(s=m0)//高部數(shù)字a從小到大枚舉//高部位數(shù)la分3步驟枚舉/Z變量s統(tǒng)計個數(shù)/Z記錄第m個數(shù)的信息{a0=a;bO=b;la0=la;lbO=lb;}))la=n-l;lb=l;//當a//當a二b時跳過{s++;if(s=mO){aO=a;bO=b;laO=la;lbO=lb;}}for(la=n-2;la>=l;la—){lb=n-la;for(b=a+l;b<=9;b++){s++;if(s=mO){aO=a;bO=b;laO=la;lbO=lb;})))printfC 雙碼二部數(shù)升序序列的第%d個數(shù)為:'m);for(i=l;i<=laO:i++)printfaO);for(i=l;i<=lbO;i++)printf(*%d*,bO);printf("\n");printf(* (式中%d個%d,%d個%d)\n”,laO,aO,IbO,bO);)設計2:從n=2位開始統(tǒng)計//求雙碼二部數(shù)從小到大排列的第m個數(shù)#include<stdio.h>voidmain(){inta,b,aO,bO,i,m,n,p,la,laO,IbO;printf(? 請輸入整數(shù)m:");scanf("%d",&m);n=l;p=0;while(l){n++;p++;a=l;b=O;la=l; //默認n位第1個為1后n-1個〇if(p=m){aO=a;bO=b;laO=la;lbO=n-laO;break;}while(la<n-l||a<9||b<8){p++;while(la<n-l||a<9||b<8){p++;if(b=9)if(la=l){a++;b=0;}else{la-;b=a+l;}elseif(b!=a-l)b++;elseif(la!=n-l){la++;b=0;}elseif(b<8)b+=2;//此時b不能增!?有以下2種選擇〃①a增1后,b從〇開始//②a段長增1后,b從a+1開始//a與la不變,b增1//a段長增1后,b從0開始//b增2跳過a=b情形if(p=m){aO=a;bO=b;laO=la;lbO=n-laO;break;})if(p=m)break;)printf(" 第%d個雙碼二部數(shù)為:%d(%d)%d(%d)\n*,m,aO,laO,b,IbO);printfC 其中從小到大第%d個數(shù)為:",m);for(i=l;i<=laO;i++)printfaO);for(i=l;i<=lbO;i++)printfbO);printf("\n"):)數(shù)據(jù)測試:請依次輸入整數(shù)m:2012雙碼二部數(shù)升序序列的第2012個數(shù)為:55999999(式中2個5,6個9)請依次輸入整數(shù)m:20124雙碼二部數(shù)升序序列的第20124個數(shù)為:88882222222222222222222(式中4個8,19個2)5求代數(shù)和設n為正整數(shù),求和s=i+力 g—+ 理——+-±——五——1-1/21-1/2+1/31-1/2+1/3-1/4 l-l/2+-±l/n式中各項符號為ニ正一負,分母符號為一正ー負。正整數(shù)n從鍵盤輸入,輸出和S四舍五入精確到小數(shù)點后5位。輸入n=100 輸出:輸入n=2012輸出S/Z求代數(shù)和1ftinclude<stdio.h>#include<math.h>voidmainO{longj,n;doublets,s;printf(<請輸入n:つ;scanf(*%d*,&n);j=O;ts=O;s=O;while(j<n){J=j+1;if(j%2=0)ts=ts-(double)1/j; //ts為各項的分母elsets=ts+(double)1/j;if(j%3=0)s=s-sqrt(j)/ts;//求代數(shù)和selses=s+sqrt(j)/ts;}printf("s=%.5f\n",s);}/Z求代數(shù)和2tfinclude<stdio.h>#include<math.h>voidmainO{doublej,n,ts,s;printf("請輸入n:");scanf("%lfd",&n);j=O;ts=O;s=O;while(j<n){j=j+l;if(fmod(j,2)=0)ts=ts-l/j! 〃ts為各項的分母elsets=ts+l/j;if(fmod(j,3)=0)s=s-sqrt(j)/ts; //求代數(shù)和selses=s+sqrt(j)/ts;}printf("s=%.5f\n",s);)請輸入n:100s=324.74013請輸入n:2011s=28924.48725請輸入n:2012s=28989.22300變通:設2くn《2012,當n為何值時,和s最接近2012?6合數(shù)世紀探求1.問題的提出20世紀的100個年號[1901—2000]中有13個素數(shù),而21世紀的100個年號[2001,2100]中有14個素數(shù)。那么,是否存在ー個世紀的100個年號中一個素數(shù)都沒有?定義ー個世紀的100個年號中不存在ー個素數(shù),即100個年號全為合數(shù)的世紀稱為合數(shù)世紀。設計程序探索第m(約定水100)個合數(shù)世紀。測試數(shù)據(jù):m=lm=10.設計要點應用窮舉搜索,設置a世紀的的50個奇數(shù)年號(偶數(shù)年號無疑均為合數(shù))為b,用k試商判別b是否為素數(shù),用變量s統(tǒng)計這50個奇數(shù)中的合數(shù)的個數(shù)。對于a世紀,若s=50,即50個奇數(shù)都為合數(shù),找到a世紀為合數(shù)世紀,用n統(tǒng)計合數(shù)世紀的個數(shù)。當n=m時打印輸出a世紀。當n=m時退出循環(huán)結束。.合數(shù)世紀程序設計/Z探求第1個與第m個合數(shù)世紀ftinclude<stdio.h>#include<math.h>voidmainO{longa,b,k;intm,n,s,x;printf(?請確定m: scanf("%d",&m);a=l;n=0;而ile(1){a++;s=0; /Z檢驗a世紀for(b=a*100-99;b<=a*100-1;b+=2) /7窮舉a世紀奇數(shù)年號b{x=0;for(k=3;k<=sqrt(b);k+=2)if(b%k=O){x=l;break;}if(x=0)break; /Z當前為非合數(shù)世紀時,跳出循環(huán)進行下ー個世紀的探求s=s+xJ 〃年號b為合數(shù)時,x=LS增1)if(s=50) //s=50?即50個奇數(shù)均為合數(shù){n++;if(n=m)printf("第%d個合數(shù)世紀為:%ld世紀。、n",n,a);}if(n=m)break;)).程序運行示例請確定m:10第1個合數(shù)世紀為:16719世紀。第10個合數(shù)世紀為:58453世紀。16719世紀盡管是最早的合數(shù)世紀,它的100個年號為[1671801,1671900]全為合數(shù)。這是ー個非常漫長的年代,可謂天長地久,地老天荒!7分解質因數(shù)整數(shù)分解質因數(shù)是最基本的分解。例如,90=2*3*3*5,1960=2飛*5*7,2,前者為質因數(shù)乘積形式,后者為質因數(shù)的指數(shù)形式。

把指定區(qū)間上的所有整數(shù)分解質因數(shù),每一整數(shù)表示為質因數(shù)從小到大順序的乘積形式。如果被分解的數(shù)本身是素數(shù),則注明為素數(shù)。例如,92=2*2*23,91(素數(shù)!).分解:1671861= 5845271= (1)設計要點對每ー個被分解的整數(shù)i?賦值給b(以保持判別運算過程中i不變),用k(從2開始遞增取值)試商:若不能整除,說明該數(shù)k不是b的因數(shù),k增1后繼續(xù)試商。若能整除,說明該數(shù)k是b的因數(shù),打印輸出"k*";b除以k的商賦給b(b=b/k)后繼續(xù)用k試商(注意,可能有多個k因數(shù)),直至不能整除,k增1后繼續(xù)試商。按上述從小至大試商確定的因數(shù)顯然為質因數(shù)。循環(huán)取值k的終值如何確定,一定程度上決定了程序的效率。終值定為i-1或i/2,無效循環(huán)太多。循環(huán)終值定為i的平方根sqrt(i)可大大精簡試商次數(shù),此時如果有大于sqrt(i)的因數(shù)(至多一個!),在試商循環(huán)結束后要注意補上,不要遺失。如果整個試商后b的值沒有任何縮減,仍為原待分解數(shù)i,說明i是素數(shù),作素數(shù)說明標記。(2)質因數(shù)分解乘積形式程序設計/Z質因數(shù)分解乘積形式#include"math.h"^include<stdio.h>voidmainO{longintb,i,k,m,n,w=0;printfC[m,n]中整數(shù)分解質因數(shù)(乘積形式).\n");printf("請輸入m,n:*);scanf("%ld,%ld”,&m,in);for(i=m;i<=n;i++){printf("%ld='i);b=i;k=2;while(k<=sqrt(i)){if(b%k=O){b=b/k:if(b>l){printf("%ld*”,k);continue;)if(b=l)printf(*%ld\n*,k);)k++;}if(b>l&&b<i)//i為待分解的整數(shù)//k為試商因數(shù)//k為質因數(shù),返回再試printfC%ld\n\b); /Z輸出大于i平方根的因數(shù)if(b=i){printf("(素數(shù)!)、n");w++;} //b=i,表示i無質因數(shù))printf("其中共%d個素數(shù).、n",w);}1671861=3*31*179775845276=2*2*223*6553[叫n]中整數(shù)分解質因數(shù)(乘積形式)請輸入m,n:1671801,1671899 (驗證第1個倒數(shù)世紀年號)1671801=3*23*242291671802=2*11*759911671803=7*2388291671804=2*2*3*3*464391671805=5*2392*769*10871671807=3*5572691671808=2*2*2*2*2*2*2*37*3531671809=599*27911671810=2*3*5*7*19*4191671811=137*122031671812=2*2*4179531671813=3*3*3*11*13*4331671814=2*17*491711671815=5*3343631671816=2*2*2*3*41*16991671817=7*241*9911671818=2*8359091671819=3*5572731671820=2*2*5*835911671821=29*576491671822=2*3*3*131*7091671823=191*87531671824=2*2*2*2*7*11*23*591671825=3*5*5*222911671826=2*13*643011671827=61*274071671828=2*2*3*127*10971671829=19*879911671830=2*5*31*53931671831=3*3*7*7*17*2231671832=2*2*2*53*39431671833=1289*12971671834=2*3*2786391671835=5*11*113*2691671836=2*2*4179591671837=3*47*71*1671671838=2*7*1194171671839=13*1286031671840=2*2*2*2*2*3*3*3*3*3*5*431671841=12232*109*76691671843=3*5572811671844=2*2*4179611671845=5*7*37*12911671846=2*3*11*73*3471671847=23*726891671848=2*2*2*17*19*6471671849=3*3*431*4311671850=2*5*5*29*11531671851=67*249531671852=2*2*3*7*13101*165531671854=2*8359271671855=3*5*227*4911671856=2*2*2*2*1044911671857=11*11*41*3371671858=2*3*3*293*3171671859=7*2388371671860=2*2*5*179*4671671861=3*31*179771671862=2*8359311671863=359*46571671864=2*2*2*3*696611671865=5*13*17*17*891671866=2*7*1194191671867=3*3*3*19*32591671868=2*2*11*379971671869=83*201431671870=2*3*5*23*24231671871=487*34331671872=2*2*2*2*2*2*151*1731671873=3*7*796131671874=2*8359371671875=5*5*5*5*5*5*1071671876=2*2*3*3*464411671877=79*211631671878=2*13*643031671879=3*11*292*2*2*5*7*7*8531671881=331*50511671882=2*3*17*37*4431671883=43*59*6591671884=2*2*47*88931671885=3*3*5*53*7011671886=2*19*439971671887=7*2388411671888=2*2*2*2*3*61*5711671889=521*32091671890=2*5*11*151991671891=3*13*163*2631671892=2*2*31*97*1391671893=23*157*4631671894=2*3*3*3*7*44231671895=5*3343791671896=2*2*2*103*20291671897=3*181*30791671898=2*41*203891671899=17*98347其中共〇個素數(shù).8統(tǒng)計試統(tǒng)計含有數(shù)字7且不能被7整除的m位整數(shù)的個數(shù)si,并指出這si個數(shù)中不含有數(shù)字4的整數(shù)的個數(shù)s2o輸入m,輸出si,s2。m=5f輸出: m=6,輸出: (1)設計要點首先通過乘m-1個10計算m位數(shù)的起點b=107m-l),為枚舉提供范圍t(b—10*b-1)〇為了檢測m位數(shù)t含有多少個數(shù)字7,每個m位整數(shù)t賦給d(以保持t不變),然后通過m次求余先后分離出t的m個數(shù)字c,if(c==7)f++,統(tǒng)計整數(shù)t中數(shù)字7的個數(shù)fo同時統(tǒng)計數(shù)字4的個數(shù)g。如果f>0,說明整數(shù)t中含有數(shù)字7。如果g=0,說明整數(shù)t中不含數(shù)字4。對每ー個m位整數(shù),據(jù)f>0&&t%7>0,si作相應統(tǒng)計。據(jù)f>0&&t%7>0&&g=0,s2作相應統(tǒng)計。(2) 程序設計/Z統(tǒng)計含數(shù)字?且不能被7整除的m位整數(shù)的個數(shù)si?其中不含數(shù)字4的個數(shù)s2#include<stdio.h>voidmainO{intc,f,g,i,j,m;longb,d,si,s2,t;printf("請輸入位數(shù)m(2<=m<=9):");scanf("%d",&m);b=l;sl=0;s2=0;for(i=2;i<=m;i++)b=b*10; //計算m位數(shù)的起點for(t=b;t<=10*b-l;t++)/Z枚舉每一個m位數(shù){d=t;f=O;g=O;for(j=l;j<=m;j++){c=d%10;d=d/10:if(c=7)f++;/Z統(tǒng)計數(shù)字7的個數(shù)if(c=4)g++;/Z統(tǒng)計數(shù)字4的個數(shù)}if(f>0&&t%7>0)sl++;/Z統(tǒng)計含數(shù)字7且不能被7整除數(shù)的個數(shù)if(f>0&&t%7>0&&g==0)s2++;/Z統(tǒng)計其中不含數(shù)字4的個數(shù)}printf(*sl=%ld,s2=%ld\n”,si,s2);}(3)程序運行示例請輸入位數(shù)m(2<=k<=9):5sl=32152,s2=20412請輸入位數(shù)m(2<=k<=9):6s1=366522,s2=208300變通1J試統(tǒng)計含有數(shù)字7且能被7整除的沒有重復數(shù)字的m位整數(shù)的個數(shù)si,并指出其中最大的ー個數(shù)。為了比較是否存在重復數(shù)字,設置f數(shù)組,f[3]=2為2個數(shù)字“3”。#include<stdio.h>voidmainO{intc,e,g,i,j,m,f[10];longb,d,si,t;printf("請輸入位數(shù)m(2<=m<=9):“);scanf&m);b=l;sl=0;for(i=2;i<=m;i++)b=b*10; //計算m位數(shù)的起點for(t=b;t<=10*b-l;t++)/Z枚舉每一個m位數(shù){d=t;for(j=0;j<=9;j++)f[j]=0;/Z數(shù)組清零for(j=l;j<=m;j++){c=d%10;d=d/10;f[c]++J 〃統(tǒng)計數(shù)字c的個數(shù))for(g=0,j=0;j<=9;j++)if(f[j]>l)g=l; 〃存在重復數(shù)字標注g=lif(f[7]>0&&t%7==0&&g=0){sl++;e=t;} /Z統(tǒng)計個數(shù),并把滿足條件的數(shù)賦值給e}printf(*sl=%ld,e=%d\n*,si,e);}請輸入位數(shù)m(2<=m<=9):5sl=1978,e=98763請輸入位數(shù)m(2<=m<=9):6sl=11704,e=987651變通2:試統(tǒng)計恰含ー個數(shù)字7與2個數(shù)字4且能被7整除的m(m>3)位整數(shù)的個數(shù)sL并指出其中從小到大排序的第n個數(shù)。ttinclude<stdio.h>voidmain(){intc,e,i,j,m,n,f[10];longb,d,si,t;printf("請輸入m,n:つ;scanf(*%d,%d",&m,&n);b=l;sl=0;for(i=2;i<=m;i++)b=b*10; //計算m位數(shù)的起點for(t=b;t<=10*b-l;t++) /Z枚舉每一個m位數(shù){d=t;for(j=0;j<=9;j++)f[j]=O;/Z數(shù)組清零for(j=l;j<=m;j++){c=d%10;d=d/10;f[c]++; /Z統(tǒng)計數(shù)字c的個數(shù)}if(f[7]=l&&f[4]=2&&t%7=0){sl++;if(sl=n)e=t; /Z統(tǒng)計個數(shù),并把第n個數(shù)賦值給e})printf(* sl=%ld,e=%d\n*?si,e);)請輸入m,n:6,1000sl=4096,e=4172429真分數(shù)最值統(tǒng)計分母在指定區(qū)間[a,b]的最簡真分數(shù)(分子小于分母,且分子分母無公因數(shù))共有多少個,并求其中最接近指定分數(shù)x/y的最簡真分數(shù)。輸入a,b,輸出[a,b]中最簡真分數(shù)的個數(shù)、指出最接近417/2011的最簡真分數(shù)。測試數(shù)據(jù):a=10,b=99,輸出:a=100,b=999.輸出:(1)設計要點設計求解一般情形:統(tǒng)計分母在指定區(qū)間[a,b]的最簡真分數(shù)的個數(shù),并求這些最簡真分數(shù)的和(正整數(shù)a,b從鍵盤輸入)。設分數(shù)分子為i,分母為j,最簡真分數(shù)的個數(shù)為n,其和為so在指定范圍[a,b]內枚舉分數(shù)的分母j:a——b;同時對每ー個分母j枚舉分子i:l——j-lo對每一分數(shù)i/j,置標志t=0,然后進行是否存在公因數(shù)的檢測。如果分子i與分母j存在大于1的公因數(shù)u,說明i/j非最簡真分數(shù),應予舍略。因為分子分母同時約去u后,分母可能不在[a,b],即使在[a,b]時前面已作了統(tǒng)計求和。注意到公因數(shù)u的取值范圍為[2,i],因而設置u循環(huán)在⑵i]中枚舉,若滿足條件j%u==0&&i%u==0說明分子分母存在公因數(shù),標記t=l后退出,不予統(tǒng)計與求和。否則保持原t=0,說明分子分母無公因數(shù),用n實施迭代“n=n+l”統(tǒng)計個數(shù)。為了求最接近s=x/y的最簡真分數(shù),設雙精度型變量smin存儲丨i/j-x/y|的最小值,把分數(shù)i/j轉變?yōu)閐ouble型減去s并求絕對值與smin比較,若fabs((double)i/j-s)<smin,則把fabs((double)i/j-s)賦值給smin,同時用il存儲i,用j存儲lj。每得一個最簡真分數(shù)i/j,就與smin比較一次。枚舉完成,則il/jl即為所求最接近x/y的最簡真分數(shù)。(2)求最簡真分數(shù)程序設計/Z求分母在[a,b]的最簡真分數(shù)的個數(shù),及最接近x/y的分數(shù)0include<stdio.h>^include<math.h>voidmain(){inta,b,i,j,il,jl,t,u,x,y;longn:doubles,smin;printfC最簡真分數(shù)分母在[a,b]內,請確定a,b:");scanf(*%d,%d",&a,&b);/Z輸入?yún)^(qū)間的上下限printf("指定分數(shù)為x/y,請確定x,y:");scanf(*%d,%d",&x,&y);/Z輸入指定分數(shù)

n=0;s=(double)x/y;smin=10;for(j=a;j<=b;j++)for(i=l;i<=j-l;i++){for(t=0,u=2;u<=i;u++)n=0;s=(double)x/y;smin=10;for(j=a;j<=b;j++)for(i=l;i<=j-l;i++){for(t=0,u=2;u<=i;u++)if(j%u==0&&i%u==0){t=l:break;}if(t—0){n++;/Z枚舉最簡真分數(shù)的分母/Z枚舉最簡真分數(shù)的分子/Z枚舉因數(shù)/Z分子分母有公因數(shù),則舍去/Z統(tǒng)計最簡真分數(shù)個數(shù)if(fabs((double)i/j-s)<smin))printf(*printf(*{smin=fabs((double)i/j-s);il=i;jl=j;}/Z比較求最接近x/y的最簡真分數(shù))printf(*printf(*最簡真分數(shù)個數(shù):%ld\n",n);最接近%d/%d的最簡真分數(shù)為:%d/%d\n*,x,y,il,jl);(3)程序運行示例最簡真分數(shù)分母在[a,b]內,請確定a,b:10,99指定分數(shù)為x/y,請確定x,y:417,2011最簡真分數(shù)個數(shù):2976最接近417/2011的最簡真分數(shù)為:17/82最簡真分數(shù)分母在[a,b]內,請確定a,b:100,999指定分數(shù)為x/y,請確定x,y:417,2011最簡真分數(shù)個數(shù):300788最接近417/2011的最簡真分數(shù)為:62/29910特定數(shù)字組成的平方數(shù)用數(shù)字2,3,5,6,7,8,9可組成多少個沒有重復數(shù)字的7位平方數(shù)?解:求出最小7位數(shù)的平方根b,最大7位數(shù)的平方根c.用a枚舉[b,c]中的所有整數(shù),計算d=a*a,這樣確保所求平方數(shù)在d中。設置f數(shù)組統(tǒng)計d中各個數(shù)字的個數(shù)。如果f[3]=2,即平方數(shù)d中有2個“3”。檢測若f[k]>l(k=0__9)?說明d中存在有重復數(shù)字,返回。在不存在重復數(shù)字的情形下,檢測若f[〇]+f[l]+f[4]=〇,說明7位平方數(shù)d中沒有數(shù)字“〇”,"1",“4”,d滿足題意要求,打印輸出。/Z組成沒有重復數(shù)字的7位平方數(shù)ttinclude<math.h>#include<stdio.h>voidmain(){intk,m,n,t,f[10];longa,b,c,d,w;n=0;b=sqrt(2356789);c=sqrt(9876532);for(a=b;a<=c;a++){d=a*a;w=d; /Z確保d為平方數(shù)for(k=0;k<=9:k++)f[k]=0;while(w>0){m=w%10;f[m]++;w=w/10;)for(t=0,k=l;k<=9;k++)if(f[k]>l)t=l; /Z測試平方數(shù)是否有重復數(shù)字if(t==0&&f[0]+f[l]+f[4]=0)/Z測試平方數(shù)中沒有數(shù)字0,1,4{n++;printf("%2d:*,n);printf(*%ld=%ld"2\n”,d,a);printfC共可組成%d個沒有重復數(shù)字的7位平方數(shù).\n",n);}3297856=1816-23857296=1964へ25827396=2414へ26385729=2527"28567329=2927-29572836=3094-2共可組成6個沒有重復數(shù)字的7位平方數(shù).變通1:用1,2,…,9這9個數(shù)字可以組成多少個沒有重復數(shù)字的9位平方數(shù)?/Z組成沒有重復數(shù)字的9位平方數(shù)?include<math.h>ttinclude<stdio.h>voidmain(){intk,m,n,t,f[10];longa,b,c,d,w;n=0;b=(int)sqrt(123456789);c=(int)sqrt(987654321);for(a=b;a<=c;a++){d=a*a;w=d; /Z確保d為平方數(shù)for(k=0;k<=9;k++)f[k]=0;while(w>0){m=w%10;f[m]++;w=w/10;}for(t=0,k=l;k<=9;k++)

也沒有數(shù)字0if(f[k]>l)t=l;/Z測試平方數(shù)是否有重復數(shù)字if(t==O&&f[0]==0)/Z測試平方數(shù)中沒有重復數(shù)字,也沒有數(shù)字0printf(*%2d:*,n);printf(*%ld=%ld*2\n*.d,a);}}printf(?共可組成%d個沒有重復數(shù)字的9位平方數(shù).'n",I}139854276=11826へ2152843769=12363~2157326849=12543^2215384976=14676~2245893761=15681へ2254817369=15963^2326597184=18072へ2361874529=19023へ2375468129=19377"382945761=19569"385297641=19629"412739856=20316"523814769=22887"529874361=23019"537219684=23178"549386721=23439"587432169=24237"589324176=24276"597362481=24441"615387249=24807"627953481=25059"653927184=25572"672935481=25941"697435281=26409"714653289=26733"735982641=27129"743816529=27273"842973156=29034"847159236=29106"923187456=30384"共可組成30個沒有重復數(shù)字的9位平方數(shù).1I構建橫豎折對稱方陣試觀察圖所示的橫豎折對稱方陣的構造特點,總結歸納其構造規(guī)律,設計并輸出n(奇數(shù))階對稱方陣。3210123221012211101110000000111011122101223210123圖7階橫豎對稱方陣輸出15階、19階橫豎折對稱方陣。解:這是一道培養(yǎng)與鍛煉觀察能力、歸納能力與設計能力的有趣案例。設置2維數(shù)組a[n][n]存儲n階方陣的元素,數(shù)組a[n][n]就是數(shù)據(jù)結構。本案例求解算法主要是給a數(shù)組賦值與輸出。ー個ー個元素賦值顯然行不通,必須根據(jù)方陣的構造特點,歸納其構建規(guī)律,分區(qū)域給各元素賦值。(1)構造規(guī)律與賦值要點觀察橫豎折對稱方陣的構造特點,方陣橫向與縱向正中有一對稱軸。兩對稱軸所分4個小矩形區(qū)域表現(xiàn)為同數(shù)字橫豎折遞減,至4頂角元素為1。設階數(shù)n(奇數(shù))從鍵盤輸入,對稱軸為m=(n+l)/2。設置2維a數(shù)組存儲方陣中元素,行號為i,列號為j, 為第i行第j列元素??芍鲗蔷€(從左上至右下)有:i=j;次對角線(從右上至左下)有:i+j=n+lo按兩條對角線把方陣分成上部、左部、右部與下部4個區(qū),如圖所示。圖對角線分成的4個區(qū)對角線上元素可歸納到上、下部,即上、下部區(qū)域帶等號即可。上、下部按列號j的函數(shù)m-abs(m-j)賦值:if(i+j<=n+l&&i<=jIIi+j>=n+l&&i>=j)a[i][j]=m-abs(m-j);左、右部按行號i的函數(shù)m-abs(m-i)賦值:if(i+j<n+l&&i>j11i+j>n+l&&i<j)a[i][j]=m-abs(m-i);輸出時,按m-a[i][j]打印。(2)程序設計/Z橫豎折對稱方陣^include<stdio.h> /Z調用2個頭文件#include<math.h>voidmain(){inti,j

溫馨提示

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

評論

0/150

提交評論