C語言第五六次作業(yè)_第1頁
C語言第五六次作業(yè)_第2頁
C語言第五六次作業(yè)_第3頁
C語言第五六次作業(yè)_第4頁
C語言第五六次作業(yè)_第5頁
已閱讀5頁,還剩35頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、C語言作業(yè)解析語言作業(yè)解析第四彈。原來真正變態(tài)的是這兩作業(yè)哇原本是做完第五次作業(yè)等大家數(shù)分期中考完以后給大家,結果直接出了第六次。就順便做了。買一送一還包郵哦親雖然這兩次作業(yè)比較難。理解起來困難無比。不過考試的時候不會有這么變態(tài)的題目啦放心當前編程題:當前編程題:11級第五次作業(yè)級第五次作業(yè)-凸多邊形面積凸多邊形面積1.【問題描述】給出平面上一組頂點的坐標,計算出它們所圍成的凸多【問題描述】給出平面上一組頂點的坐標,計算出它們所圍成的凸多邊形的面積。邊形的面積。【輸入形式】從標準輸入讀取頂點坐標。格式為:第一行是點的個數(shù)【輸入形式】從標準輸入讀取頂點坐標。格式為:第一行是點的個數(shù)N(3N15)

2、,后面緊接著),后面緊接著N行,每行兩個數(shù)字行,每行兩個數(shù)字 (由空格隔開),分(由空格隔開),分別表示該點的別表示該點的X、Y坐標(坐標(0X,Y32767)。所有點的坐標互不相同,)。所有點的坐標互不相同,且按順時針次序給出。且按順時針次序給出。輸入數(shù)據(jù)確保該多邊形是一個凸多邊形。輸入數(shù)據(jù)確保該多邊形是一個凸多邊形。【輸出形式】向標準輸出打印一個浮點數(shù),是該多邊形的面積。該浮【輸出形式】向標準輸出打印一個浮點數(shù),是該多邊形的面積。該浮點數(shù)保留兩位小數(shù)。點數(shù)保留兩位小數(shù)。【輸入樣例】【輸入樣例】 4 33301012 【輸出樣例】【輸出樣例】5.00【樣例說明】輸入數(shù)據(jù)表示了如圖所示的四邊形

3、。其面積為【樣例說明】輸入數(shù)據(jù)表示了如圖所示的四邊形。其面積為5.00。提示:求三角形面積可用海倫公式,求平方根可用提示:求三角形面積可用海倫公式,求平方根可用頭文件中頭文件中定義的定義的sqrt函數(shù)。函數(shù)。【評分標準】結果完全正確得【評分標準】結果完全正確得20分,每個測試點分,每個測試點4分。提交程序名為:分。提交程序名為:points.c。本題解析: 這個題是把凸n邊形面積分成n-2個三角形面積和來做的。用海倫公式 S=sqrt(p*(p-a)*(p-b)*(p-c) P=(a+b+c)/2 a,b,c為三邊長 例如n邊形點為a1a2an 那 S=(Sa1akak+1) (2KN-1)

4、邊長則為兩點間距離。#include#includeint main() int n; float x15,y15; int i; float dx,dy; float tot=0; float a,b,c,p; scanf(%d,&n); for (i=0;in;i+) scanf(%f%f,&xi,&yi); for (i=1;in-1;i+) dx=x0-xi; dy=y0-yi; a=sqrt(dx*dx+dy*dy);/*兩點間距離公式*/ dx=xi-xi+1; dy=yi-yi+1; b=sqrt(dx*dx+dy*dy); dx=xi+1-x0; dy=yi+1-y0; c=s

5、qrt(dx*dx+dy*dy); p=(a+b+c)/2; tot+=sqrt(p*(p-a)*(p-b)*(p-c); /*海倫公式*/ printf(%.2f,tot); return 0;當前編程題:當前編程題:11級第五次作業(yè)級第五次作業(yè)-整數(shù)的整數(shù)的N進制字符串表示進制字符串表示【問題描述】編寫函數(shù)【問題描述】編寫函數(shù)itob(n,s,b),用于把整數(shù)用于把整數(shù)n轉換成以轉換成以b為基的字符串為基的字符串并存儲到并存儲到s中中. 編寫程序編寫程序,使用函數(shù)使用函數(shù)itob(n,s,b)將輸入的整數(shù)將輸入的整數(shù)n,轉換成轉換成字符串字符串s,將將s輸出輸出.轉換后的字符串從最高的非零

6、位開始輸出。如果轉換后的字符串從最高的非零位開始輸出。如果n為負數(shù),則輸出的字符串的第一個字符為為負數(shù),則輸出的字符串的第一個字符為-。b為大于為大于1小于小于37的任的任意自然數(shù)值。當意自然數(shù)值。當b=2時,輸出字符只可能是時,輸出字符只可能是0和和1;當;當b=16時,時,輸出字符串中可能含有字符為輸出字符串中可能含有字符為0-9,a-f(字母以小寫輸出字母以小寫輸出)。b還可以是其它數(shù)值。比如輸入還可以是其它數(shù)值。比如輸入n=33,b=17,則輸出,則輸出33的的17進制值為進制值為1g。【輸入形式】控制臺輸入整數(shù)【輸入形式】控制臺輸入整數(shù)n和和b,其中,其中n可以為負數(shù)。可以為負數(shù)。n

7、和和b以空格以空格分隔分隔.【輸出形式】控制臺輸出轉化后的字符串【輸出形式】控制臺輸出轉化后的字符串s.【樣例輸入】【樣例輸入】5 2【樣例輸出】【樣例輸出】101【樣例說明】【樣例說明】5的二進制就是的二進制就是101【評分標準】結果完全正確得【評分標準】結果完全正確得20分,每個測試點分,每個測試點4分。提交程序名為:分。提交程序名為:itob.c本題解析: 十進制轉換為其他進制的方法是不斷除目標進制的數(shù)取余數(shù),然后倒序輸出。例如5變?yōu)槎M制就是5%2=1;5/2=2;2%2=0;2/2=1;1%2=1;得到101 倒序得到101 即為正解。十進制以上則是若目標大于10就變?yōu)橄鄳淖帜讣纯?/p>

8、。 如果目標數(shù)為負數(shù),則先忽略負號求解最后加上一個負號就可以了#include#includevoid itob(int n,char s,int b) int flag=1; int sum=0; int i,j; char ch; if (n0)/*不斷除b取余*/ ssum+=n%b; n=n/b; for (i=0,j=sum-1;ij;i+,j-) /*將數(shù)字倒序存放*/ ch=si;si=sj;sj=ch; for (i=0;isum;i+) if (si0;i-) si=si-1; s0=-; int main() int n,b; char s100; scanf(%d%d,&

9、n,&b); itob(n,s,b); printf(%s,s);return 0; 當前編程題:當前編程題:11級第五次作業(yè)級第五次作業(yè)-求兩組整數(shù)的異或集求兩組整數(shù)的異或集3.【問題描述】從標準輸入中輸入兩組整數(shù)【問題描述】從標準輸入中輸入兩組整數(shù)(每行不超過每行不超過20個整數(shù),每組整數(shù)中元素個整數(shù),每組整數(shù)中元素不重復不重復),合并兩組整數(shù),去掉在兩組整數(shù)中都出現(xiàn)的整數(shù),并按從大到小順序排序合并兩組整數(shù),去掉在兩組整數(shù)中都出現(xiàn)的整數(shù),并按從大到小順序排序輸出(即兩組整數(shù)集輸出(即兩組整數(shù)集“異或異或”)。)。【輸入形式】首先輸入第一組整數(shù),以一個空格分隔各個整數(shù);然后在新的一行上【輸入

10、形式】首先輸入第一組整數(shù),以一個空格分隔各個整數(shù);然后在新的一行上輸入第二組整數(shù),以一個空格分隔,行末有回車換行。輸入第二組整數(shù),以一個空格分隔,行末有回車換行。【輸出形式】按從大到小順序排序輸出合并后的整數(shù)集(去掉在兩組整數(shù)中都出現(xiàn)【輸出形式】按從大到小順序排序輸出合并后的整數(shù)集(去掉在兩組整數(shù)中都出現(xiàn)的整數(shù),以一個空格分隔各個整數(shù))。的整數(shù),以一個空格分隔各個整數(shù))。【樣例輸入】【樣例輸入】5 1 4 32 8 7 9 -6 5 2 87 10 1【樣例輸出】【樣例輸出】87 32 10 9 8 7 4 2 -6【樣例說明】第一組整數(shù)為【樣例說明】第一組整數(shù)為5 1 4 32 8 7 9

11、-6,第二組整數(shù)分別為,第二組整數(shù)分別為5 2 87 10 1。將第一組和第二組整數(shù)合并(去掉在兩組整數(shù)中都出現(xiàn)的整數(shù)。將第一組和第二組整數(shù)合并(去掉在兩組整數(shù)中都出現(xiàn)的整數(shù)5和和1),),并從大到小順序排序后結果為并從大到小順序排序后結果為87 32 10 9 8 7 4 2 -6。【評分標準】該題要求輸出兩組整數(shù)的異或集,共有【評分標準】該題要求輸出兩組整數(shù)的異或集,共有5個測試點,提交程序文件名個測試點,提交程序文件名為為xor.c。本題解析: 求異或,同時降序輸出。那么將問題簡化后可以發(fā)現(xiàn)如果將兩個數(shù)組中的數(shù)都讀進同一個數(shù)組然后降序排序若是數(shù)組中存在相同元素則不輸出,若只出現(xiàn)一次則輸出

12、。那么結果與題目要求就相同了。#includeint main() int a100; int i,j,k; int sum=0; char ch; int tot=0; scanf(%d,&asum+); while (1) ch=getchar(); if (ch=n) tot+=1; if (tot=2) break; scanf(%d,&asum+); /*這里是進行讀入,由于一共有兩行那么每讀完一個數(shù)就讀入一個字符判斷這個字符是不是換行符,當出現(xiàn)兩個換行符的時候讀入結束*/for (i=0;isum;i+) for (j=i+1;jsum;j+) if (aiaj) k=ai; ai

13、=aj; aj=k; /*降序排序*/asum=5257;/*保證asum不與前面的數(shù)相同*/ int flag=0;/*flag表示已經(jīng)輸出了多少數(shù),若為0則不需要先輸出空格,否則輸出空格與前面輸出的數(shù)字隔開*/ for (i=0;isum;i+) if (i=0) if (ai!=ai+1) if (flag) printf( ); printf(%d,ai); flag+; if (i!=0) if (ai!=ai+1)&(ai!=ai-1) if (flag) printf( ); printf(%d,ai); flag+; 當前編程題:11級第五次作業(yè)-字符串中字符排序字符串中字符排

14、序4.【問題描述】編寫一個程序,從鍵盤接收一個字符串,然后按照字符順序從小到大進行排序,并刪除重復的字符。【輸入形式】用戶在第一行輸入一個字符串。【輸出形式】程序按照字符(ASCII)順序從小到大排序字符串,并刪除重復的字符進行輸出。【樣例輸入】badacgegfacb【樣例輸出】abcdefg【樣例說明】用戶輸入字符串badacgegfacb,程序對其進行按從小到大(ASCII)順序排序,并刪除重復的字符,最后輸出為abcdefg【評分標準】結果完全正確得20分,每個測試點4分。提交源程序名為stringsort.c本題解析: 這個題做法比較多。一種簡單的做法是:由于一共只有255個asci

15、i碼的值。那么開一個300的數(shù)組a ai表示ascii碼為i的字符出現(xiàn)的次數(shù),輸出時從0到255(或255以上,例如300)循環(huán),若ai不為0則輸出對應的字符。#include#includeint main() int a300; int i,j; char k; char s200; memset(a,0,sizeof(a); scanf(%s,s); for (i=0;istrlen(s);i+) asi+; for (j=0;j260;j+) if (aj) k=j; printf(%c,k); 當前編程題:當前編程題:11級第五次作業(yè)級第五次作業(yè)-最長升序子串最長升序子串5.【問題描

16、述】輸入一行字符串,該字符串只由小寫英文字母【問題描述】輸入一行字符串,該字符串只由小寫英文字母a-z組成,且組成,且其中的字符可以重復,最長不超過其中的字符可以重復,最長不超過10000個字符。個字符。從該字符串中按順序挑選出若干字符(不一定相鄰)組成一個新串,稱為從該字符串中按順序挑選出若干字符(不一定相鄰)組成一個新串,稱為“子串子串”。如果子串中每兩個相鄰的字符或者相等,或者后一個比前一個大,。如果子串中每兩個相鄰的字符或者相等,或者后一個比前一個大,則稱為則稱為“升序子串升序子串”。編程求出輸入字符串的最長升序子串的長度。編程求出輸入字符串的最長升序子串的長度。例如,由輸入字符串例如

17、,由輸入字符串abdbch可以構成的升序子串有:可以構成的升序子串有:abd、abch、bbch、abbch等。其中最長的升序子串是等。其中最長的升序子串是abbch,其長度為,其長度為5。【輸入形式】從標準輸入讀取一行字符串,該串不含空格,以回車符結束。【輸入形式】從標準輸入讀取一行字符串,該串不含空格,以回車符結束。【輸出形式】向標準輸出打印一個正整數(shù),是字符串中最長的升序子串的長【輸出形式】向標準輸出打印一個正整數(shù),是字符串中最長的升序子串的長度,在行末要輸出一個回車符。度,在行末要輸出一個回車符。【輸入樣例】【輸入樣例】abdbch【輸出樣例】【輸出樣例】5【樣例說明】【樣例說明】ab

18、dbch中最長子串是中最長子串是abbch,長度是,長度是5。【評分標準】結果完全正確得【評分標準】結果完全正確得20分,每個測試點分,每個測試點4分。上傳分。上傳c語言源程序為語言源程序為up.c。本題解析: 這道題是從出現(xiàn)作業(yè)為止最難得題目。涉及到一些動態(tài)規(guī)劃的思想。(我只想到這一種做法,歡迎大家有簡單做法的來分享) 用fij表示到字符串s中的第i個字符為止最高位為j(用1-26分別代替a-z)的最長字串的字符數(shù)。動態(tài)轉移方程為:Fij=Fi-1j (sij)Fij=max(fi-1k)+1 (1kj) (si=j)這個題目不是很好講清楚,如果想透徹的理解的話可以來找我(中408 JRC)

19、不過。不保證一定能講清楚。#include#includeint main() char s10001; int f1000127; int i,j,k,l; scanf(%s,s);l=strlen(s); memset(f,0,sizeof(f);/*f數(shù)組初始化*/ f0s0-a+1=1;/*f0s0對應的值應該是1,因為以s0為終結的最長字串長度為1*/ for (i=1;il;i+) for (j=1;j=26;j+) if (j=si-a+1) for (k=1;k=j;k+) if (fijfi-1k+1) fij=fi-1k+1; else fij=fi-1j; int max

20、=0; for (i=1;imax) max=fl-1i; printf(%d,max);當前編程題:當前編程題:11級第五次作業(yè)級第五次作業(yè)-字符串替換(新)字符串替換(新)6.【問題描述】編寫程序將一個指定文件中某一字符串替換為另一個字【問題描述】編寫程序將一個指定文件中某一字符串替換為另一個字符串。要求:(符串。要求:(1)被替換字符串若有多個,均要被替換;()被替換字符串若有多個,均要被替換;(2)指定的)指定的被替換字符串,大小寫無關。被替換字符串,大小寫無關。【輸入形式】給定文件名為【輸入形式】給定文件名為filein.txt。從控制臺輸入兩行字符串(不含。從控制臺輸入兩行字符串(

21、不含空格,行末尾都有回車換行符),分別表示被替換的字符串和替換字符空格,行末尾都有回車換行符),分別表示被替換的字符串和替換字符串。串。【輸出形式】將替換后的結果輸出到文件【輸出形式】將替換后的結果輸出到文件fileout.txt中。中。【評分標準】該題要求得到替換后的文件內容,共有【評分標準】該題要求得到替換后的文件內容,共有5個測試點。上傳個測試點。上傳C語言文件名為語言文件名為replace.c。本題解析: 這個題就是首先用一個字符串將filein.txt中的東西全部讀入進來,然后進行一個判斷與替換。對每一小段字符串都判斷是不是與需要被替換的東西相等即可。#include#include

22、char a200,b200,c2000;int judge(int i,int l)/*判斷從第i位開始的l位是否與待替換字符串一樣*/ int j; for (j=0;jl;j+) if (ci+j!=aj)&(ci+j!=aj+a-A)&(ci+j!=aj+A-a)/*注意大小寫*/ return 0; return 1; int main() int l,i,len=0; char ch; scanf(%s,a); scanf(%s,b); l=strlen(a); freopen(filein.txt,r,stdin); freopen(fileout.txt,w,stdout);

23、memset(c,0,sizeof(c); while (ch!=EOF) ch=getchar(); clen+=ch; for (i=0;i=len-1)/*如果剩余字符數(shù)不到待替換字符串的長度的時候直接輸出就可以了*/ printf(%c,ci); else if (judge(i,l) /*如果一致的話就替換*/ printf(%s,b); i+=l-1; else/*否則輸出當前位*/ printf(%c,ci); exit(0); return 0;11級第六次作業(yè)-合并字符串合并字符串1.【問題描述】編寫一個函數(shù)char * str_bin(char* str1, char* s

24、tr2), str1、str2是兩個有序字符串(其中字符按ASCII碼從小到大排序),將str2合并到字符串str1中,要求合并后的字符串仍是有序的,允許字符重復。在main函數(shù)中測試該函數(shù):從鍵盤輸入兩個有序字符串,然后調用該函數(shù),最后輸出合并后的結果。【輸入形式】分行從鍵盤輸入兩個有序字符串(不超過100個字符)【輸出形式】輸出合并后的有序字符串【輸入樣例】acegbdfh【輸出樣例】abcdefgh【樣例說明】輸入兩個有序字符串aceg和bdfh,輸出合并后的有序字符串abcdefgh【評分標準】結果完全正確得20分,每個測試點4分,提交程序文件名為combine.c。本題解析: 這道題

25、主要用到了雙隊列維護。就是說將兩個字符串看為兩個隊列,然后從排頭開始出列,哪一列的排頭比較小就出列同時出現(xiàn)一個新的排頭。也就是原來的排頭后面的那個字符#include#includechar str3200;void str_bin(char str1,char str2) int l1,l2; l1=strlen(str1);l2=strlen(str2);/*分別為隊列長度*/ int i=0,j=0,k=0; while (il1 | jl2) if (str1i=0) str3k+=str2j+;/*如果第一列的人都出列了則出列第二列的*/ else if (str2j=0) str3

26、k+=str1i+; else if (str1istr2j) str3k+=str1i+;/*否則的話比較大小,誰小誰出*/ else str3k+=str2j+; str3k=0;int main() char str1100,str2100; scanf(%s%s,str1,str2); str_bin(str1,str2); printf(%s,str3);11級第六次作業(yè)-刪除子串刪除子串2.【問題描述】編寫一個程序,當在一個字符串中出現(xiàn)子串時就刪除它。【輸入形式】用戶在第一行輸入一個字符串,用戶在第二行輸入一個子串。【輸出形式】程序在下一行輸出刪除其中所有子串后的字符串。如果字符串

27、不包含子串則輸出原字符串本身。【樣例輸入】 I am a boy! a 【樣例輸出】 I m boy! 【樣例說明】用戶首先輸入字符串I am a boy!,然后輸出子串a,程序會尋找字符串中的子串刪除它,最后 將刪除后的結果輸出:I#m#boy! #表示空格。【評分標準】結果完全正確得20分,每個測試點4分。提交程序名為:delsubstring.c。本題解析: 這道題跟第五次作業(yè)的最后一題基本一樣。只不過被替換的字符串變成了空的而已。解析見第五次作業(yè)第六題。#include#includechar a200,b200;int judge(int i,int l) int j; for (j

28、=0;jl;j+) if (ai+j!=bj)return 0; return 1;int main() int l; gets(a); gets(b); l=strlen(b); int i; for (i=0;istrlen(a);i+) if (judge(i,l) i+=l-1; else printf(%c,ai); return 0;/*不過感覺程序上簡單多了。*/11級第六次作業(yè)-超長正整數(shù)的減法超長正整數(shù)的減法3.【問題描述】編寫程序實現(xiàn)兩個超長正整數(shù)(每個最長80位數(shù)字)的減法運算。 【輸入形式】從鍵盤讀入兩個整數(shù),要考慮輸入高位可能為0的情況(如00083)。1. 第一行是

29、超長正整數(shù)A;2. 第二行是超長正整數(shù)B; 【輸出形式】 輸出只有一行,是長整數(shù)A減去長整數(shù)B的運算結果,從高到低依次輸出各位數(shù)字。要求:若結果為0,則只輸出一個0;否則輸出的結果的最高位不能為0,并且各位數(shù)字緊密輸出。 【輸入樣例】 234098134098703578230056 【輸出樣例】 134098703577995958【樣例說明】進行兩個正整數(shù)減法運算, 234098 134098703578230056 = 134098703577995958。 【評分標準】 完全正確得20分,每個測試點4分,提交程序文件名為subtract.c。本題解析: 高精度減法。因為是兩個正整數(shù)。所

30、以先要去掉題目描述的最高位處的多余的0其次是比較兩個數(shù)字的大小。如果被減數(shù)小于減數(shù),則是輸出一個符號然后將兩個數(shù)對調。 注意,由于此處是高精度數(shù),讀入時需要直接使用字符串讀入,采用豎式相減得方法還要考慮退位的問題。同時要從個位數(shù)開始相減。#include#includeint c101;int judge(char a,char b)/*判斷a與b的大小關系*/ int i; if (strlen(a)strlen(b) return 1; for (i=0;istrlen(a);i+)/*一樣多的話逐位比較大小,第一位不同的誰大則誰比較大*/ if (aibi)return 0; retur

31、n 1; void minus (char a,char b)/*減法操作*/ int i,j; char k; for (i=0,j=strlen(a)-1;ij;i+,j-)/*首先將字符串倒過來,方便從個位開始相減*/ k=ai;ai=aj;aj=k; for (i=0,j=strlen(b)-1;ij;i+,j-) k=bi;bi=bj;bj=k; for (i=0;i=strlen(b)ci=ai-0; else ci=ai-bi; for (i=0;istrlen(a)-1;i+)/*退位操作*/*下頁還有*/ if (ci0) ci+=10;ci+1-=1;int main()

32、int i,j,k,s=0,l; char a100,b100; memset(c,0,sizeof(c); gets(a); gets(b); while (as=0) s+;/*去掉多余的0*/ l=strlen(a)-s; for (i=0;i=l;i+) ai=ai+s; s=0; while (bs=0) s+; l=strlen(b)-s; for (j=0;j=l;j+) bj=bj+s; if (judge(a,b) minus(a,b); else printf(“-”);minus(b,a);/*如果a=0;j-)printf(“%d”,cj);/*輸出結果*/當前編程題:

33、11級第六次作業(yè)-旋轉魔方陣旋轉魔方陣(文件文件)4.【問題描述】輸入一個自然數(shù)(2N9),要求輸出如下的魔方陣,即邊長為N*N,元素取值為1至N*N,1在左上角,呈順時針方向依次放置各元素。 N=3時: 1 2 3 8 9 4 7 6 5【輸入形式】從標準輸入讀取一個整數(shù)N。 【輸出形式】將結果輸出到文件文件file.out。輸出符合要求的方陣,每個數(shù)字占5個字符寬度,向右對齊,在每一行末均輸出一個回車符。【輸入樣例】 4【輸出樣例】輸出文件file.out內容為: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7本題解析: 模擬做法。因為是n*n的一個矩陣,所以

34、我只需要不停地轉圈賦值即可。這個看程序會比較清楚。#includeint main() freopen(file.out,w,stdout); int n,i,j,k=1,x=1,y=1,s=1,t,tot; int p1010; scanf(%d,&n); tot=n*n;t=n; while (1) while (x=t) px+y=k+;/*go right*/ x-;k-;if (k=tot) break;/*如果已經(jīng)填充了n*n個了就退出循環(huán)*/ while (y=s) px-y=k+;/*go left*/ x+;k-; while (ys) pxy-=k+;/*go up*/ y

35、+;k-; s+;t-;/*矩陣縮小一層*/ if (k=tot) break; for (i=1;i=n;i+) for (j=1;j=n;j+) printf(%5d,pji); printf(n); exit(0);11級第六次作業(yè)-全排列數(shù)的生成全排列數(shù)的生成5.【問題描述】輸入整數(shù)N( 1 = N = 10 ),生成從1N所有整數(shù)的全排列。 【輸入形式】輸入整數(shù)N。【輸出形式】輸出有N!行,每行都是從1N所有整數(shù)的一個全排列,各整數(shù)之間以空格分隔。各行上的全排列不重復。輸出各行遵循“小數(shù)優(yōu)先”原則, 在各全排列中,較小的數(shù)盡量靠前輸出。如果將每行上的輸出看成一個數(shù)字,則所有輸出構成升

36、序數(shù)列。本題解析: 這道題如果做法太過暴力的話可能會超時。于是我們用一種半數(shù)學的方法。也就是說n的全排列按順序排好的話,前(n-1)!個的第一位都是1,第二位就跟(n-2)!有關那么我們就可以通過第x個直接判斷從第一位到第n位應該是第幾個數(shù),如果遇到這個數(shù)已經(jīng)被使用了的情況的話就將這個數(shù)+1.以此類推#includeint main() int i,j,k,n,s,f,p; int jc11=1,1,2,6,24,120,720,5040,40320,362880,3628800;/*0-10的階乘*/ int judge11;/*用來判斷1-10是否已經(jīng)輸出過*/ scanf(%d,&n);

37、 for (i=1;i=jcn;i+)/*n的全排列共n!個*/ s=i; memset(judge,0,sizeof(judge); for (j=0;jn;j+)/*n的全排列共n位*/ if (j!=0) printf( ); p=(s-1)/jcn-1-j+1;/*p表示這次輸出的數(shù)應該是第幾個沒出現(xiàn)過的數(shù)*/ for (k=1;k=p;k+) if (judgek) p+;/*如果比p小的數(shù)中有的數(shù)出現(xiàn)過那么p就只能+1*/ printf(%d,p); judgep=1; s=(s-1)%jcn-1-j+1;/*去掉(n-1)!項*/ /*其實這個題的做法類似Taylor展開式,還是比較顯然的*/ printf(n); return 0;11級第六次作業(yè)-單詞排序(命令行參數(shù))單詞排序(命令行參數(shù))6.【問題描述】編寫一個程序,從一個文件中讀入單詞(即:以空格分隔的字符串),并對單詞進行排序,刪除重復出現(xiàn)的單詞,然后將結果輸出到另一個文件中。【輸入形式】源文件名和目標文件名在執(zhí)行時作為程序命

溫馨提示

  • 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

提交評論