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