C語言競賽練習題40題(答案)_第1頁
C語言競賽練習題40題(答案)_第2頁
C語言競賽練習題40題(答案)_第3頁
C語言競賽練習題40題(答案)_第4頁
C語言競賽練習題40題(答案)_第5頁
已閱讀5頁,還剩46頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C語言競賽練習題11.求最大數(shù)問555555的約數(shù)中最大的三位數(shù)是多少?*問題分析與算法設計根據(jù)約數(shù)的定義,對于一個整數(shù)N,除去1和它自身外,凡能整除N的數(shù)即為N的約數(shù)。因此,最簡單的方法是用2到N-1之間的所有數(shù)去除N,即可求出N的全部約數(shù)。本題只要求取約數(shù)中最大的三位數(shù),則其取值范圍可限制在100到999之間。*程序說明與注釋#include<stdio.h>voidmain(){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:7772.高次方數(shù)的尾數(shù)求13的13次方的最后三位數(shù)*問題分析與算法設計解本題最直接的方法是:將13累乘13次方截取最后三位即可。但是由于計算機所能表示的整數(shù)范圍有限,用這種“正確”的算法不可能得到正確的結果。事實上,題目僅要求最后三位的值,完全沒有必要求13的13次方的完整結果。研究乘法的規(guī)律發(fā)現(xiàn):乘積的最后三位的值只與乘數(shù)和被乘數(shù)的后三位有關,與乘數(shù)和被乘數(shù)的高位無關。利用這一規(guī)律,可以大大簡化程序。*程序說明與注釋#include<stdio.h>voidmain(){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**13Thelast3digitsof13**13is:253InputXandY(X**Y):13**20Thelast3digitsof13**20is:8013.借書方案知多少小明有五本新書,要借給A,B,C三位小朋友,若每人每次只能借一本,則可以有多少種不同的借法?*問題分析與算法設計本問題實際上是一個排列問題,即求從5個中取3個進行排列的方法的總數(shù)。首先對五本書從1至5進行編號,然后使用窮舉的方法。假設三個人分別借這五本書中的一本,當三個人所借的書的編號都不相同時,就是滿足題意的一種借閱方法。*程序說明與注釋voidmain(){inta,b,c,count=0;printf("TherearediffrentmethodsforXMtodistributebooksto3readers:\\n");for(a=1;a<=5;a++)for(b=1;b<=5;b++)/*窮舉第一個人借5本書中的1本的全部情況*//*窮舉第二個人借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,36:1,3,511:1,5,316:2,3,121:2,4,526:3,1,431:3,4,12:1,2,47:1,4,212:1,5,417:2,3,422:2,5,127:3,1,532:3,4,23:1,2,58:1,4,313:2,1,318:2,3,523:2,5,328:3,2,133:3,4,54:1,3,29:1,4,514:2,1,419:2,4,124:2,5,429:3,2,434:3,5,15:1,3,410:1,5,215:2,1,520:2,4,325:3,1,230:3,2,535:3,5,236:3,5,441:4,2,346:4,5,151:5,1,456:5,3,237:4,1,242:4,2,547:4,5,252:5,2,157:5,3,438:4,1,343:4,3,148:4,5,353:5,2,358:5,4,139:4,1,544:4,3,249:5,1,254:5,2,459:5,4,240:4,2,145:4,3,550:5,1,355:5,3,160:5,4,34.數(shù)制轉換將任一整數(shù)轉換為二進制形式*問題分析與算法設計將十進制整數(shù)轉換為二進制的方法很多,這里介紹的實現(xiàn)方法利用了C語言能夠對位進行操作的特點。對于C語言來說,一個整數(shù)在計算機內就是以二進制的形式存儲的,所以沒有必要再將一個整數(shù)經過一系列的運算轉換為二進制形式,只要將整數(shù)在內存中的二進制表示輸出即可。*程序說明與注釋#include<stdio.h>voidprintb(int,int);voidmain(){intx;printf("Inputnumber:");scanf("%d",&x);printf("numberofdecimalform:%d\\n",x);printf("it\'sbinaryform:");printb(x,sizeof(int)*8);/*x:整數(shù)sizeof(int):int型在內存中所占的字節(jié)數(shù)sizeof(int)*8:int型對應的位數(shù)*/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:8it\'sbunaryform:0000000000001000輸入:-8輸出:numberofdecimalform:-8it\'sbinaryform:0輸入:32767輸出:numberofdecimalform:32767it\'sbinaryform:0輸入:-32768輸出:numberofdecimalform:-32768it\'sbinaryform:0輸入:128輸出:numberofdecimalform:128it\'sbinaryform:000000005.打魚還是曬網(wǎng)中國有句俗語叫“三天打魚兩天曬網(wǎng)”。某人從1990年1月1日起開始“三天打魚兩天曬網(wǎng)”,問這個人在以后的某一天中是“打魚”還是“曬網(wǎng)”。*問題分析與算法設計根據(jù)題意可以將解題過程分為三步:1)計算從1990年1月1日開始至指定日期共有多少天;2)由于“打魚”和“曬網(wǎng)”的周期為5天,所以將計算出的天數(shù)用5去除;3)根據(jù)余數(shù)判斷他是在“打魚”還是在“曬網(wǎng)”;若余數(shù)為1,2,3,則他是在“打魚”否則是在“曬網(wǎng)”在這三步中,關鍵是第一步。求從1990年1月1日至指定日期有多少天,要判斷經歷年份中是否有閏年,二月為29天,平年為28天。閏年的方法可以用偽語句描述如下:如果((年能被4除盡且不能被100除盡)或能被400除盡)則該年是閏年;否則不是閏年。C語言中判斷能否整除可以使用求余運算(即求模)*程序與程序注釋#include<stdio.h>intdays(structdateday);structdate{intyear;intmonth;intday;};voidmain(){structdatetoday,term;intyearday,year,day;printf("Enteryear/month/day:");scanf("%d%d%d",&today.year,&today.month,&today.day);/*輸入日期*/term.month=12;term.day=31;/*設置變量的初始值:月*//*設置變量的初始值:日*/for(yearday=0,year=1990;year<today.year;year++){term.year=year;yearday+=days(term);/*計算從1990年至指定年的前一年共有多少天*/}yearday+=days(today);day=yearday%5;/*加上指定年中到指定日期的天數(shù)*//*求余數(shù)*/if(day>0&&day<4)printf("hewasfishingatthatday.\\n");/*打印結果*/elseprintf("Hewassleepingatthatday.\\n");}intdays(structdateday){staticintday_tab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31,},/*平均每月的天數(shù)*/{0,31,29,31,30,31,30,31,31,30,31,30,31,},};inti,lp;lp=day.year%4==0&&day.year%100!=0||day.year%400==0;/*判定year為閏年還是平年,lp=0為平年,非0為閏年*/for(i=1;i<day.month;i++)day.day+=day_tab[lp];returnday.day;}/*計算本年中自1月1日起的天數(shù)*/*運行結果Enteryear/month/day:19911025Hewasfishingatday.Enteryear/month/day:19921025Hewassleepingatday.Enteryear/month/day:19931025Hewassleepingatday--6.抓交通肇事犯一輛卡車違反交通規(guī)則,撞人后逃跑?,F(xiàn)場有三人目擊事件,但都沒有記住車號,只記下車號的一些特征。甲說:牌照的前兩位數(shù)字是相同的;乙說:牌照的后兩位數(shù)字是相同的,但與前兩位不同;丙是數(shù)學家,他說:四位的車號剛好是一個整數(shù)的平方。請根據(jù)以上線索求出車號。*問題分析與算法設計按照題目的要求造出一個前兩位數(shù)相同、后兩位數(shù)相同且相互間又不同的整數(shù),然后判斷該整數(shù)是否是另一個整數(shù)的平方。*程序與程序注釋#include<stdio.h>#include<math.h>voidmain(){inti,j,k,c;for(i=1;i<=9;i++)/*i:車號前二位的取值*//*j:車號后二位的取值*/for(j=0;j<=9;j++)if(i!=j){/*判斷二位數(shù)字是否相異*/k=i*1000+i*100+j*10+j;/*計算出可能的整數(shù)*/for(c=31;c*c<k;c++);/*判斷該數(shù)是否為另一整數(shù)的平方*/if(c*c==k)printf("Lorry--No.is%d.\\n",k);/*若是,打印結果*/}}*運行結果Lorry_No.is77447.該存多少錢假設銀行一年整存零取的月息為0.63%。現(xiàn)在某人手中有一筆錢,他打算在今后的五年中的年底取出1000元,到第五年時剛好取完,請算出他存錢時應存入多少。*問題分析與算法設計分析存錢和取錢的過程,可以采用倒推的方法。若第五年年底連本帶息要取1000元,則要先求出第五年年初銀行存款的錢數(shù):第五年初存款=1000/(1+12*0.0063)依次類推可以求出第四年、第三年......的年初銀行存款的錢數(shù):第四年年初存款=(第五年年初存款+1000)/(1+12*0.0063)第三年年初存款=(第四年年初存款+1000)/(1+12*0.0063)第二年年初存款=(第三年年初存款+1000)/(1+12*0.0063)第一年年初存款=(第二年年初存款+1000)/(1+12*0.0063)通過以上過程就可以很容易地求出第一年年初要存入多少錢。*程序與程序注釋#include<stdio.h>voidmain(){inti;floattotal=0;for(i=0;i<5;i++)/*i為年數(shù),取值為0~4年*/total=(total+1000)/(1+0.0063*12);/*累計算出年初存款數(shù)額,第五次的計算結果即為題解*/printf("Hemustsave%.2fatfirst.\\n",total);}*運行結果Hemustsave4039.44atfirst8.怎樣存錢利最大假設銀行整存整取存款不同期限的月息利率分別為:0.63%期限=1年0.66%期限=2年0.69%期限=3年0.75%期限=5年0.84%期限=8年利息=本金*月息利率*12*存款年限。現(xiàn)在某人手中有2000元錢,請通過計算選擇一種存錢方案,使得錢存入銀行20年后得到的利息最多(假定銀行對超過存款期限的那一部分時間不付利息)。*問題分析與算法為了得到最多的利息,存入銀行的錢應在到期時馬上取出來,然后立刻將原來的本金和利息加起來再作為新的本金存入銀行,這樣不斷地滾動直到滿20年為止,由于存款的利率不同,所以不同的存款方法(年限)存20年得到的利息是不一樣的。分析題意,設2000元存20年,其中1年存i1次,2年存i2次,3年存i3次,5年存i5次,8年存i8次,則到期時存款人應得到的本利合計為:2000*(1+rate1)i1*(1+rate2)i2*(1+rate3)i3*(1+rate5)i5*(1+rate8)i8其中rateN為對應存款年限的利率。根據(jù)題意還可得到以下限制條件:0<=i8<=20<=i5<=(20-8*i8)/50<=i3<=(20-8*i8-5*i5)/30<=i2<=(20-8*i8-5*i5-3*i3)/20<=i1=20-8*i8-5*i5-3*i3-2*i2可以用窮舉法窮舉所有的i8、i5、i3、i2和i1的組合,代入求本利的公式計算出最大值,就是最佳存款方案。*程序與程序注釋#include<stdio.h>#include<math.h>voidmain(){inti8,i5,i3,i2,i1,n8,n5,n3,n2,n1;floatmax=0,term;for(i8=0;i8<3;i8++)/*窮舉所有可能的存款方式*/for(i5=0;i5<=(20-8*i8)/5;i5++)for(i3=0;i3<=(20-8*i8-5*i5)/3;i3++)for(i2=0;i2<=(20-8*i8-5*i5-3*i3)/2;i2++){i1=20-8*i8-5*i5-3*i3-2*i2;term=2000.0*pow((double)(1+0.0063*12),(double)i1)*pow((double)(1+2*0.0063*12),(double)i2)*pow((double)(1+3*0.0069*12),(double)i3)*pow((double)(1+5*0.0075*12),(double)i5)*pow((double)(1+8*0.0084*12),(double)i8);/*計算到期時的本利合計*/if(term>max){max=term;n1=i1;n2=i2;n3=i3;n5=i5;n8=i8;}}printf("Formaxinumprofit,heshouldsosavehismoneyinabank:\\n");printf("madefixeddepositfor8year:%dtimes\\n",n8);printf("madefixeddepositfor5year:%dtimes\\n",n5);printf("madefixeddepositfor3year:%dtimes\\n",n3);printf("madefixeddepositfor2year:%dtimes\\n",n2);printf("madefixeddepositfor1year:%dtimes\\n",n1);printf("Toal:%.2f\\n",max);/*輸出存款方式*/}*運行結果Formaxinumprofit,heshouldsosavehismoneyinabank:madefixeddepositfor8year:0timesmadefixeddepositfor5year:4timesmadefixeddepositfor3year:0timesmadefixeddepositfor2year:0timesmadefixeddepositfor1year:0timesTotal:8841.01可見最佳的存款方案為連續(xù)四次存5年期。9.捕魚和分魚A、B、C、D、E五個人在某天夜里合伙去捕魚,到第二天凌晨時都疲憊不堪,于是各自找地方睡覺。日上三桿,A第一個醒來,他將魚分為五份,把多余的一條魚扔掉,拿走自己的一份。B第二個醒來,也將魚分為五份,把多余的一條魚扔掉,保持走自己的一份。C、D、E依次醒來,也按同樣的方法拿走魚。問他們合伙至少捕了多少條魚?*問題分析與算法設計根據(jù)題意,總計將所有的魚進行了五次平均分配,每次分配時的策略是相同的,即扔掉一條魚后剩下的魚正好分成五份,然后拿走自己的一份,余下其它的四份。假定魚的總數(shù)為X,則X可以按照題目的要求進行五次分配:X-1后可被5整除,余下的魚為4*(X-1)、5。若X滿足上述要求,則X就是題目的解。*程序與程序注釋#include<stdio.h>voidmain(){intn,i,x,flag=1;/*flag:控制標記*/for(n=6;flag;n++)/*采用試探的方法。令試探值n逐步加大*/{for(x=n,i=1&&flag;i<=5;i++)if((x-1)%5==0)x=4*(x-1)/5;elseflag=0;if(flag)break;elseflag=1;}/*若不能分配則置標記falg=0退出分配過程*//*若分配過程正常結束則找到結果退出試探的過程*//*否則繼續(xù)試探下一個數(shù)*/printf("Totalnumberoffishcatched=%d\\n",n);/*輸出結果*/}*運行結果Totalnumberoffishcatched=3121*問題的進一步討論程序采用試探法,試探的初值為6,每次試探的步長為1。這是過分保守的做法。可以在進一步分析題目的基礎上修改此值,增大試探的步長值,以減少試探次數(shù)。*思考題請使用其它的方法求解本題10.出售金魚買賣提將養(yǎng)的一缸金魚分五次出售系統(tǒng)上一次賣出全部的一半加二分之一條;第二次賣出余下的三分之一加三分之一條;第三次賣出余下的四分之一加四分之一條;第四次賣出余下的五分之一加五分之一條;最后賣出余下的11條。問原來的魚缸中共有幾條金魚?*題目分析與算法設計題目中所有的魚是分五次出售的,每次賣出的策略相同;第j次賣剩下的(j+1)分之一再加1/(j+1)條。第五次將第四次余下的11條全賣了。假定第j次魚的總數(shù)為X,則第j次留下:x-(x+1)/(j+1)當?shù)谒拇纬鍪弁戤厱r,應該剩下11條。若X滿足上述要求,則X就是題目的解。應當注意的是:"(x+1)/(j+1)"應滿足整除條件。試探X的初值可以從23開始,試探的步長為2,因為X的值一定為奇數(shù)。*程序說明與注釋#include<stdio.h>voidmain(){inti,j,n=0,x;/*n為標志變量*//*控制試探的步長和過程*/for(i=23;n==0;i+=2){for(j=1,x=i;j<=4&&x>=11;j++)/*完成出售四次的操作*/if((x+1)%(j+1)==0)x-=(x+1)/(j+1);else{x=0;break;}if(j==5&&x==11){/*若滿足整除條件則進行實際的出售操作*//*否則停止計算過程*//*若第四次余下11條則滿足題意*/printf("Thereare%dfishesatfirst.\\n",i);/*輸出結果*/n=1;/*控制退出試探過程*/}}}*運行結果Thereare59fishesatfirst.11.分數(shù)四則運算對輸入的兩個分數(shù)進行+、-、*、/四則運算,輸出分數(shù)結果。算法分析如下:對分數(shù)b/a與d/c,不管哪一種運算,其運算結果均為y/x形式。對結果y/x進行化簡,約去分子分母的公因數(shù):試用i(i=1,...,y)對y,x進行試商,若能同時整除y,x,則y,x同時約去公因數(shù)i,最后打印約簡的分數(shù)。程序代碼如下:#include<stdio.h>voidmain(){longinta,b,c,d,i,x,y,z;charop;printf("兩分數(shù)b/a,d/c作+,-,*,/四則運算,結果為分數(shù)。\\n");printf("請輸入分數(shù)運算式。\\n");scanf("%ld/%ld%c%ld/%ld",&b,&a,&op,&d,&c);if(a==0||c==0){printf("分母為0輸入錯誤!");exit(0);}if(op==\'+\'){y=b*c+d*a;x=a*c;}if(op==\'-\'){y=b*c-d*a,x=a*c;}if(op==\'*\'){y=b*d;x=a*c;}if(op==\'/\'){y=b/c;x=a/d;}z=x;/*運算結果均為y/x*/if(x>y)z=y;i=z;while(i>1){/*y/x分子分母約去公因數(shù)*/if(x%i==0&&y%i==0){x=x/i;y=y/i;continue;}i--;}printf("%ld/%ld%c%ld/%ld=%ld/%ld.\\n",b,a,op,d,c,y,x);}--------------------------------------------------------------------------------12.平分七筐魚甲、乙、丙三位魚夫出海打魚,他們隨船帶了21只籮筐。當晚返航時,他們發(fā)現(xiàn)有七筐裝滿了魚,還有七筐裝了半筐魚,另外七筐則是空的,由于他們沒有秤,只好通過目測認為七個滿筐魚的重量是相等的,7個半筐魚的重量是相等的。在不將魚倒出來的前提下,怎樣將魚和筐平分為三份?*問題分析與算法設計根據(jù)題意可以知道:每個人應分得七個籮筐,其中有3.5筐魚。采用一個3*3的數(shù)組a來表示三個人分到的東西。其中每個人對應數(shù)組a的一行,數(shù)組的第0列放分到的魚的整筐數(shù),數(shù)組的第1列放分到的半筐數(shù),數(shù)組的第2列放分到的空筐數(shù)。由題目可以推出:。數(shù)組的每行或每列的元素之和都為7;。對數(shù)組的行來說,滿筐數(shù)加半筐數(shù)=3.5;。每個人所得的滿筐數(shù)不能超過3筐;。每個人都必須至少有1個半筐,且半筐數(shù)一定為奇數(shù)對于找到的某種分魚方案,三個人誰拿哪一份都是相同的,為了避免出現(xiàn)重復的分配方案,可以規(guī)定:第二個人的滿筐數(shù)等于第一個人的滿筐數(shù);第二個人的半筐數(shù)大于等于第一個人的半筐數(shù)。*程序與程序注釋#include<stdio.h>inta[3][3],count;voidmain(){inti,j,k,m,n,flag;printf("Itexistspossibledistribtionplans:\\n");for(i=0;i<=3;i++)/*試探第一個人滿筐a[0][0]的值,滿筐數(shù)不能>3*/{a[0][0]=i;for(j=i;j<=7-i&&j<=3;j++)/*試探第二個人滿筐a[1][0]的值,滿筐數(shù)不能>3*/{a[1][0]=j;if((a[2][0]=7-j-a[0][0])>3)continue;/*第三個人滿筐數(shù)不能>3*/if(a[2][0]<a[1][0])break;/*要求后一個人分的滿筐數(shù)>=前一個人,以排除重復情況*/for(k=1;k<=5;k+=2)/*試探半筐a[0][1]的值,半筐數(shù)為奇數(shù)*/{a[0][1]=k;for(m=1;m<7-k;m+=2)/*試探半筐a[1][1]的值,半筐數(shù)為奇數(shù)*/{a[1][1]=m;a[2][1]=7-k-m;for(flag=1,n=0;flag&&n<3;n++)/*判斷每個人分到的魚是3.5筐,flag為滿足題意的標記變量*/if(a[n][0]+a[n][1]<7&&a[n][0]*2+a[n][1]==7)a[n][2]=7-a[n][0]-a[n][1];/*計算應得到的空筐數(shù)量*//*不符合題意則置標記為0*/elseflag=0;if(flag){printf("No.%dFullbasketSemi--basketEmpty\\n",++count);for(n=0;n<3;n++)printf("fisher%c:%d%d%d\\n",\'A\'+n,a[n][0],a[n][1],a[n][2]);}}}}}}*運行結果Itexistspossibledistributionplans:No.1Fullbasket1Semi--basket5EmptyfisherA:1fisherB:fisherC:No.2313331FullbasketSemi--basketEmptyfisherA:fisherB:fisherC:*思考題223331223晏會上數(shù)學家出了一道難題:假定桌子上有三瓶啤酒,癬瓶子中的酒分給幾個人喝,但喝各瓶酒的人數(shù)是不一樣的。不過其中有一個人喝了每一瓶中的酒,且加起來剛好是一瓶,請問喝這三瓶酒的各有多少人?(答案:喝三瓶酒的人數(shù)分別是2人、3人和6人)13.有限5位數(shù)個位數(shù)為6且能被3整除的五位數(shù)共有多少?*題目分析與算法設計根據(jù)題意可知,滿足條件的五位數(shù)的選擇范圍是10006、10016。。。99996??稍O基礎數(shù)i=1000,通過計算i*10+6即可得到欲選的數(shù)(i的變化范圍是1000~999),再判斷該數(shù)能否被3整除。*程序說明與注釋#include<stdio.h>voidmain(){longinti;intcount=0;/*count:統(tǒng)計滿足條件的五位數(shù)的個數(shù)*/for(i=1000;i<9999;i++)if(!((i*10+6)%3))/*判斷所選的數(shù)能否被3整除*/count++;/*若滿足條件則計數(shù)*/printf("count=%d\\n",count);}*運行結果count=299914.除不盡的數(shù)一個自然數(shù)被8除余1,所得的商被8除也余1,再將第二次的商被8除后余7,最后得到一個商為a。又知這個自然數(shù)被17除余4,所得的商被17除余15,最后得到一個商是a的2倍。求這個自然數(shù)。*題目分析與算法設計根據(jù)題意,可設最后的商為i(i從0開始取值),用逆推法可以列出關系式:(((i*8+7)*8)+1)*8+1=((2*i*17)+15)*18+4再用試探法求出商i的值。*程序說明與注釋#include<stdio.h>voidmain(){inti;for(i=0;;i++)/*試探商的值*/if(((i*8+7)*8+1)*8+1==(34*i+15)*17+4){/*逆推判斷所取得的當前i值是否滿足關系式*//*若滿足則輸出結果*/printf("Therequirednumberis:%d\\n",(34*i+15)*17+4);break;/*退出循環(huán)*/}}*運行結果Therequirednumberis:199315.一個奇異的三位數(shù)一個自然數(shù)的七進制表達式是一個三位數(shù),而這個自然數(shù)的九進制表示也是一個三位數(shù),且這兩個三位數(shù)的數(shù)碼正好相反,求這個三位數(shù)。*題目分析與算法設計根據(jù)題意可知,七進制和九進制表示的這全自然數(shù)的每一位一定小于7,可設其七進制數(shù)形式為kji(i、j、k的取值分別為1~6),然后設其九進制表示形式為ijk。*程序說明與注釋#include<stdio.h>voidmain(){inti,j,k;for(i=1;i<7;i++)for(j=0;j<7;j++)for(k=1;k<7;k++)if(i*9*9+j*9+k==i+j*7+k*7*7){printf("Thespecialnumberwith3digitsis:");printf("%d%d%d(7)=%d%d%d(9)=%d(10)\\n",k,j,i,i,j,k,i*9*9+j*9+k);}}*運行結果Thespecialnumberwith3digitsis:503(7)=305(9)=248(10)--------------------------------------------------------------------------------16.位反序數(shù)設N是一個四位數(shù),它的9倍恰好是其反序數(shù),求N。反序數(shù)就是將整數(shù)的數(shù)字倒過來形成的整數(shù)。例如:1234的反序數(shù)是4321。*題目分析與算法設計可設整數(shù)N的千、百、十、個位為i、j、k、l,其取值均為0~9,則滿足關系式:(i*103+j*102+10*k+l)*9=(l*103+k*102+10*j+i)的i、j、k、l即構成N。*程序說明與注釋#include<stdio.h>voidmain(){inti;for(i=1002;i<1111;i++)/*窮舉四位數(shù)可能的值*/if(i%10*1000+i/10%10*100+i/100%10*10+i/1000==i*9)/*判斷反序數(shù)是否是原整數(shù)的9倍*/printf("Thenumbersatisfiedstatsconditionis:%d\\n",i);/*若是則輸出*/}*運行結果Thenumbersatisfiedstatesconditionis:108917.求車速一輛以固定速度行駛的汽車,司機在上午10點看到里程表上的讀數(shù)是一個對稱數(shù)(即這個數(shù)從左向右讀和從右向左讀是完全一樣的),為95859。兩小時后里程表上出現(xiàn)了一個新的對稱數(shù)。問該車的速度是多少?新的對稱數(shù)是多少?*題目分析與算法設計根據(jù)題意,設所求對稱數(shù)為i,其初值為95589,對其依次遞增取值,將i值的每一位分解后與其對稱位置上的數(shù)進行比較,若每個對稱位置上的數(shù)皆相等,則可判定i即為所求的對稱數(shù)。*程序說明與注釋#include<stdio.h>voidmain(){intt,a[5];/*數(shù)組a存放分解的數(shù)字位*/longintk,i;for(i=95860;;i++){/*以95860為初值,循環(huán)試探*/for(t=0,k=100000;k>=10;t++)/*從高到低分解所取i值的每位數(shù)*/{/*字,依次存放于a[0]~a[5]中*/a[t]=(i%k)/(k/10);k/=10;}if((a[0]==a[4])&&(a[1]==a[3])){printf("Thenewsymmetricalnumberkelometersis:%d%d%d%d%d\\n",a[0],a[1],a[2],a[3],a[4]);printf("Thevelocityofthecaris:%.2f\\n",(i-95859)/2.0);break;}}}*運行結果Thenewsymmetricalnumberkelometersis:95959.Thevelocityofthecaris:50.00*思考題將一個數(shù)的數(shù)碼倒過來所得到的新數(shù)叫原數(shù)的反序數(shù)。如果一個數(shù)等于它的反序數(shù),則稱它為對稱數(shù)。求不超過1993的最大的二進制的對稱數(shù)18.阿姆斯特朗數(shù)如果一個正整數(shù)等于其各個數(shù)字的立方和,則稱該數(shù)為阿姆斯特朗數(shù)(亦稱為自戀性數(shù))。如407=43+03+73就是一個阿姆斯特朗數(shù)。試編程求1000以內的所有阿姆斯特朗數(shù)。*題目分析與算法設計可采用窮舉法,依次取1000以內的各數(shù)(設為i),將i的各位數(shù)字分解后,據(jù)阿姆斯特朗數(shù)的性質進行計算和判斷。*程序說明與注釋#include<stdio.h>voidmain(){inti,t,k,a[3];printf("TherearefollwingArmstrongnumbersmallerthan1000:\\n");for(i=2;i<1000;i++){/*窮舉要判定的數(shù)i的取值范圍2~1000*/for(t=0,k=1000;k>=10;t++)/*截取整數(shù)i的各位(從高向低位)*/{a[t]=(i%k)/(k/10);/*分別賦于a[0]~a[2}*/k/=10;}if(a[0]*a[0]*a[0]+a[1]*a[1]*a[1]+a[2]*a[2]*a[2]==i)/*判斷i是否為阿姆斯特朗數(shù)*/printf("%5d",i);/*若滿足條件,則輸出*/}printf("\\n");}*運行結果TherearefollowingArmstrongnumbersmallerthan1000:153370371407--------------------------------------------------------------------------------19.完全數(shù)如果一個數(shù)恰好等于它的因子之和,則稱該數(shù)為“完全數(shù)”。*題目分析與算法設計根據(jù)完全數(shù)的定義,先計算所選取的整數(shù)a(a的取值1~1000)的因子,將各因子累加于m,若m等于a,則可確認a為完全數(shù)。*程序說明與注釋#include<stdio.h>voidmain(){inta,i,m;printf("Therearefollowingperfectnumberssmallerthan1000:\\n");for(a=1;a<1000;a++){/*循環(huán)控制選取1~1000中的各數(shù)進行判斷*/for(m=0,i=1;i<=a/2;i++)/*計算a的因子,并將各因子之和m=a,則a是完全數(shù)輸出*/if(!(a%i))m+=i;if(m==a)printf("%4d",a);}printf("\\n");}*運行結果TTherearefollowingperfectnumberssmallerthan1000:62849620.親密數(shù)如果整數(shù)A的全部因子(包括1,不包括A本身)之和等于B;且整數(shù)B的全部因子(包括1,不包括B本身)之和等于A,則將整數(shù)A和B稱為親密數(shù)。求3000以內的全部親密數(shù)。*題目分析與算法設計按照親密數(shù)定義,要判斷數(shù)a是否有親密數(shù),只要計算出a的全部因子的累加和為b,再計算b的全部因子的累加和為n,若n等于a則可判定a和b是親密數(shù)。計算數(shù)a的各因子的算法:用a依次對i(i=1~a/2)進行模運算,若模運算結果等于0,則i為a的一個因子;否則i就不是a的因子。*程序說明與注釋#include<stdio.h>voidmain(){inta,i,b,n;printf("Therearefollowingfriendly--numberspairsmallerthan3000:\\n");for(a=1;a<3000;a++){/*窮舉1000以內的全部整數(shù)*/for(b=0,i=1;i<=a/2;i++)/*計算數(shù)a的各因子,各因子之和存放于b*/if(!(a%i))b+=i;/*計算b的各因子,各因子之和存于n*/for(n=0,i=1;i<=b/2;i++)if(!(b%i))n+=i;if(n==a&&a<b)printf("%4d..%4d",a,b);/*若n=a,則a和b是一對親密數(shù),輸出*/}}*運行結果Therearefollowingfriendly--numberspairsmallerthan3000:220..2841184..12102620..292421.自守數(shù)自守數(shù)是指一個數(shù)的平方的尾數(shù)等于該數(shù)自身的自然數(shù)。例如:252=625762=577693762=請求出200000以內的自守數(shù)*題目分析與算法設計若采用“求出一個數(shù)的平方后再截取最后相應位數(shù)”的方法顯然是不可取的,因為計算機無法表示過大的整數(shù)。分析手工方式下整數(shù)平方(乘法)的計算過程,以376為例:376被乘數(shù)X376----------2256乘數(shù)第一個部分積=被乘數(shù)*乘數(shù)的倒數(shù)第一位第二個部分積=被乘數(shù)*乘數(shù)的倒數(shù)第二位第三個部分積=被乘數(shù)*乘數(shù)的倒數(shù)第三位26321128----------141376積本問題所關心的是積的最后三位。分析產生積的后三位的過程,可以看出,在每一次的部分積中,并不是它的每一位都會對積的后三位產生影響??偨Y規(guī)律可以得到:在三位數(shù)乘法中,對積的后三位產生影響的部分積分別為:第一個部分積中:被乘數(shù)最后三位*乘數(shù)的倒數(shù)第一位第二個部分積中:被乘數(shù)最后二位*乘數(shù)的倒數(shù)第二位第三個部分積中:被乘數(shù)最后一位*乘數(shù)的倒數(shù)第三位將以上的部分積的后三位求和后截取后三位就是三位數(shù)乘積的后三位。這樣的規(guī)律可以推廣到同樣問題的不同位數(shù)乘積。按照手工計算的過程可以設計算法編寫程序。*程序說明與注釋#include<stdio.h>voidmain(){longmul,number,k,ll,kk;printf("Itexistsfollowingautomorphicnmberssmallthan200000:\\n");for(number=0;number<200000;number++){for(mul=number,k=1;(mul/=10)>0;k*=10);/*由number的位數(shù)確定截取數(shù)字進行乘法時的系數(shù)k*/kk=k*10;mul=0;/*kk為截取部分積時的系數(shù)*//*積的最后n位*/ll=10;/*ll為截取乘數(shù)相應位時的系數(shù)*/while(k>0){mul=(mul+(number%(k*10))*(number%ll-number%(ll/10)))%kk;/*(部分積+截取被乘數(shù)的后N位*截取乘數(shù)的第M位),%kk再截取部分積*/k/=10;ll*=10;}/*k為截取被乘數(shù)時的系數(shù)*/if(number==mul)/*判斷若為自守數(shù)則輸出*/printf("%ld",number);}}*運行結果Itexstsfollowingautomorphicnumbnerssmallerthan200000:0156257637662593769062510937622.回文數(shù)打印所有不超過n(取n<256)的其平方具有對稱性質的數(shù)(也稱回文數(shù))。*題目分析與算法設計對于要判斷的數(shù)n,計算出其平方后(存于a),將a的每一位進行分解,再按a的從低到高的順序將其恢復成一個數(shù)k(如n=13,則a=169且k=961),若a等于k則可判定n為回亠數(shù)。*程序說明與注釋#include<stdio.h>voidmain(){intm[16],n,i,t,count=0;longunsigneda,k;printf("No.numberit\'ssquare(palindrome)\\n");for(n=1;n<256;n++)/*窮舉n的取值范圍*/{k=0;t=1;a=n*n;/*計算n的平方*/for(i=1;a!=0;i++)/*從低到高分解數(shù)a的每一位存于數(shù)組m[1]~m[16]*/{m=a%10;a/=10;}for(;i>1;i--){k+=m[i-1]*t;t*=10;}if(k==n*n)printf("%2d%10d%10d\\n",++count,n,n*n);}}*運行結果No.1number1it\'ssquare(palindrome)1492233411121484676522626710111112110201812321146419--------------------------------------------------------------------------------23.求具有abcd=(ab+cd)2性質的四位數(shù)3025這個數(shù)具有一種獨特的性質:將它平分為二段,即30和25,使之相加后求平方,即(30+25)2,恰好等于3025本身。請求出具有這樣性質的全部四位數(shù)。*題目分析與算法設計具有這種性質的四位數(shù)沒有分布規(guī)律,可以采用窮舉法,對所有四位數(shù)進行判斷,從而篩選出符合這種性質的四位數(shù)。具體算法實現(xiàn),可任取一個四位數(shù),將其截為兩部分,前兩位為a,后兩位為b,然后套用公式計算并判斷。*程序說明與注釋#include<stdio.h>voidmain(){intn,a,b;printf("Therearefollowingnumberwith4digitssatisfiedcondition\\n");for(n=1000;n<10000;n++){/*四位數(shù)N的取值范圍1000~9999*/a=n/100;/*截取N的前兩位數(shù)存于a*//*截取N的后兩位存于b*//*判斷N是否為符合題目所規(guī)定的性質的四位數(shù)*/b=n%100;if((a+b)*(a+b)==n)printf("%d",n);}}*運行結果Therearefollowingnumberswith4digitssatisfiedcondition:20253025980124.求素數(shù)求素數(shù)表中1~1000之間的所有素數(shù)*問題分析與算法設計素數(shù)就是僅能衩1和它自身整除的整數(shù)。判定一個整數(shù)n是否為素數(shù)就是要判定整數(shù)n能否被除1和它自身之外的任意整數(shù)整除,若都不能整除,則n為素數(shù)。程序設計時i可以從2開始,到該整數(shù)n的1/2為止,用i依次去除需要判定的整數(shù),只要存在可以整除該數(shù)的情況,即可確定要判斷的整數(shù)不是素數(shù),否則是素數(shù)。*程序與程序注釋#include<stdio.h>voidmain(){intn1,nm,i,j,flag,count=0;do{printf("InputSTARTandEND=?");scanf("%d%d",&n1,&nm);}while(!(n1>0&&n1<nm));/*輸入求素數(shù)的范圍*//*輸入正確的范圍*/printf("...........PRIMETABLE(%d--%d)............\\n",n1,nm);if(n1==1||n1==2)/*處理素數(shù)2*/{printf("%4d",2);n1=3;count++;}for(i=n1;i<=nm;i++){/*判定指定范圍內的整數(shù)是否為素數(shù)*/if(!(i%2))continue;for(flag=1,j=3;flag&&j<i/2;j+=2)/*判定能否被從3到整數(shù)的一半中的某一數(shù)所整除*/if(!(i%j))flag=0;/*若能整除則不是素數(shù)*/if(flag)printf(++count%15?"%4d":"%4d\\n",i);}}25.歌德巴赫猜想驗證:2000以內的正偶數(shù)都能夠分解為兩個素數(shù)之和(即驗證歌德巴赫猜想對2000以內的正偶數(shù)成立)。*問題分析與算法設計為了驗證歌德巴赫猜想對2000以內的正偶數(shù)都是成立的,要將整數(shù)分解為兩部分,然后判斷出分解出的兩個整數(shù)是否均為素數(shù)。若是,則滿足題意;否則重新進行分解和判斷。程序中對判斷是否為素數(shù)的算法進行了改進,對整數(shù)判斷“用從2開始到該整數(shù)的一半”改為“2開始到該整數(shù)的平方根”。原因何在請自行分析。*程序與程序注釋#include<stdio.h>#include<math.h>intfflag(intn);voidmain(){inti,n;for(i=4;i<=2000;i+=2){for(n=2;n<i;n++)/*將偶數(shù)i分解為兩個整數(shù)*/if(fflag(n))if(fflag(i-n)){/*分別判斷兩個整數(shù)是否均為素數(shù)*/printf("%14d=%d+%d\\n",i,n,i-n);/*若均是素數(shù)則輸出*/break;}if(n==i)printf("error%d\\n",i);}}intfflag(inti)/*判斷是否為素數(shù)*/{intj;if(i<=1)return0;if(i==2)return1;if(!(i%2))return0;/*ifno,return0*/for(j=3;j<=(int)(sqrt((double)i)+1);j+=2)if(!(i%j))return0;return1;}/*ifyes,return1*/--------------------------------------------------------------------------------26.要發(fā)就發(fā)“1898--要發(fā)就發(fā)”。請將不超過1993的所有素數(shù)從小到大排成第一行,第二行上的每個素數(shù)都等于它右肩上的素數(shù)之差。編程求出:第二行數(shù)中是否存在這樣的若干個連續(xù)的整數(shù),它們的和恰好是1898?假好存在的話,又有幾種這樣的情況?第一行:2357111317......197919871993第二行:122424......86*問題分析與算法設計:首先從數(shù)學上分析該問題:假設第一行中的素數(shù)為n[1]、n[2]、n[3]....n、...第二行中的差值為m[1]、m[2]、m[3]...m[j]...。其中m[j]為:m[j]=n[j+1]-n[j]。則第二行連續(xù)N個數(shù)的和為:SUM=m[1]+m[2]+m[3]+...+m[j]=(n[2]-n[1])+(n[3]-n[2])+(n[4]-n[3])+...+(n[j+1]-n[j])=n[j+1]-n[1]由此題目就變成了:在不超過1993的所有素數(shù)中是否存在這樣兩個素數(shù),它們的差恰好是1898。若存在,則第二行中必有所需整數(shù)序列,其和恰為1898,。對等價問題的求解是比較簡單的。由分析可知,在素數(shù)序列中不必包含2,因為任意素數(shù)與2的差一定為奇數(shù),所以不必考慮。*程序與程序注釋:#include<stdio.h>#include<math.h>#defineNUM320intnumber[NUM];intfflag(inti);voidmain(){/*存放不超過1993的全部奇數(shù)*/inti,j,count=0;printf("therearefollwingprimessequencesinfirstrow:\\n");for(j=0,i=3;i<=1993;i+=2)if(fflag(i))number[j++]=i;/*求出不超過1993的全部奇數(shù)*/for(j--;number[j]>1898;j--)/*從最大的素數(shù)開始向1898搜索*/{for(i=0;number[j]-number>1898;i++);/*循環(huán)查找滿足條件的素數(shù)*/if(number[j]-number==1898)/*若兩個素數(shù)的差為1898,則輸出*/printf("(%d).%3d,.....,%d\\n",++count,number,number[j]);}}intfflag(inti){intj;if(i<=1)return0;if(i==2)return1;if(!(i%2))return0;/*判斷是否為素數(shù)*//*ifno,return0*/for(j=3;j<=(int)(sqrt((double)i)+1);j+=2)if(!(i%j))return0;return1;}*運行結果Therearefollwingprimessequencesinfirstrow:(1).89,......,1987(2).53,......,1951(3).3,......,190127.素數(shù)幻方求四階的素數(shù)幻方。即在一個4X4的矩陣中,每一個格填入一個數(shù)字,使每一行、每一列和兩條對角線上的4個數(shù)字所組成的四位數(shù),均為可逆素數(shù)。*問題分析與算法設計有了前面的基礎,本題應當說是不困難的。最簡單的算法是:采用窮舉法,設定4X4矩陣中每一個元素的值后,判斷每一行、每一列和兩條對角線上的4個數(shù)字組成的四位數(shù)是否都是可逆素數(shù),若是則求出了滿足題意的一個解。這種算法在原理是對的,也一定可以求出滿足題意的全部解。但是,按照這一思路編出的程序效率很低,在微機上幾個小時也不會運行結束。這一算法致命的缺陷是:要窮舉和判斷的情況過多。充分利用題目中的“每一個四位數(shù)都是可逆素數(shù)”這一條件,可以放棄對矩陣中每個元素進行的窮舉的算法,先求出全部的四位可逆素數(shù)(204個),以矩陣的行為單位,在四位可逆素數(shù)的范圍內進行窮舉,然后將窮舉的四位整數(shù)分解為數(shù)字后,再進行列和對角線方向的條件判斷,改進的算法與最初的算法相比,大大地減少了窮舉的次數(shù)??紤]矩陣的第一行和最后一行數(shù)字,它們分別是列方向四位數(shù)的第一個數(shù)字和最后一個數(shù)字,由于這些四位數(shù)也必須是可逆素數(shù),所以矩陣的每一行和最后一行中的各個數(shù)字都不能為偶數(shù)或5。這樣窮舉矩陣的第一行和最后一行時,它們的取值范圍是:所有位的數(shù)字均不是偶數(shù)或5的四位可逆數(shù)。由于符合這一條件的四位可逆素數(shù)很少,所以這一范圍限制又一次減少了窮舉的次數(shù)。對算法的進一步研究會發(fā)現(xiàn):當設定了第一和第二行的值后,就已經可以判斷出當前的這種組合是否一定是錯誤的(尚不能肯定該組合一定是正確的)。若按列方向上的四個兩位數(shù)與四位可逆數(shù)的前兩位矛盾(不是其中的一種組合),則第一、二行的取值一定是錯誤的。同理在設定了前三行數(shù)據(jù)后,可以立刻判斷出當前的這種組合是否一定是錯誤的,若判斷出矛盾情況,則可以立刻設置新的一組數(shù)據(jù)。這樣就可以避免將四個數(shù)據(jù)全部設定好以后再進行判斷所造成的低效。根據(jù)以上分析,可以用偽語言描述以上改進的算法:開始找出全部四位的可逆素數(shù);確定全部出現(xiàn)在第一和最后一行的四位可逆素數(shù);在指定范圍內窮舉第一行在指定范圍內窮舉第二行若第一、第二、三行已出現(xiàn)矛盾,則繼續(xù)窮舉下一個數(shù);在指定范圍內窮舉第四行判斷列和對角方向是否符合題意若符合題意,則輸出矩陣;否則繼續(xù)窮舉下一個數(shù);結束在實際編程中,采用了很多程序設計技巧,假如設置若干輔助數(shù)組,其目的就是要最大限度的提高程序的執(zhí)行效率,縮短運行時間。下面的程序運行效率是比較高的。*程序與程序注釋#include<stdio.h>#include<math.h>intnumber[210][5];/*存放可逆素數(shù)及素數(shù)分解后的各位數(shù)字*/intselect[110];intarray[4][5];intcount;/*可以放在矩陣第一行和最后一行的素數(shù)的下標*//*4X4的矩陣,每行0號元素存可逆素數(shù)對應的數(shù)組下標*//*可逆素數(shù)的數(shù)目*/intselecount;/*可以放在矩陣第一行和最后一行的可逆素數(shù)的數(shù)目*/intlarray[2][200];/*存放素數(shù)前二、三位數(shù)的臨時數(shù)組所對應的數(shù)量計數(shù)器*/intlcount[2];intnum(intnumber);intok(intnumber);voidprocess(inti);voidcopy_num(inti);intcomp_num(intn);intfind1(inti);intfind2(void);intfind0(intnum);voidp_array(void);voidmain(){inti,k,flag,cc=0,i1,i4;printf("therearemagicsquareswithinvertableprimesasfollw:\\n");for(i=1001;i<9999;i+=2)/*求滿足條件的可逆素數(shù)*/{k=i/1000;if(k%2!=0&&k!=5&&num(i))/*若可逆素數(shù)的第一位不是偶數(shù)或5*/{number[count][0]=i;process(count++);/*存入數(shù)組*//*分解素數(shù)的各位數(shù)字*/if(number[count-1][2]%2!=0&&/*若可逆素數(shù)滿足放在矩陣第一行*/number[count-1][3]%2!=0&&/*和最后一行的條件,記錄可逆素數(shù)的*/number[count-1][2]!=5&&/*下標,計數(shù)器加1*/number[count-1][3]!=5)select[selecount++]=count-1;}}larray[0][lcount[0]++]=number[0][0]/100;/*臨時數(shù)組的第一行存前二位*/larray[1][lcount[1]++]=number[0][0]/10;/*臨時數(shù)組的第二行存前三位*/for(i=1;i<count;i++){/*將素數(shù)不重復的前二、三位存入臨時數(shù)組中*/if(larray[0][lcount[0]-1]!=number[0]/100)larray[0][lcount[0]++]=number[0]/100;if(larray[1][lcount[1]-1]!=number[0]/10)larray[1][lcount[1]++]=number[0]/10;}for(i1=0;i1<selecount;i1++){/*在第一行允許的匯聚圍內窮舉*/array[0][0]=select[i1];copy_num(0);/*取對應的素數(shù)下標*//*復制分解的素數(shù)*/for(array[1][0]=0;array[1][0]<count;array[1][0]++)/*窮舉第二行*/{copy_num(1);/*復制分解的數(shù)字*/if(!comp_num(2))continue;/*若每列的前兩位的組成與素數(shù)相矛盾,則試探下一個數(shù)*/for(array[2][0]=0;array[2][0]<count;array[2][0]++)/*窮舉第三行*/{copy_num(2);/*復制分解的數(shù)字*/if(!comp_num(3))continue;/*若每列的前三位的組成與素數(shù)相矛盾,則試探下一個數(shù)*/for(i4=0;i4<selecount;i4++)/*在最后一行允許的范圍內窮舉*/{array[3][0]=select[i4];copy_num(3);/*復制分解的數(shù)字*/for(flag=1,i=1;flag&&i<=4;i++)/*判斷每列是否可逆素數(shù)*/if(!find1(i))flag=0;if(flag&&find2())/*判斷對角線是否為可逆素數(shù)*/{printf("No.%d\\n",++cc);p_array();}/*輸出幻方矩陣*/}}}}}intnum(intnumber)/*判斷是否可逆素數(shù)*/{intj;if(!ok(number))return0;for(j=0;number>0;number/=10)j=j*10+number%10;/*將素數(shù)變?yōu)榉葱驍?shù)*/if(!ok(j))return0;/*判斷反序數(shù)是否為素數(shù)*/return1;}intok(intnumber){/*判斷是否為素數(shù)*/inti,j;if(number%2==0)return0;j=sqrt((double)number)+1;for(i=3;i<=j;i+=2)if(number%i==0)return0;return1;}voidprocess(inti)/*將第i個整數(shù)分解為數(shù)字并存入數(shù)組*/{intj,num;num=number[0];for(j=4;j>=1;j--,num/=10)number[j]=num%10;}voidcopy_num(inti)/*將array[0]指向的素數(shù)的各位數(shù)字復制到array中*/{intj;for(j=1;j<=4;j++)array[j]=number[array[0>[j];}intcomp_num(intn){/*判斷array中每列的前n位是否與可逆素數(shù)允許的前n位矛盾*/staticintii;/*用內部靜態(tài)變量保存前一次查找到的元素下標*/staticintjj;/*ii:前一次查找前二位的下標,jj:前一次查找前三位的下標*/inti,num,k,*p;/*p:指向對應的要使用的前一次下標ii或jj*/int*pcount;switch(n){/*pcount:指向要使用的臨時數(shù)組數(shù)量的計數(shù)器*//*根據(jù)n的值選擇對應的一組控制變量*/case2:pcount=&lcount[0];p=?break;case3:pcount=&lcount[1];p=&jj;break;default:return0;}for(i=1;i<=4;i++){/*對四列分別進行處理*/for(num=0,k=0;k<n;k++)num=num*10+array[k];/*計算前n位數(shù)字代表的數(shù)值*/if(num<=larray[n-2][*p])/*與前一次最后查找到的元素進行比較*/for(;*p>=0&&num<larray[n-2][*p];(*p)--);/*若前次查找到的元素大,則向前找*/elsefor(;p<pcount&&num>larray[n-2][*p];(*p)++);/*否則向后找*/if(*p<0||*p>=*pcount){*p=0;return0;}if(num!=larray[n-2][*p])return0;}/*前n位不是可逆素數(shù)允許的值則返回0*/return1;}intfind1(inti)/*判斷列方向是否是可逆素數(shù)*/{intnum,j;for(num=0,j=0;j<4;j++)num=num*10+array[j];returnfind0(num);}intfind2(void){/*判斷對角線方向是否是可逆素數(shù)*/intnum1,num2,i,j;for(num1=0,j=0;j<4;j++)num1=num1*10+array[j][j+1];for(num2=0,j=0,i=4;j<4;j++,i--)num2=num2*10+array[j];if(find0(num1))return(find0(num2));elsereturn0;}intfind0(intnum)/*查找是否為滿足要求的可逆素數(shù)*/{staticintj;if(num<=number[j][0])for(;j>=0&&num<number[j][0];j--);elsefor(;j<count&&num>number[j][0];j++);if(j<0||j>=count){j=0;return0;}if(num==number[j][0])return1;elsereturn0;}voidp_array(void){/*輸出矩陣*/inti,j;for(i=0;i<4;i++){for(j=1;j<=4;j++)printf("%d",array[j]);printf("\\n");}}--------------------------------------------------------------------------------28.百錢百雞問題中國古代數(shù)學家張丘建在他的《算經》中提出了著名的“百錢買百雞問題”:雞翁一,值錢五,雞母一,值錢三,雞雛三,值錢一,百錢買百雞,問翁、母、雛各幾何?*題目分析與算法設計設雞翁、雞母、雞雛的個數(shù)分別為x,y,z,題意給定共100錢要買百雞,若全買公雞最多買20只,顯然x的值在0~20之間;同理,y的取值范圍在0~33之間,可得到下面的不定方程:5x+3y+z/3=100x+y+z=100所以此問題可歸結為求這個不定方程的整數(shù)解。由程序設計實現(xiàn)不定方程的求解與手工計算不同。在分析確定方程中未知數(shù)變化范圍的前提下,可通過對未知數(shù)可變范圍的窮舉,驗證方程在什么情況下成立,從而得到相應的解。*程序說明與注釋#include<stdio.h>voidmain(){intx,y,z,j=0;printf("Folleingarepossibleplanstobuy100fowlswith100Yuan.\\n");for(x=0;x<=20;x++)for(y=0;y<=33;y++){/*外層循環(huán)控制雞翁數(shù)*//*內層循環(huán)控制雞母數(shù)y在0~33變化*/z=100-x-y;/*內外層循環(huán)控制下,雞雛數(shù)z的值受x,y的值的制約*/if(z%3==0&&5*x+3*y+z/3==100)/*驗證取z值的合理性及得到一組解的合理性*/printf("%2d:cock=%2dhen=%2dchicken=%2d\\n",++j,x,y,z);}}*運行結果Follwingarepossibleplanstobuy100fowlswith100Yuan.1:cock=0hen=25chicken=752:cock=4hen=18chicken=783:cock=8hen=11chicken=814:cock=12hen=4chicken=8429.斯坦的數(shù)學題愛因斯坦出了一道這樣的數(shù)學題:有一條長階梯,若每步跨2階,則最最后剩一階,若每步跨3階,則最后剩2階,若每步跨5階,則最后剩4階,若每步跨6階則最后剩5階。只有每次跨7階,最后才正好一階不剩。請問這條階梯共有多少階?*題目分析與算法設計根據(jù)題意,階梯數(shù)滿足下面一組同余式:x≡1(mod2)x≡2(mod3)x≡4(mod5)x≡5(mod6)x≡0(mod7)*程序說明與注釋#include<stdio.h>voidmain(){inti=1;/*i為所設的階梯數(shù)*/while(!((i%2==1)&&(i%3==2)&&(i%5==4)&&(i%6==5)&&(i%7==0)))++i;/*滿足一組同余式的判別*/printf("Staris_number=%d\\n",i);}*運行結果Staris_number=11930.年齡幾何張三、李四、王五、劉六的年齡成一等差數(shù)列,他們四人的年齡相加是26,相乘是880,求以他們的年齡為前4項的等差數(shù)列的前20項。*題目分析與算法設計設數(shù)列的首項為a,則前4項之和為"4*n+6*a",前4項之積為"n*(n+a)*(n+a+a)*(n+a+a+a)"。同時"1<=a<=4","1<=n<=6"??刹捎酶F舉法求出此數(shù)列。*程序說明與注釋#include<stdio.h>voidmain(){intn,a,i;printf("Theserieswithequaldifferenceare:\\n");for(n=1;n<=6;n++)for(a=1;a<=4;a++)/*公差n取值為1~6*//*首項a取值為1~4*/if(4*n+6*a==26&&n*(n+a)*(n+a+a)*(n+a+a+a)==880)/*判斷結果*/for(i=0;i<20;i++)printf("%d",

溫馨提示

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

評論

0/150

提交評論