2023年程序設(shè)計(jì)競賽選拔賽實(shí)訓(xùn)_第1頁
2023年程序設(shè)計(jì)競賽選拔賽實(shí)訓(xùn)_第2頁
2023年程序設(shè)計(jì)競賽選拔賽實(shí)訓(xùn)_第3頁
2023年程序設(shè)計(jì)競賽選拔賽實(shí)訓(xùn)_第4頁
2023年程序設(shè)計(jì)競賽選拔賽實(shí)訓(xùn)_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

2023程序設(shè)計(jì)競賽選拔賽(實(shí)訓(xùn)8)1、排列數(shù)由1個(gè)“1”,2個(gè)“2”,k個(gè)“3”(1≤k≤6)能組成多少個(gè)不同的排列?輸入k,輸出排列個(gè)數(shù)。k=4,輸出:k=5,輸出:(1)設(shè)計(jì)要點(diǎn)注意到1個(gè)“1”,2個(gè)“2”,k個(gè)“3”組成k+3位數(shù),一方面通過k+2個(gè)10相乘計(jì)算k+3位數(shù)的起點(diǎn)b=10^(k+2),為枚舉提供范圍t(b—4*b-1)。為了檢測k+3位數(shù)t具有多少個(gè)數(shù)字1、2、3,每個(gè)k+3位整數(shù)t賦給d(以保持t不變),然后通過k+3次求余先后分離出t的k+3個(gè)數(shù)字c:if(c==1)f++,記錄整數(shù)t中數(shù)字1的個(gè)數(shù)f;if(c==2)g++,記錄整數(shù)t中數(shù)字2的個(gè)數(shù)g;if(c==3)h++,記錄整數(shù)t中數(shù)字3的個(gè)數(shù)h。檢測每一個(gè)k+3位整數(shù):若f=1andg=2andh=k,則應(yīng)用s進(jìn)行記錄。最后輸出所得排列個(gè)數(shù)s。(2)程序設(shè)計(jì)//排列數(shù)#include<stdio.h>voidmain(){intc,f,g,h,i,j,k;longb,d,s,t;printf("請(qǐng)輸入數(shù)字3的個(gè)數(shù)k(1≤k≤6):");scanf("%d",&k);b=1;s=0;for(i=1;i<=k+2;i++)b=b*10;//計(jì)算k+3位數(shù)的起點(diǎn)for(t=b;t<=4*b-1;t++)//枚舉首位為3的k+3位數(shù){d=t;f=0;g=0;h=0;for(j=1;j<=k+3;j++)?{c=d%10;d=d/10;if(c==1)f++;//記錄數(shù)字1的個(gè)數(shù)if(c==2)g++;//記錄數(shù)字2的個(gè)數(shù)if(c==3)h++;//記錄數(shù)字3的個(gè)數(shù)?} if(f==1&&g==2&&h==k)s++;//記錄個(gè)數(shù)s }printf("s=%ld\n",s);}(3)程序運(yùn)營示例請(qǐng)輸入數(shù)字3的個(gè)數(shù)k(1≤k≤6):4s=105請(qǐng)輸入數(shù)字3的個(gè)數(shù)k(1≤k≤6):5s=168(4)拓廣若需求k=100時(shí)的排列數(shù),如何求?1)注意到一排k個(gè)“3”的空位共k+1個(gè)。這k+1個(gè)選2個(gè)空位共C(k+1,2)種組合,每一空位放置1個(gè)“2”。這k+1個(gè)選1個(gè)空位共C(k+1,1)種組合,空位中放置2個(gè)“2”。2)注意到一排k個(gè)“3”與2個(gè)“2”的空位共k+3個(gè)。這k+3個(gè)選1個(gè)空位共C(k+3,1)種組合,空位中放置1個(gè)“1”。3)因而得不同的排列數(shù)為:(C(k+1,2)+C(k+1,1))*C(k+3,1)=(k+1)*(k+2)*(k+3)/2//排列數(shù)#include<stdio.h>voidmain(){intk;longs;printf("請(qǐng)輸入數(shù)字3的個(gè)數(shù)k:");scanf("%d",&k);s=(k+1)*(k+2)*(k+3)/2;printf("s=%ld\n",s);}請(qǐng)輸入數(shù)字3的個(gè)數(shù)k:100s=530553(5)實(shí)訓(xùn)1計(jì)算由2個(gè)“1”、2個(gè)“2”、k個(gè)“3”的排列數(shù)。計(jì)算由3個(gè)“1”、2個(gè)“2”、k個(gè)“3”的排列數(shù)。測試數(shù)據(jù):k=502、求最值設(shè)n為正整數(shù),,式中各項(xiàng)符號(hào)為二正一負(fù)。求當(dāng)n為多大時(shí),s(n)最接近指定的正整數(shù)a?輸入a,輸出s(n)最接近a的n,s(n)。(1)輸入1000,輸出:(2)輸入2023,輸出:解:一般地求當(dāng)n為多大時(shí),s(n)最接近正整數(shù)a?其中a從鍵盤輸入a。//s(n)=1+1/(1+1/2)-1/(1+1/2+1/3)+...+1/(1+1/2+...+1/n)#include<stdio.h>#include<mat(yī)h.h>voidmain(){longa,n,n1;doublem,ts,s,s1;printf("請(qǐng)輸入a:");scanf("%d",&a);n=0;ts=0;s=0;m=100000.0;while(s<a+10){n=n+1;ts=ts+(double)1/n;//ts為各項(xiàng)的分母?if(n%3==0)s=s-1/ts;//求代數(shù)和s?elses=s+1/ts;if(fabs(s-a)<m)//比較,當(dāng)n=n1時(shí),和s1最接近a{m=fabs(s-a);n1=n;s1=s;}}printf("n=%ld,s(%d)=%f\n",n1,n1,s1);}請(qǐng)輸入a:1000n=29126,s(29126)=999.959989請(qǐng)輸入a:2023n=63376,s(63376)=2023.040087實(shí)訓(xùn)2:設(shè)n為正整數(shù),,式中各項(xiàng)符號(hào)為二正一負(fù),分母符號(hào)一正一負(fù)。求當(dāng)n為多大時(shí),s(n)最接近指定的正整數(shù)a?輸入a,輸出s(n)最接近a的n,s(n)。測試數(shù)據(jù):a=20233、倒立的勾股數(shù)把求勾股數(shù)變通為求倒立的勾股數(shù)。定義滿足方程式的正整數(shù)x,y,z,稱為一組倒立的勾股數(shù)。試求指定區(qū)間[a,b]內(nèi)的倒立勾股數(shù)組。(1)求指定區(qū)間[30,100]內(nèi)的倒立勾股數(shù)組.(2)求指定區(qū)間[100,200]內(nèi)的倒立勾股數(shù)組.(1)設(shè)計(jì)要點(diǎn)顯然,倒立勾股數(shù)組中x,y不也許相等,且x,y>z。為避免反復(fù),不妨設(shè)x>y>z。在指定區(qū)間[a,b]上根據(jù)x,y,z的大小關(guān)系設(shè)立循環(huán):z從a至b-2,y從z+1至b-1,x從y+1至b。對(duì)每一組x,y,z,假如直接應(yīng)用條件式1/(x*x)+1/(y*y)=1/(z*z)作判別,因分?jǐn)?shù)計(jì)算的不可避免的誤差,有也許把一些成立的倒立勾股數(shù)組解遺失,即導(dǎo)致漏掉。注意到上述分?jǐn)?shù)條件式作通分整理得到的下面的正整數(shù)條件式z*z*(x*x+y*y)=x*x*y*y程序中為防止發(fā)生解的漏掉,應(yīng)用上述整數(shù)條件作判別是適宜的。(2)求區(qū)間內(nèi)倒立勾股數(shù)程序設(shè)計(jì)//求指定區(qū)間內(nèi)倒立勾股數(shù)組#include<stdio.h>#include<math.h>voidmain(){inta,b,n;longx,y,z;printf("求指定區(qū)間[a,b]內(nèi)倒立的勾股數(shù)組.");printf("\n請(qǐng)輸入?yún)^(qū)間[a,b]的上下限a,b:");scanf("%d,%d",&a,&b);printf("\n區(qū)間[%d,%d]中倒立的勾股數(shù)組有:\n",a,b);n=0;for(z=a;z<=b-2;z++)for(y=z+1;y<=b-1;y++)for(x=y+1;x<=b;x++)if(z*z*(x*x+y*y)==x*x*y*y)//滿足倒立勾股數(shù)條件時(shí)輸出{n++;printf("1/%ld^2+1/%ld^2=1/%ld^2\n",x,y,z);}printf("共%d組勾股數(shù).",n);}(3)程序運(yùn)營示例區(qū)間[30,100]中倒立的勾股數(shù)組有:1/60^2+1/45^2=1/36^21/80^2+1/60^2=1/48^21/100^2+1/75^2=1/60^2共3組勾股數(shù).區(qū)間[100,200]中倒立的勾股數(shù)組有:1/180^2+1/135^2=1/108^21/200^2+1/150^2=1/120^2共2組勾股數(shù).4、雙和數(shù)組尋求6個(gè)互不相等的正整數(shù)a,b,c,d,e,f并提成(a,b,c)與(d,e,f)兩個(gè)組,若這兩組數(shù)具有以下兩個(gè)相等特性:則把數(shù)組(a,b,c)與(d,e,f)稱為雙和數(shù)組(約定a<b<c,d<e<f,a<d)。1)設(shè)a+b+c=d+e+f=s,存在雙和數(shù)組,s至少為多大?2)當(dāng)s=98時(shí)有多少個(gè)不同的雙和數(shù)組?(1)求解要點(diǎn)從鍵盤輸入整數(shù)s,因6個(gè)不同正整數(shù)之和至少為21,即輸入整數(shù)s≥11。設(shè)立a,b與d,e循環(huán)。注意到a+b+c=s,且a<b<c,因而a,b循環(huán)取值為:a:1——(s-3)/3。因b比a至少大1,c比a至少大2。b:a+1——(s-a-1)/2。因c比b至少大1。c=s-a=b。設(shè)立d,e循環(huán)基本同上,只是d>a,因而d起點(diǎn)為a+1。把比較倒數(shù)和相等1/a+1/b+1/c=1/d+1/e+1/f轉(zhuǎn)化為比較整數(shù)相等d*e*f*(b*c+c*a+a*b)=a*b*c*(e*f+f*d+d*e)(*)若上式不成立,即倒數(shù)和不相等,則返回。同時(shí)注意到兩個(gè)3元組中若部分相同部分不同,不能有倒數(shù)和相等,因而可省略排除以上6個(gè)正整數(shù)中是否存在相等的檢測。若式(*)成立,打印輸出和為s的雙和數(shù)組,并用x記錄解的個(gè)數(shù)。(2)C程序設(shè)計(jì)//雙和數(shù)組探索#include<stdio.h>#include<math.h>voidmain(){inta,b,c,d,e,f,x,s;for(s=21;s<=100;s++){printf("s=%d:\n",s);x=0;for(a=1;a<=(s-3)/3;a++)for(b=a+1;b<=(s-a-1)/2;b++)for(d=a+1;d<=(s-3)/3;d++)for(e=d+1;e<=(s-d-1)/2;e++){c=s-a-b;f=s-d-e;if(a*b*c*(e*f+f*d+d*e)!=d*e*f*(b*c+c*a+a*b))continue;//排除倒數(shù)和不相等x++;printf("%3d:(%2d,%2d,%2d)",x,a,b,c);printf("(%2d,%2d,%2d)\n",d,e,f);}if(x==0)printf("無解!\n");}}(3)程序運(yùn)營結(jié)果與討論s=26:1:(4,10,12)(5,6,15)s=98:1:(2,36,60)(3,5,90)2:(7,28,63)(8,18,72)3:(7,35,56)(8,20,70)4:(10,33,55)(12,20,66)(4)實(shí)訓(xùn)3尋求6個(gè)互不相等的正整數(shù)a,b,c,d,e,f并提成(a,b,c)與(d,e,f)兩個(gè)組,若這兩組數(shù)具有以下兩個(gè)相等特性:則把數(shù)組(a,b,c)與(d,e,f)稱為和積數(shù)組(約定a<b<c,d<e<f,a<d)。1)設(shè)a+b+c=d+e+f=s,存在和積數(shù)組,s至少為多大?2)當(dāng)s=89時(shí)有多少個(gè)不同的和積數(shù)組?5、m位完美平方數(shù)用0,1,2,...,9能組成多少個(gè)沒有反復(fù)數(shù)字的m(1<m≤10)位平方數(shù)?輸入m,輸出沒有反復(fù)數(shù)字的m位平方數(shù)的個(gè)數(shù),并輸出其中最大的。m=7,輸出:m=10,輸出://用0,1,2,...,9組成沒有反復(fù)數(shù)字的m位平方數(shù)#include<math.h>#include<stdio.h>voidmain(){intk,m,n,t,f[10];doublea,b,c,d,w,x,a1,d1;printf("請(qǐng)擬定整數(shù)m:");scanf("%d",&m);x=1.0;for(k=2;k<=m;k++)x=x*10;//擬定m位數(shù)的起點(diǎn)xn=0;b=(int)pow(x,0.5);c=pow(10*x-1,0.5);for(a=b+1;a<=c;a++){d=a*a;w=d;//保證d為m位平方數(shù)for(k=0;k<=9;k++)f[k]=0;while(w>0){t=(int)fmod(w,10);f[t]=f[t]+1;w=floor(w/10);}for(t=0,k=0;k<=9;k++)if(f[k]>1){t=1;break;}//測試平方數(shù)是否有反復(fù)數(shù)字if(t==0)//測試平方數(shù)中沒有反復(fù)數(shù)字{n++;d1=d;a1=a;}}printf("共可組成%d個(gè)沒有反復(fù)數(shù)字的%d位平方數(shù).",n,m);printf("其中最大的為:%.0f=%.0f^2\n",d1,a1);}請(qǐng)擬定整數(shù)m:7共可組成123個(gè)沒有反復(fù)數(shù)字的7位平方數(shù).其中最大的為:9872164=3142^2請(qǐng)擬定整數(shù)m:10共可組成87個(gè)沒有反復(fù)數(shù)字的10位平方數(shù).其中最大的為:=99066^2實(shí)訓(xùn)4:用0,1,2,...,9能組成沒有反復(fù)數(shù)字的m(1<m≤10)位平方數(shù)的個(gè)數(shù)為s(m).問:(1)求s(10),即求出沒有反復(fù)數(shù)字的10位平方數(shù)的個(gè)數(shù)。(2)當(dāng)m為多大時(shí),沒有反復(fù)數(shù)字的m位平方數(shù)個(gè)數(shù)s(m)最大?6、最小01串積程序設(shè)計(jì)愛好者A,B進(jìn)行計(jì)算游戲:B任給一個(gè)正整數(shù)b,A尋求另一個(gè)整數(shù)a,使a與b的積最小且全為0與1組成的數(shù)。例如,B給出整數(shù)24,A尋求整數(shù)a:4625,使得a*b的最小01串積為:111000輸入b,輸出a與最小01串積。b=24,輸出:b=2023,輸出:(1)對(duì)a枚舉考慮到a與積d也許大于10位,用雙精度型。對(duì)a遞增枚舉,檢測積d=a*b是否為01串//01串積對(duì)a枚舉#include<math.h>#include<stdio.h>voidmain(){longc,t;doublea,b,d,j;printf("B給出整數(shù)b:");scanf("%lf",&b);a=1;while(1){a++;d=a*b;j=d;t=0;while(j>0)//分離積的各個(gè)數(shù)字c{c=(int)fmod(j,10);j=floor(j/10); if(c>1){t=1;break;}//檢測是否具有0,1以外的數(shù)字?} if(t==0)?{printf("A尋求整數(shù)a:%.0f:\n",a); printf("a*b的最小01串積為:%.0f\n",d);?break;?}}}B給出整數(shù)b:73A尋求整數(shù)a:137:a*b的最小01串積為:10001B給出整數(shù)b:54A尋求整數(shù)a::a*b的最小01串積為:(2)二進(jìn)制枚舉,應(yīng)用余數(shù)判別。1)注意到01串積為十進(jìn)制數(shù),應(yīng)用求余運(yùn)算“%”可分別求得個(gè)位“1”,十位“1”,…,分別除以已給b的余數(shù),存放在c數(shù)組中:c(1)為1,c(2)為10除以b的余數(shù),c(3)為100除以b的余數(shù),…。2)要從小到大搜索01串,不反復(fù)也不漏掉,從中找出最小的能被b整除01串積。為此,設(shè)立k從1開始遞增,把k轉(zhuǎn)化為二進(jìn)制,就得到所需要的這些串。但是,這時(shí)每個(gè)串不再看作二進(jìn)制數(shù),而要看作十進(jìn)制數(shù)。3)在某一k轉(zhuǎn)化為二進(jìn)制數(shù)過程中,每轉(zhuǎn)化一位a(i)(0或1),求出該位除以b的余數(shù)a(i)*c(i),通過累加求和得k轉(zhuǎn)化的整個(gè)二進(jìn)制數(shù)除以b的余數(shù)s。4)判別余數(shù)s是否被b整除:若s%b=0,即找到所求最小的01串積。a從高位開始除以b的商存儲(chǔ)在d數(shù)組,實(shí)行整數(shù)除法運(yùn)算:x=e*10+a[j];//e為上輪余數(shù),x為被除數(shù)d[j]=x/b;//d為a從高位開始除以b的商e=x%b;//e為試商余數(shù)去掉d數(shù)組的高位“0”后,輸出d即為所尋求的數(shù)。最后從高位開始打印a數(shù)組,即為01串積。(3)程序設(shè)計(jì)//01串積二進(jìn)制枚舉#include<stdio.h>voidmain(){intb,e,i,j,t,x,a[2023],d[2023],c[2023];longk,s;printf("B給出整數(shù)b:");scanf("%d",&b);c[1]=1;for(i=2;i<200;i++)c[i]=10*c[

溫馨提示

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

評(píng)論

0/150

提交評(píng)論