注意:只提交這個(gè)日期,不要寫其它附加內(nèi)容,比如:說明性的文字。
【分析】趣味日期問題。這里要注意出生當(dāng)天記為第一天
源代碼:
#include <stdio.h>void fun(int y,int m,int d,int days){ int i,t; int month[12]={31,28,31,30,31,30,31,31,30,31,30,31}; t=246; //1777年剩余天數(shù) 出生當(dāng)天為第一天 y++,m=1,d=1; while(t<days) { if((y%4==0 && y%100!=0) || (y%400==0)) month[1]=29; else month[1]=28; if(m<12) { if(days-t<=month[m-1]) { d=(days-t); break; } else { t+=month[m-1]; m++; d=1; } } else if(m==12) { if(days-t<=month[m-1]) { d=(days-t); break; } else { t+=month[m-1]; y++; m=1; d=1; } } } PRintf("%04d-%02d-%02d/n",y,m,d);} int main(){ int y=1777; int m=4; int d=30; int days; while(scanf("%d",&days)!=EOF) fun(y,m,d,days); return 0;}程序截圖:
【答案】1799-07-16
2. (5')馬虎的算式 小明是個(gè)急性子,上小學(xué)的時(shí)候經(jīng)常把老師寫在黑板上的題目抄錯(cuò)了。 有一次,老師出的題目是:36 x 495 = ? 他卻給抄成了:396 x 45 = ? 但結(jié)果卻很戲劇性,他的答案竟然是對(duì)的!! 因?yàn)?36 * 495 = 396 * 45 = 17820 類似這樣的巧合情況可能還有很多,比如:27 * 594 = 297 * 54 假設(shè) a b c d e 代表1~9不同的5個(gè)數(shù)字(注意是各不相同的數(shù)字,且不含0) 能滿足形如: ab * cde = adb * ce 這樣的算式一共有多少種呢?請(qǐng)你利用計(jì)算機(jī)的優(yōu)勢(shì)尋找所有的可能,并回答不同算式的種類數(shù)。滿足乘法交換律的算式計(jì)為不同的種類,所以答案肯定是個(gè)偶數(shù)。答案直接通過瀏覽器提交。注意:只提交一個(gè)表示最終統(tǒng)計(jì)種類數(shù)的數(shù)字,不要提交解答過程或其它多余的內(nèi)容。
【分析】循環(huán)+暴力枚舉(或結(jié)合全排列知識(shí)求解)
源代碼:
#include <stdio.h>int Judge(int a[],int n) //判斷abcde 5個(gè)數(shù)是否有重復(fù){ int i,j; int flag=1; for(i=0;i<n;i++) { for(j=i+1;j<n;j++) { if(a[i]==a[j]) { flag=0; break; } } } return flag;}int main(){ int a[5]; int left,right; int count=0; for(a[0]=1;a[0]<=9;a[0]++) { for(a[1]=1;a[1]<=9;a[1]++) { for(a[2]=1;a[2]<=9;a[2]++) { for(a[3]=1;a[3]<=9;a[3]++) { for(a[4]=1;a[4]<=9;a[4]++) { left=(a[0]*10+a[1])*(a[2]*100+a[3]*10+a[4]); right=(a[0]*100+a[3]*10+a[1])*(a[2]*10+a[4]); if(left==right && Judge(a,5)) { //printf("%d%d*%d%d%d=%d%d%d*%d%d/n",a[0],a[1],a[2],a[3],a[4],a[0],a[3],a[1],a[2],a[4]); count++; } } } } } } printf("%d/n",count); return 0;}程序截圖:
【答案】142
3. (8')第39級(jí)臺(tái)階
小明剛剛看完電影《第39級(jí)臺(tái)階》,離開電影院的時(shí)候,他數(shù)了數(shù)礼堂前的臺(tái)階數(shù),恰好是39級(jí)! 站在臺(tái)階前,他突然又想著一個(gè)問題: 如果我每一步只能邁上1個(gè)或2個(gè)臺(tái)階。先邁左腳,然后左右交替,最后一步是邁右腳,也就是說一共要走偶數(shù)步。那么,上完39級(jí)臺(tái)階,有多少種不同的上法呢? 請(qǐng)你利用計(jì)算機(jī)的優(yōu)勢(shì),幫助小明尋找答案。要求提交的是一個(gè)整數(shù)。注意:不要提交解答過程,或其它的輔助說明文字。
【分析】考慮步數(shù)的“N階樓梯上樓問題”+遞歸思想的運(yùn)用
(參考)這個(gè)程序不需要糾結(jié)在左腳和右腳的問題上,從中抽象出限制條件:一共走的步數(shù)是偶數(shù);
我們可以通過遞歸來實(shí)現(xiàn),對(duì)每次遞歸的結(jié)果進(jìn)行判斷:如果走過的臺(tái)階數(shù)為39則結(jié)束遞歸,判斷走的步數(shù)是否為偶數(shù),為偶數(shù)則方案數(shù)+1
要說明stair可能出現(xiàn)小于0的情況,當(dāng)最后只剩了一個(gè)臺(tái)階,但是小明想要跨兩步的時(shí)候,這樣是不可能的,也就是說他只能跨一步,兩步是不可能出現(xiàn)的,因此也不可能是符合條件的走法。這種遞歸的效果如下圖:
這個(gè)二叉樹(本算法并不涉及二叉樹知識(shí),只是通過概念來理解)的每個(gè)葉子節(jié)點(diǎn)都是一種情況:
我們將每一個(gè)節(jié)點(diǎn)稱為(x,y)
葉子節(jié)點(diǎn)分為兩種情況:x為-1和x為0,x為-1的情況在現(xiàn)實(shí)中不可能發(fā)生,所以不予以考慮;
我們對(duì)每一種x為0的情況都進(jìn)行判斷,如果y的值為偶數(shù),則方案數(shù)加1。
源代碼:
#include <stdio.h>long count=0; //count記錄方案總數(shù) void dfs(int stair,int step) //stari用于表示剩余的臺(tái)階數(shù),當(dāng)?shù)扔?時(shí)停止遞歸{ int i; //step是走過的步數(shù),用來判斷是否是偶數(shù),是否符合要求 if(sum<0) return; if(step%2 == 0 && stair== 0) //如果臺(tái)階全部走完而且步數(shù)為偶數(shù),則方案數(shù)+1 { count++; return; } for(i=1;i<=2;i++) //下一步可有走一步或者兩步,遞歸分析 dfs(stair-i,step+1); }int main() { dfs(39,0); printf("%d/n",count); return 0; }程序截圖:
【答案】51167078
※4. (12’)黃金連分?jǐn)?shù) 黃金分割數(shù)0.61803... 是個(gè)無(wú)理數(shù),這個(gè)常數(shù)十分重要,在許多工程問題中會(huì)出現(xiàn)。有時(shí)需要把這個(gè)數(shù)字求得很精確。 對(duì)于某些精密工程,常數(shù)的精度很重要。也許你聽說過哈勃太空望遠(yuǎn)鏡,它首次升空后就發(fā)現(xiàn)了一處人工加工錯(cuò)誤,對(duì)那樣一個(gè)龐然大物,其實(shí)只是鏡面加工時(shí)有比頭發(fā)絲還細(xì)許多倍的一處錯(cuò)誤而已,卻使它成了“近視眼”!! 言歸正傳,我們?nèi)绾吻蟮命S金分割數(shù)的盡可能精確的值呢?有許多方法。 比較簡(jiǎn)單的一種是用連分?jǐn)?shù): 1 黃金數(shù) = --------------------- 1 1 + ----------------- 1 1 + ------------- 1 1 + --------- 1 + ... 這個(gè)連分?jǐn)?shù)計(jì)算的“層數(shù)”越多,它的值越接近黃金分割數(shù)。 請(qǐng)你利用這一特性,求出黃金分割數(shù)的足夠精確值,要求四舍五入到小數(shù)點(diǎn)后100位。 小數(shù)點(diǎn)后3位的值為:0.618 小數(shù)點(diǎn)后4位的值為:0.6180 小數(shù)點(diǎn)后5位的值為:0.61803 小數(shù)點(diǎn)后7位的值為:0.6180340 (注意尾部的0,不能忽略)你的任務(wù)是:寫出精確到小數(shù)點(diǎn)后100位精度的黃金分割值。注意:尾數(shù)的四舍五入! 尾數(shù)是0也要保留!顯然答案是一個(gè)小數(shù),其小數(shù)點(diǎn)后有100位數(shù)字,請(qǐng)通過瀏覽器直接提交該數(shù)字。注意:不要提交解答過程,或其它輔助說明類的內(nèi)容。
【分析】黃金分割數(shù)與斐波那契數(shù)有關(guān),實(shí)際上是相鄰兩個(gè)斐波那契數(shù)的商。對(duì)于小數(shù)點(diǎn)后100位精度,可用模擬手算除法實(shí)現(xiàn)。但是注意這里的精確度可能不夠。
源代碼:
#include <stdio.h>int main(){ int i,ans; long long int fib[51]; long long int x,y; fib[0]=0,fib[1]=1; for(i=2;i<=51;i++) fib[i]=fib[i-1]+fib[i-2]; x=fib[48],y=fib[49]; printf("x=%lld y=%lld/n",x,y); for(i=0;i<=100;i++) //模擬除法的過程,每次輸出小數(shù)點(diǎn)后的第i位 { ans=x/y; x=(x%y)*10; printf("%d",ans); if(i==0) printf("."); } printf("/n"); return 0;}程序截圖:
附:模擬筆算除法的實(shí)現(xiàn):
源代碼:
#include <stdio.h>void fun(long long int x,long long int y,int digit){ int i; long long int ans; for(i=0;i<=digit;i++) //精確到第digit位,逐位打印結(jié)果 { ans=x/y; x=(x%y)*10; printf("%lld",ans); if(i==0) printf("."); } printf("/n");}int main(){ long long int m,n; int digit; while(scanf("%lld %lld %d",&m,&n,&digit)!=EOF) fun(m,n,digit); return 0;}程序截圖:
5. (5')前綴判斷
如下的代碼判斷 needle_start指向的串是否為haystack_start指向的串的前綴,如不是,則返回NULL。 比如:"abcd1234" 就包含了 "abc" 為前綴char* prefix(char* haystack_start, char* needle_start){char* haystack = haystack_start;char* needle = needle_start;while(*haystack && *needle){if(______________________________) return NULL; //填空位置}if(*needle) return NULL;return haystack_start;}請(qǐng)分析代碼邏輯,并推測(cè)劃線處的代碼,通過網(wǎng)頁(yè)提交。注意:僅把缺少的代碼作為答案,千萬(wàn)不要填寫多余的代碼、符號(hào)或說明文字!!
【分析】子串的判斷
填空后代碼:
#include <stdio.h>#include <string.h>#define maxlen 1010char* prefix(char* haystack_start, char* needle_start){ char* haystack = haystack_start; char* needle = needle_start; while(*haystack && *needle) { if(*(haystack++)!=*(needle++)) return NULL; //填空位置 如果對(duì)應(yīng)位置上s1串的字符與s2串的字符不同,則不滿足題意 } if(*needle) //s2串比s1串長(zhǎng),則不滿足題意 return NULL; return haystack_start;}int main() { char s1[maxlen],s2[maxlen]; //輸入s1 s2兩串,題意即判斷s2串是否是s1串的子串 while(gets(s1)!=NULL) //如果是則打印s1串 { gets(s2); printf("%s/n",prefix(s1,s2)); } return 0;}程序截圖:
【答案】*(haystack++)!=*(needle++)
6. (7')三部排序
一般的排序有許多經(jīng)典算法,如快速排序、希爾排序等。 但實(shí)際應(yīng)用時(shí),經(jīng)常會(huì)或多或少有一些特殊的要求。我們沒必要套用那些經(jīng)典算法,可以根據(jù)實(shí)際情況建立更好的解法。 比如,對(duì)一個(gè)整型數(shù)組中的數(shù)字進(jìn)行分類排序: 使得負(fù)數(shù)都靠左端,正數(shù)都靠右端,0在中部。注意問題的特點(diǎn)是:負(fù)數(shù)區(qū)域和正數(shù)區(qū)域內(nèi)并不要求有序。可以利用這個(gè)特點(diǎn)通過1次線性掃描就結(jié)束戰(zhàn)斗!! 以下的程序?qū)崿F(xiàn)了該目標(biāo)。 其中x指向待排序的整型數(shù)組,len是數(shù)組的長(zhǎng)度。void sort3p(int* x, int len){int p = 0;int left = 0;int right = len-1;while(p<=right){if(x[p]<0){int t = x[left];x[left] = x[p];x[p] = t;left++;p++;}else if(x[p]>0){int t = x[right];x[right] = x[p];x[p] = t;right--; }else{__________________________; //填空位置}}} 如果給定數(shù)組: 25,18,-2,0,16,-5,33,21,0,19,-16,25,-3,0 則排序后為: -3,-2,-16,-5,0,0,0,21,19,33,25,16,18,25請(qǐng)分析代碼邏輯,并推測(cè)劃線處的代碼,通過網(wǎng)頁(yè)提交注意:僅把缺少的代碼作為答案,千萬(wàn)不要填寫多余的代碼、符號(hào)或說明文字!!
【分析】該三部排序算法的基本思想:負(fù)數(shù)放左邊,正數(shù)放右邊,零放在中間。
源代碼:
#include <stdio.h>#include <string.h>#define maxn 105void sort3p(int* x, int len){ int p = 0; int left = 0; int right = len-1; while(p<=right) { if(x[p]<0) { int t = x[left]; x[left] = x[p]; x[p] = t; left++; p++; } else if(x[p]>0) { int t = x[right]; x[right] = x[p]; x[p] = t; right--; } else { p++; //填空位置 } }}int main() { int i,len,a[maxn]; while(scanf("%d",&len)!=EOF) { for(i=0;i<len;i++) scanf("%d",&a[i]); sort3p(a,len); for(i=0;i<len;i++) printf("%d ",a[i]); printf("/n"); } return 0;}程序截圖:
【答案】p++
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注