北理C語言作業(yè)及答案2_第1頁
北理C語言作業(yè)及答案2_第2頁
北理C語言作業(yè)及答案2_第3頁
北理C語言作業(yè)及答案2_第4頁
北理C語言作業(yè)及答案2_第5頁
已閱讀5頁,還剩24頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、34 北理工的惡龍成績: 10 / 折扣: 0.8背景:最近,北理工出現(xiàn)了一只惡龍,它長著很多頭,而且還會吐火,它將會把北理工燒成廢墟, 于是,校長下令召集全校所有勇士殺死這只惡龍。要殺死這只龍,必須把它所有的頭都砍掉,每個勇士只能砍一個龍頭,龍的每個頭大小都不一樣,一個勇士只有在身高不小于龍頭的直徑的情況下才能砍下它。而且勇士們要求,砍下一個龍頭必須得到和自己身高厘米數(shù)一樣的學分。校長想花 最少的學分數(shù)殺死惡龍,于是找到你尋求幫助。輸入:第一行 龍頭數(shù) n , 勇士人數(shù) m ( 1=n, m=100 ) 接下來 n 行,每行包含一個整數(shù),表示龍頭的直徑 接下來 m 行,每行包含一個整數(shù),表示

2、勇士的身高 l輸出:如果勇士們能完成任務,輸出校長需要花的最小費用;否則輸 出 “ bit is doomed! ” 測試輸入期待的輸出時間限制內存限制額外進程測試用例 1以文本方式顯示1. 2 32. 53. 44. 75. 86. 4以文本方式顯示1. 111秒 64M 0 測試用例 2以文本方式顯示1. 2 12. 53. 54. 10以文本方式顯示1. bit is doomed!1秒 64M 0#includevoid main() int s=0,t,i,j,m,n,a100,b100,c100; for(i=0;i=99;i+) ai=0,bi=0,ci=0; scanf(%d%

3、d,&m,&n); for(i=0;i=m-1;i+) scanf(%d,&ai); for(i=0;in)printf(bit is doomed!n);else for(i=0;i=m-1;i+) for(j=i;jaj) t=ai,ai=aj,aj=t; for(i=0;i=n-1;i+) for(j=i;jbj) t=bi,bi=bj,bj=t; t=0; for(i=0;i=m-1;i+) for(j=0;j=n-1;j+) if(ai=bj) ct=bj; t+; bj=0; break; if(tm) printf(bit is doomed!n); else for(i=0;i

4、=t;i+) s=s+ci; printf(%dn,s);35 殺雞用牛刀要用遞歸?。〕煽? 5 / 折扣: 0.8背景:哈哈!我們終于學了遞歸了,現(xiàn)在大家一定感到非常有意思吧,那個典型的“漢諾塔”問題,一個非常短的程序居然可以完成如此復雜的工作,真是神奇??!來吧,讓我們也動手編寫一個遞歸程序,當然,我們要編寫的不可能太復雜。功能:求整數(shù) n 到 m 區(qū)間的累加和,其中n=m。輸入:區(qū)間的起始點n 區(qū)間的終止點m輸出:累加和要求:使用遞歸算法完成。如此簡單的題目當然要有隱含的測試用例啦,就3個,看看誰能猜出來。測試輸入期待的輸出時間限制內存限制額外進程測試用例 1以文本方式顯示1. 1 10以

5、文本方式顯示1. The sum from 1 to 10 is 55.1秒 64M 0 測試用例 2以文本方式顯示1. 10 15以文本方式顯示1. The sum from 10 to 15 is 75.1秒 64M 0 #includeint sum(int m,int n)int i;if(n=m)i=n;elsei=n+sum(m,n-1);return(i);void main()int m,n;scanf(%d%d,&m,&n);printf(The sum from %d to %d is %d.n,m,n,sum(m,n);H13:安全的密碼(選做)成績: 5 / 折扣: 0

6、.8隨著電子設備的廣泛運用,密碼也漸漸融入每個人的生活。保護好密碼,不僅關系到個人隱私,更關系到個人的財產和安全。一個安全的密碼,最好由大小寫字母、數(shù)字或符號組成。包含越多種類的字符,其安全性就越高。同時密碼還需要有一定的長度,通常至少要由六個以上的字符組成。并不是每個人都喜歡這樣復雜的密碼,很多人在設置密碼的時候,喜歡使用自己的名字或者生日,但這是很大的安全隱患。任務林曉煒正在設計一個網(wǎng)絡交易系統(tǒng),為了保證用戶的密碼安全,他需要一個程序,判斷用戶自己設置的密碼是否安全,如果不安全,則給出提示。現(xiàn)在他向你求助,請你幫忙設計一個程序來解決這個問題。應當按照以下的規(guī)則來判斷密碼是否安全:1. 如果

7、密碼長度小于 6 位,則不安全 2. 如果組成密碼的字符只有一類,則不安全 3. 如果組成密碼的字符有兩類,則為中度安全 4. 如果組成密碼的字符有三類或以上,則為安全 通常,可以認為數(shù)字、大寫字母、小寫字母和其它符號為四類不同的字符。輸入輸入的第一行是一個整數(shù) N,表明后面有多少組密碼。隨后的 N 行輸入包括 N 個密碼,每個密碼的長度均小于 20 個字符。輸出針對每一個密碼判斷并輸出它是否安全。對于不安全的密碼輸出 Not Safe,對于中度安全的密碼輸出 Medium Safe,對于安全的密碼輸出 Safe輸入樣例41234abcdefABC1231#c3Gh輸出樣例Not SafeNo

8、t SafeMediumSafe Safe測試輸入期待的輸出時間限制內存限制額外進程測試用例 1以文本方式顯示1. 102. abcDEF3. ABC4. qw5. 6. ABCDEFGHIJKLMNOPQRST7. 123456789012345678908. 1aB9. 1 B10. a X 11. qwe123%&ABC以文本方式顯示1. Medium Safe2. Not Safe3. Not Safe4. Not Safe5. Not Safe6. Not Safe7. Safe8. Not Safe9. Safe10. Safe1秒 64M 0 #include #include

9、char check(char s) int strlength; strlength=strlen(s); int n4=0,0,0,0; int kind=0,i; if(strlength6) return n;/not safe else for(i=0;i=0&si=A&si=a&si=z)n2+; else n3+; for(i=0;i4;i+) if(ni!=0)kind+; if(kind=1) return n;/not safe if(kind=2) return m;/Medium Safe return s;/Safe void main() int N,i; char

10、 level; scanf(%dn,&N); char str50; for(i=0;iN;i+) gets(str); level=check(str); switch(level) case n:printf(Not Safen); break; case m:printf(Medium Safen); break; case s:printf(Safen);break; H14:身份證的奧秘(選做)成績: 5 / 折扣: 0.8背景 18位身份證標準在國家質量技術監(jiān)督局于1999年7月1日實施的GB11643-1999公民身份號碼中做了明確的規(guī)定。 GB11643-1999公民身份號碼為

11、GB11643-1989社會保障號碼的修訂版,其中指出將原標準名稱社會保障號碼更名為公民身份號碼,另外GB11643-1999公民身份號碼從實施之日起代替GB11643-1989。GB11643-1999公民身份號碼主要內容如下: 一、范圍 該標準規(guī)定了公民身份號碼的編碼對象、號碼的結構和表現(xiàn)形式,使每個編碼對象獲得一個唯一的、不變的法定號碼。 二、編碼對象 公民身份號碼的編碼對象是具有中華人民共和國國籍的公民。 三、號碼的結構和表示形式 1、號碼的結構 公民身份號碼是特征組合碼,由十七位數(shù)字本體碼和一位校驗碼組成。排列順序從左至右依次為:六位數(shù)字地址碼,八位數(shù)字出生日期碼,三位數(shù)字順序碼和一

12、位數(shù)字校驗碼。 2、地址碼 表示編碼對象常住戶口所在縣(市、旗、區(qū))的行政區(qū)劃代碼,按GB/T2260的規(guī)定執(zhí)行。 3、出生日期碼 表示編碼對象出生的年、月、日,按GB/T7408的規(guī)定執(zhí)行,年、月、日代碼之間不用分隔符。 4、順序碼 表示在同一地址碼所標識的區(qū)域范圍內,對同年、同月、同日出生的人編定的順序號,順序碼的奇數(shù)分配給男性,偶數(shù)分配給女性。 5、校驗碼 (1)十七位數(shù)字本體碼加權求和公式 S = Sum(Ai * Wi), i = 0, . , 16 ,先對前17位數(shù)字的權求和 Ai: 表示第i位置上的身份證號碼數(shù)字值 Wi: 表示第i位置上的加權因子 Wi: 7 9 10 5 8

13、4 2 1 6 3 7 9 10 5 8 4 2 (2)計算模 Y = mod(S, 11) (3)通過模得到對應的校驗碼 Y: 0 1 2 3 4 5 6 7 8 9 10 校驗碼: 1 0 X 9 8 7 6 5 4 3 2 四、舉例如下: 北京市朝陽區(qū):廣東省汕頭市:15位的身份證號升級辦法: 15位的身份證號:dddddd yymmdd xx p 18位的身份證號:dddddd yyyymmdd xx p y 其中dddddd為地址碼(省地縣三級) yyyymmdd yymmdd 為出生年月日 xx順號類編

14、碼 p性別 15 位的 yy 年升為 18 位后,變成 19yy年,但對于百歲以上老人, 則為 18yy 年,此時,他們的最后三位順序碼為996, 997, 998 或 999 來標記。 輸入 輸入n組身份證號碼,第一行為個數(shù),以后每行為身份證號碼。 輸出 如果輸入的身份證號碼為15位,則將其升級為18位后顯示輸出;否則判斷其是否為合法身份證號,并逐行輸出。 測試輸入期待的輸出時間限制內存限制額外進程測試用例 1以文本方式顯示1. 42. 3506221979041303313. 11010519491231002X4. 1101054912310025. 110105491231996以文本

15、方式顯示1. Invalid2. Valid3. 11010519491231002X4. 1101051849123199651秒 64M 0 #include #include void shengji(char str) int n=strlen(str);/n=15 char newstr19; int i; for(i=0;i6;i+) newstri=stri;/前六位地址碼(省地縣三級) for(i=8;i17;i+)/newstr中的到第位 newstri=stri-2; newstr6=1; char temp4; temp0=str12; temp1=str13; temp

16、2=str14; temp3=0; if(strcmp(temp,996)=0|strcmp(temp,997)=0|strcmp(temp,998)=0|strcmp(temp,999)=0) newstr7=8; else newstr7=9; /下面是校檢碼,0的ascii碼值是 int Wi17=7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2;/權重 int S=0; for(i=0;i17;i+) S=S+Wii*(int)(newstri)-48); int y; y=S%11; switch(y) case 0:newstr17=1;break; case

17、 1:newstr17=0;break; case 2:newstr17=X;break; case 3:newstr17=9;break; case 10:newstr17=2;break; default: newstr17=(char)(12-y+48);break; newstr18=0; strcpy(str,newstr); int IscheckedValid(char str) int n=strlen(str);/n=18 int num17;/保存前位 int i; for(i=0;i17;i+)/保存前位 numi=(int)stri-48; /下面是校檢碼,0的asci

18、i碼值是 int Wi17=7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2;/權重 int S=0; for(i=0;i17;i+) S=S+Wii*numi; int y; y=S%11; char lastnum; switch(y) case 0:lastnum=1;break; case 1:lastnum=0;break; case 2:lastnum=X;break; case 3:lastnum=9;break; case 10:lastnum=2;break; default: lastnum=(char)(12-y+48);break; if(last

19、num=str17) return 1; else return 0;/0表示不合法 void run(char str) int n=strlen(str); if(n=15) shengji(str); printf(%sn,str); else if(n=18) if(!IscheckedValid(str) printf(Invalidn); else printf(Validn); else printf(Invalidn); void main() int n; scanf(%dn,&n); char str25; for(int i=0;in;i+) gets(str); run

20、(str); 36 科學記數(shù)法成績: 10 / 折扣: 0.8對于非常大或者非常小的數(shù)據(jù),我們通常用科學記數(shù)法來表示。例如在科技文獻和電腦中經(jīng)常遇到的 2.3106 (計算機中的科學記數(shù)法表示為:2.3E6),或者 9.1810-5 (科學記樹法表示:9.18E-5)這種類型的數(shù)據(jù)。 輸入:用科學記數(shù)法表示的數(shù)據(jù)。即為符合C語言表示的科學記數(shù)法表示。輸出:該數(shù)據(jù)的雙精度表示說明:輸入數(shù)據(jù)的精度不高于小數(shù)點后50位。輸入數(shù)據(jù)時,在實數(shù)和冪之間有空格進行分隔,空格個數(shù)不定。結果保留到小數(shù)點后8位,如不足8位用0補足,超過8位則截斷,不進行四舍五入的處理。測試輸入期待的輸出時間限制內存限制額外進程測

21、試用例 1以文本方式顯示1. 1.2345 E 3以文本方式顯示1. 1234.500000001秒 64M 0 測試用例 2以文本方式顯示1. 1.2345 e-3以文本方式顯示1. 0.001234501秒 64M 0 測試用例 3以文本方式顯示1. 2.23456789123456789123456789 e 20以文本方式顯示1. 223456789123456789123.456789001秒 64M 0 測試用例 4以文本方式顯示1. 1 E 0以文本方式顯示1. 1.000000001秒 64M 0 測試用例 6以文本方式顯示1. 2.2345678901234567890 E

22、1以文本方式顯示1. 22.345678901秒 64M 0 #include stdio.h int main() int p=-1,n,i=0,j,sign=0,flag=0;char c,s100; while(scanf(%c,&c)&c!=e&c!=E) if(c=.)p=i-1; else if(c=0)si=c,i+; else if(c=-)sign=1; else if(p0)p=i-1; for(j=i;j=60;j+) sj=0; scanf(%d,&n); p+=n; if(sign)printf(-); if(p0) p=-p-1; printf(0.); for(i

23、=1;i=p&i=8;i+) printf(0); for(i=1;i=8-p;i+) printf(%c,si-1); else i=0; while(i=p) if(si=0&!flag&ip)i+; elseflag=1;printf(%c,si+); printf(.); for(j=1;j=8;j+) printf(%c,si+); printf(n); return 0; 37 大數(shù)分解成績: 5 / 折扣: 0.82007級在“計算機科學導論”的期末考試中有一道試題。下面請你看看那題目應該如何編寫。從鍵盤輸入的一個大于 1 的整數(shù),通過算法將該整數(shù)分解為若干因子的乘積。輸入:一個

24、正整數(shù)。輸出:分解后的各個因子。測試輸入期待的輸出時間限制內存限制額外進程測試用例 1以文本方式顯示1. 24以文本方式顯示1. 22. 23. 24. 31秒 64M 0 測試用例 2以文本方式顯示1. 17以文本方式顯示1. 171秒 64M 0 測試用例 3以文本方式顯示1. 15以文本方式顯示1. 32. 51秒 64M 0 測試用例 4以文本方式顯示1. 3以文本方式顯示1. 31秒 64M 0 #include void main() int n,i; scanf(%d,&n); for(i=2;n1;) if(n%i=0) printf(%dn,i);n/=i; else i+;

25、 38 回文字符串遞歸成績: 5 / 折扣: 0.8有一種特殊形式的字符串,其正反序相同,被稱為“回文字符串”。例如LeveL就是一個回文字符串。輸入:字符串輸出:Yes或者No說明:如輸出Yes,說明輸入的字符串是一個回文字符串輸出No,說明輸入的字符串不是一個回文字符串請使用遞歸算法實現(xiàn)。測試輸入期待的輸出時間限制內存限制額外進程測試用例 1以文本方式顯示1. LeveL以文本方式顯示1. Yes1秒 64M 0 #include #include int fun(char str,int a,int b) if(stra!=strb) return 0 ; else if(a=b|a+1

26、=b&stra+1=strb) return 1; else if(stra=strb) return 1&fun(str,a+1,b-1); void main() char str100; scanf(%s,str); int n; n=strlen(str); switch(fun(str,0,n-1) case 1:printf(Yesn);break; case 0:printf(Non);break; 39 求最大公約數(shù)遞歸成績: 5 / 折扣: 0.8請使用遞歸算法計算正整數(shù)n和m的最大公約數(shù)GCD(n,m)。= m 當 m=n 且 n mod m =0GCD(N,M) = GC

27、D(m,n) 當nm時= GCD(m, n mod m) 其他輸入:n和m輸出:n和m的最大公約數(shù)測試輸入期待的輸出時間限制內存限制額外進程測試用例 1以文本方式顯示1. 24 48以文本方式顯示1. 241秒 64M 0 測試用例 2以文本方式顯示1. 13 15以文本方式顯示1. 11秒 64M 0 #include int gcd(int n,int m) if(m=n&n%m=0) return m; else if(nm) return gcd(m,n); else return gcd(m,n%m); void main() int n,m; scanf(%d%d,&n,&m);

28、printf(%dn,gcd(n,m); 40 求序列之和遞歸成績: 5 / 折扣: 0.8請使用遞歸算法求下列序列的前n項之和。1 + 1/2 - 1/3 + 1/4 -1/5 .輸入:n輸出:序列的前n項和(精確到小數(shù)點之后第6位)測試輸入期待的輸出時間限制內存限制額外進程測試用例 1以文本方式顯示1. 1以文本方式顯示1. 11秒 64M 0 測試用例 2以文本方式顯示1. 2以文本方式顯示1. 1.5000001秒 64M 0 測試用例 3以文本方式顯示1. 3以文本方式顯示1. 1.1666671秒 64M 0 #include double fun(int n) if(n=1) r

29、eturn 1; if(n%2=0) return fun(n-1)+1.0/n; if(n%2=1) return fun(n-1)-1.0/n; void main() int n,m; scanf(%d,&n); if(n=1) printf(1n); else printf(%0.6lfn,fun(n); 42 子串反向遞歸成績: 10 / 折扣: 0.8請編寫一個遞歸函數(shù) reverse(char str, int start, int end ) ,該函數(shù)的功能是將串 str 中下標從 start 開始到 end 結束的字符顛倒順序。假設 start 和 end 都在合理的取值范圍

30、。例如: 執(zhí)行前:str=0123456;start=1 ;end=4 執(zhí)行后:strr=0432156 要求在該函數(shù)中不使用新的數(shù)組,沒有循環(huán)。注意:只需要編寫遞歸函數(shù) reverse,系統(tǒng)中已經(jīng)設置好了main函數(shù)。預設代碼前置代碼view plaincopy to clipboardprint?1. /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */ 2.3. #include 4. int main( ) 5. char str100; 6. int start, end; 7. gets(str); 8. scanf(%d%d, &sta

31、rt, &end); 9. reverse( str, start, end ); 10. printf(%sn, str); 11. return 0; 12. 13.14. /* PRESET CODE END - NEVER TOUCH CODE ABOVE */ 測試輸入期待的輸出時間限制內存限制額外進程測試用例 1以文本方式顯示1. 01234562. 1 4以文本方式顯示1. 04321561秒 64M 0 測試用例 6以文本方式顯示1. 01234562. 6 10以文本方式顯示1. 01234561秒 64M 0 測試用例 7以文本方式顯示1. 01234562. 0 10以文

32、本方式顯示1. 65432101秒 64M 0 /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */#include int main( )char str100;int start, end;gets(str);scanf(%d%d, &start, &end);reverse( str, start, end );printf(%sn, str);return 0;/* PRESET CODE END - NEVER TOUCH CODE ABOVE */void reverse( char str, int start,int end ) in

33、t i=start,j=end,p=0; char temporary; while(strp!=0)p+;if(startp&endp)for(;i=j;i+,j-) temporary=stri; stri=strj; strj=temporary; else if(start=p)j=p-1; for(;i=j;i+,j-) temporary=stri; stri=strj; strj=temporary; H17:高精度加減法(選作)成績: 10 / 折扣: 0.8背景:計算機所能完成的一個基本功能就是完成數(shù)據(jù)的計算,譬如加法、減法等等。但是在任何一種計算機上,計算中能夠使用的數(shù)字都

34、是有一定范圍的,超過了范圍,就沒法得到精確的結果。你現(xiàn)在接受了一個任務,要編寫一個高精度計算器的核心部分。所謂高精度計算器,就是可以計算很大很大的數(shù)據(jù)的計算器。輸入:輸入的第一行是一個正整數(shù),表示下面有幾組數(shù)據(jù)需要計算。之后的每一行是兩個十進制的正整數(shù)和一個運算符,每個整數(shù)可以由最多 500 個數(shù)字組成。運算符可以是加號或者減號。輸出:對應著輸入的每一行數(shù)據(jù),輸出計算的結果,每個結果占一行。測試輸入期待的輸出時間限制內存限制額外進程測試用例 1以文本方式顯示1. 22. 213914+234661233. 32862934-23481243以文本方式顯示1. 236800372. 938169

35、11秒 64M 0 測試用例 2以文本方式顯示1. 32. 483291674192731231+12361872368127351233. 123129678463287562378-289356872648712364. 999999999+1以文本方式顯示1. 17194789110054663542. 1231007427760226911423. 10000000001秒 64M 0 測試用例 3以文本方式顯示1. 112. 56789+567893. 45555+444454. 1+123455. 12345+16. 98765-987607. 12345-98768. 12345-123459. 12345-1234610. 1-5432111. 0-012. 0+0以文本方式顯示1. 1135782. 900003. 123464. 123465. 56. 24697. 08. -19. -5432010. 011. 01秒 64M 0 #include #inc

溫馨提示

  • 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

提交評論