C語言(北京理工大學MOOC 上)


1、矩陣的鞍點
 1 #include  <stdio.h>
 2 #define N 32
 3 int main()
 4 {
 5     int m,n;
 6     scanf("%d %d",&m,&n);
 7 
 8     int a[N][N]={0};
 9     for(int i=0;i<m;++i){
10         for(int j=0;j<n;++j){
11             scanf("%d",&a[i][j]);
12         }
13     }
14 
15     int find = 0;
16     for(int i=0;i<m;++i)
17     {
18         //判斷行最大值
19         int rowPos=i,columnPos=0,flag = 1;
20         for(int j=1;j<n;++j)
21         {
22             if(a[i][j]>a[rowPos][columnPos]){
23                 rowPos = i;
24                 columnPos = j;
25             }
26         }
27         //判斷行最大值,在所在列是否為最小值
28         for(int k=0;k<m;++k){
29             if(a[k][columnPos]<a[rowPos][columnPos]){
30                 flag = 0;
31                 break;
32             }
33         }
34         //行最大值且所在列最小值輸出
35         if(flag){
36             printf("Point:a[%d][%d]==%d\n",rowPos,columnPos,a[rowPos][columnPos]);
37             find = 1;
38         }
39     }
40     if(!find){
41         printf("No Point\n");
42     }
43 
44     return 0;
45 }

2、身份證的奧秘

 1 #include <stdio.h>
 2 #include <string.h>
 3 int main()
 4 {    
 5     int weight[17] = {7,9,10,5,8,4,2,1,6,3,
 6         7,9,10,5,8,4,2};
 7     char m[12] = "10X98765432";
 8     
 9     int n;
10     scanf("%d",&n);
11 
12     while(n--)
13     {
14         char buf[20] = "";
15         scanf("%s",buf);
16         int len = strlen(buf);
17 
18         char buf1[20] = "";
19         if(len==15)
20         {
21             strncpy(buf1,buf,6);
22             if(strstr(&buf[12],"996")||strstr(&buf[12],"997")||
23                     strstr(&buf[12],"998")||strstr(&buf[12],"999")){
24                 strcat(buf1,"18");
25             }
26             else
27                 strcat(buf1,"19");
28             strcat(buf1,&buf[6]);
29             strcpy(buf,buf1);
30         }
31 
32         int sum = 0;
33         for(int i=0; i<17; ++i)
34             sum += (buf[i]-'0')*weight[i];
35 
36         if(len==15){
37             buf[17] = m[sum%11];
38             printf("%s\n",buf);
39         }
40         else if(len==18 && m[sum%11]==buf[17])
41             printf("Valid\n");
42         else
43             printf("Invalid\n");
44     }
45     return 0;
46 }

3、安全的密碼

 1 #include <stdio.h>
 2 #include <string.h>
 3 int main()
 4 {
 5     int n;
 6     scanf("%d",&n);
 7     getchar();
 8     while(n--)
 9     {
10         char str[20] = "";
11         gets(str);
12 
13         int a[4] = {0};
14         int count = 0;
15         int len = strlen(str);
16         for(int i=0; i<len; ++i)
17         {
18             if(str[i]>='A'&&str[i]<='Z'){
19                 a[0]++;
20                 if(a[0]==1)
21                     count++;
22             }
23             else if(str[i]>='a'&&str[i]<='z'){
24                 a[1]++;
25                 if(a[1]==1)
26                     count++;
27             }
28             else if(str[i]>='0'&&str[i]<='9'){
29                 a[2]++;
30                 if(a[2]==1)
31                     count++;
32             }
33             else {
34                 a[3]++;
35                 if(a[3]==1)
36                     count++;
37             }
38         }
39 
40        if(len<6||count==1)
41             puts("Not Safe");
42         else if(count==2)
43             puts("Medium Safe");
44         else
45             puts("Safe");
46     }
47     return 0;
48 }

4、單詞排序

 1 #include <stdio.h>
 2 #include <string.h>
 3 int main()
 4 {
 5     char a[5][80],temp[80]="";
 6     int n=5, t, i=0;
 7     t = n;
 8     while(t--){
 9         scanf("%s",a[i]);
10         for(int j=0; j<i; ++j){
11             if(strcmp(a[i],a[j])>0){
12                 strcpy(temp,a[i]);
13                 strcpy(a[i],a[j]);
14                 strcpy(a[j],temp);
15             }
16         }
17         i++;
18     }
19 
20     t = n, i=0;
21     while(t--)
22         printf("%s\n",a[i++]);
23 
24     return 0;
25 }

 5、回文數

題目內容:

    輸出所有不超過n(取n<256)的、其平方具有對稱性質的正整數(也稱為回文數)。

如:  1*1=1; 2*2=4;3*3=9;11*11=121;1,2,3,11是回文數。

輸入格式:

    輸入n(n<256)

輸出格式:

    輸出所有不超過n的回文數

輸入樣例:

3

輸出樣例:

1[回車]

2[回車]

 1 #include <stdio.h>
 2 int main()
 3 {
 4     int m;
 5     scanf("%d",&m);
 6 
 7     for(int i=1; i<m; ++i)
 8     {
 9         int n = i*i, num = 0;
10         while(n){
11             num = num*10 + n%10;
12             n /= 10;
13         }
14         if(num==i*i)
15             printf("%d\n",i);
16     }
17 
18     return 0;
19 }

6、組成最大數

題目內容:

任意輸入一個自然數,輸出該自然數的各位數字組成的最大數。

輸入格式:

自然數 n

輸出格式:

各位數字組成的最大數

輸入樣例:

1593

輸出樣例:

9531[回車]

 1 #include<stdio.h>
 2 
 3 int main()
 4 {
 5     int arr[10] = {0};
 6     int n;
 7     scanf("%d",&n);
 8     while(n)
 9     {
10         arr[n%10]++;
11         n /= 10;
12     }
13     for(int i=9; i>=0; --i)
14         while(arr[i]--)
15             printf("%d",i);
16     printf("\n");
17     return 0;
18 }

7、手工計算器

題目內容:

大名鼎鼎的帕斯卡(物理學家,發現大氣壓的那個)的老爸是一個稅務官,每天晚上都要把白天記下的賬目進行一系列計算,因此需要大量的計算工作,帕斯卡為了減輕父親每日的勞頓,發明了手搖計算器。

我們現在也來實現一個計算器:

輸入一系列的數值和符號,請你輸出計算結果【只考慮加減】。

輸入若干行,直到出現“=”,就可以輸出結果了

輸入格式:

5.0+

3.0+

6.0+

8.0-

9.0+

2.0=

輸出格式:

15.00(保留2位小數)【回車】

輸入樣例:

4.0+
3.0-
2.0+
1.0=
輸出樣例:

6.00

 1 #include <stdio.h> 
 2 #include <stdlib.h>   
 3 #include <string.h>
 4 
 5 int main()
 6 {
 7     double sum = 0;
 8     char s[100] = "";
 9     char ch;
10     scanf("%s",s);
11     sum += atof(s);
12     do{        
13         ch = s[strlen(s)-1];
14         switch(ch)
15         {
16             case '+':
17                 scanf("%s",s);
18                 sum += atof(s);
19                 break;
20             case '-':
21                 scanf("%s",s);
22                 sum -= atof(s);
23                 break;
24         }        
25     }while(ch!='=');
26     printf("%.2f\n",sum);    
27     return 0;
28 }

8、三天打魚兩天曬網

題目內容:

元旦,新年伊始,小明又立志了,作為一個海南省的資深漁民,他計划從元旦那天開始,兩天曬網,三天打魚。

假定1月1日開始執行計划,那么1月1日和1月2日是曬網的日子,1月3日,4日,5日是打魚的日子。請你計算一下,給定的日期,他應該是打魚還是曬網?【計划從每年的1月1日開始執行】

輸入格式:

2019,5,8

輸出格式:

打魚:fishing(回車)
曬網:sunning net(回車)

輸入樣例:

2019,5,8

輸出樣例:

fishing

 1 #include<stdio.h>
 2 int inputdate();
 3 int main()
 4 {
 5     int n = inputdate();
 6    /*  if(-1==n){
 7         printf("Invalid input");
 8     }
 9     else  */
10     if(n%5==0||n%5==4){
11         printf("sunning net\n");
12     }
13     else{
14         printf("fishing\n");
15     }
16  
17     return 0;
18 }
19 int inputdate()
20 {
21     int year,month,day;
22     int n = scanf("%d,%d,%d",&year,&month,&day);
23     /* if(3 != n||year<1990||month>12||month<=0||day>31||day<=0){
24         return -1;
25     } */
26  
27     int date[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
28                      {31,29,31,30,31,30,31,31,30,31,30,31}};
29  
30     int sum = 0, flag =(year%4==0&&year%100!=0)||(year%400==0);
31     for(int i=0;i<month-1;++i){
32         sum +=date[flag][i];
33     }
34  
35     return sum+day;
36 }

9、照相

題目內容:

有n個同學(偶數個)和老師一起照畢業照,老師必須站在最中間,同學們分成兩組,分列老師左右兩邊。

假設有A、B、C、D四個人。假設分好組,AB一組,CD一組。一共有8種不同的站位。

現假設組已經分好,那么一共有多少種不同的站法,需要照多少張照片?

輸入格式:

4

輸出格式:

8【回車】

輸入樣例:

4

輸出樣例:

8

 1 /*
 2     n個同學分成2組,每組n/2排列(階乘)
 3     {(n/2)!*(n/2)!}*2
 4  */
 5 #include<stdio.h>
 6 int fac(int n);
 7 int main()
 8 {
 9     int n;
10     scanf("%d",&n);    
11     printf("%d\n",(fac(n/2)*fac(n/2)*2));
12     return 0;
13 }
14 int fac(int n)
15 {
16     if(n==1)
17         return 1;
18     return n*fac(n-1);
19 }

10、字符串走馬燈

題目內容:

多彩的霓虹燈點綴了我們的夜生活,很多店鋪都用各式各樣的霓虹燈來招徠顧客。

你是一家新店的店主,決定采用霓虹燈和傳統走馬燈結合的方式來展現商品信息。 

走馬燈的規則如下:

對於給定的字符串abc(不超過20),走馬燈應該連續出現:

abc

bca

cab

abc

如此循環往復(第一行出現的字符串和最后一行的字符都和輸入一模一樣)

輸入格式:

一個字符串,如abc

輸出格式:

abc

bca

cab

abc

輸入樣例:

abc

輸出樣例:

abc

bca

cab

abc

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #define N 256
 5 int main( )
 6 {    
 7     char s[N] = "";    
 8     char *p = s;
 9     gets(s);
10     /* 打印次數, 字符串長度, 輸出的開始位置 */
11     int n,t1,t2,i=0;
12     n = strlen(s)+1;
13     t1 = t2 = strlen(s);
14     
15     if(1==strlen(s))/*只一個字符打印一次*/
16         puts(s);
17     else
18         while(n--)/*打印字符串的個數+1次*/
19         {
20             t1 = t2;
21             p = s+i;/*打印開始位置*/
22             while(t1--){
23                 if(*p=='\0')
24                     p = s;
25                 putchar(*p++);                
26             }
27             putchar('\n');
28             i++;
29         }    
30     return 0;
31 }

11、質數組成的整數

題目內容:

輸入一個N位數,N大於等於2且小於8.

考察每一組兩位數,判斷每一組兩位數都是質數的,請輸出YES,否則輸出NO。

例如:

537”中有53,37兩組兩位數,都是質數,所以輸出YES.

4236”中有42,23,36三組兩位數,且不都是質數,因此輸出NO.

輸入格式:

537

輸出格式:

YES

輸入樣例:

537

輸出樣例:

YES

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #include <math.h>
 5 int isPrime(int n){
 6     for(int i=2; i<sqrt(n); ++i)
 7         if(n%i==0)
 8             return 0;
 9     return 1;
10 }
11 int main( )
12 {    
13     int N;
14     int flag = 1;
15     scanf("%d",&N);
16     while(N)
17     {
18         if(!isPrime(N%100)){
19             flag = 0;
20             break;
21         }
22         if(N>=100){
23             N/=10;    
24         }
25         else
26             break;            
27     }
28     if(flag)
29         printf("YES");
30     else
31         printf("NO");
32     return 0;
33 }

12、重復字符計算

題目內容:

總有些字符串中,存在一些重復出現的字符,請將每一個字符串中重復出現的最后一個字符替換成相應的重復數。

例如,在aaa字符串中,a重復了3次,那么就將最后一個a替換為3,即aa3

只出現1次的,當然就不用處理了,因為沒有出現重復次數嘛

我們這里的字符串,在變換后長度也不會超過100的

輸入格式:

aaa

輸出格式:

aa3

輸入樣例:

abc

輸出樣例:

abc

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 #define N 256
 5 
 6 char s[N] = "";/*全局變量*/
 7 void fun(char *p,char ch, int count)
 8 {    /*1.保存最后一個字符后的字符串  */        
 9     while(*p!=ch)
10         p--;
11     char *t = p+1;
12     /*2.最后之前的字符串  */
13     *p = '\0';
14     /* 重復字符個數+之后的字符串 */
15     char s1[N] = "";
16     sprintf(s1,"%d",count);
17     strcat(s1,t);
18     /* 之前的字符串+重復字符個數+之后的字符串 */
19     strcat(s,s1);
20 }
21 int main( )
22 {    /*輸入計算重復字符  */    
23     scanf("%s",s);
24     int key[N] = {0};
25     for(int j=0; s[j]; ++j)
26         key[s[j]]++;
27     /* 字符串結束標記之前的位置 */
28     char *p = s+strlen(s)-1;
29     /*i為字符, 修改字符串*/
30     for(int i=0; i<N; ++i){        
31         if(key[i]>1){
32             p = s+strlen(s)-1;/* 字符串結束標記之前的位置 */
33             fun(p,i,key[i]);/*修改字符串*/
34         }
35     }
36     printf("%s",s);/*打印修改字符串*/
37     return 0;
38 }

13、蛇形矩陣

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 int main( )
 6 {    
 7     int a[10][10],s=0,n,i=1,j=1,t=0;
 8     scanf("%d",&n);
 9     /* 輸入蛇形矩陣 */
10     while (i<n||j<n)
11     {
12         ++s;
13         a[i-1][j-1]=s; //
14         if(t)//
15         {
16             if (j==1)
17             {
18                 t=0;
19                 if (n==i) 
20                     ++j; 
21                 else 
22                     ++i;
23             }
24             else if(n==i)
25             {
26                 t=0;
27                 ++j;
28             }
29             else
30             {
31                 ++i;--j;
32             }
33         }            
34         else if (i==1)//
35         {
36             t=1;
37             if (n==j) 
38                 ++i;
39             else 
40                 ++j;
41         }
42         else if (n==j)
43         {
44             t=1;
45             ++i;
46         }
47         else
48         {
49             --i;
50             ++j;
51         }
52     }
53     
54     a[n-1][n-1]=s+1;
55     
56     /* 輸出矩陣 */
57     if (n>1)
58     {
59         for(i=1;i<=n;i++)
60         {
61             printf("%2d",a[i-1][0]);
62             for(j=2;j<=n;j++)
63                 printf("%3d",a[i-1][j-1]);
64             printf("\n");
65         }
66     }    
67     else
68     {
69         printf("1\n");
70     }            
71     return 0;
72 }

14、洗牌

題目內容:

假設我們有 2n 張牌,它們以 1, 2, ..., n, n+1, ..., 2n 編號並在開始時保持着這種順序。一次洗牌就是將牌原來的次序變為 n+1, 1, n+2, 2, ..., 2n, n,也就是將原來的前 n 張牌放到位置 2, 4, ..., 2n,並且將余下的 n 張牌按照他們原來的次序放到奇數位置 1, 3, ..., 2n-1。已經證明對於任何一個自然數 n,這 2n 張牌經過一定次數的洗牌就回到原來的次序。但我們不知道對於一個特定的 n,需要幾次洗牌才能將牌洗回原來的次序。

輸入格式:

牌張數的一半n,即初始情況下一共有2n張牌,n為int型整數

輸出格式:

將牌洗回原來的次序所需要的洗牌次數

輸入樣例:

10

輸出樣例:

6[回車]

 1 #include <stdio.h>
 2 #define N 100000
 3 int main()
 4 {
 5     int n;
 6     scanf("%d",&n);
 7     int a[N] = {0};
 8     int b[N] = {0};
 9     for(int i=0; i<2*n; ++i)
10         b[i] = i+1;
11 
12     int count=0,flag=0;
13     while(flag<2*n){
14         count++;
15         flag = 0;
16         int j = 0, t = n;
17         for(int i=0; i<2*n; ++i){
18             if(i%2)
19                 a[i] = b[j++];
20             else
21                 a[i] = b[t++];
22         }
23         for(int i=0; i<2*n; ++i){
24             b[i] = a[i];
25             if(a[i]==i+1)
26                 flag++;
27         }
28     }
29     printf("%d\n",count);
30     return 0;
31 }

15、郵票組合

題目內容:

我們寄信都要貼郵票,在郵局有一些小面值的郵票,通過這些小面值郵票中的一張或幾張的組合,可以滿足不同郵件的不同的郵資。
現在,郵局有4種不同面值的郵票。在每個信封上最多能貼5張郵票,面值可相同,可不同。

輸入格式:

四種郵票的面值。

輸出格式:

用這四種面值組成的郵資最大的從1開始的一個連續的區間。

說明:
如結果為10,則表明使用4張郵票可組合出1、2、3、4、5、6、7、8、9、10這些郵資。

名詞解釋:
郵資:就是你寄東西需要花多少錢。
郵票面額:是由國家發行的具有固定價格的花紙片,被稱為郵票。

如果你寄東西,郵局稱了重量,告訴你要240分。這樣你就要貼郵票了。如果現在郵局的郵票有面值為80分、50分、20分和10分的四種,你就可以 采用不同的組合得到240的郵資,例如:采用3張80分的可以湊出240分;或者24張10分的湊起來240分也可以。顯然不同郵票的組合都可以得到同樣一種郵資。

輸入樣例:

1 4 12 21

輸出樣例:

The max is 71.
 1 #include<stdio.h>
 2 int f(int *m,int a1,int a2,int a3,int a4)
 3 {
 4     int i,j,k,p;
 5     for( i = 0 ; i <= 5 ; i++ )
 6     { 
 7         for( j = 0 ; j <= 5 - i ; j++ ) 
 8         { 
 9             for( k = 0 ; k <= 5 - i - j ; k++ ) 
10             { 
11                 for( p = 0 ; p <= 5 - i - j - k ; p++ ) 
12                 {
13                     if( a1 * i + a2 * j + a3 * k + a4 * p == *m)
14                         return 1;              
15                 }            
16             } 
17         } 
18     } 
19     return 0;    
20 }
21 int main()
22 {
23     int a1, a2, a3, a4, m=1;
24     scanf("%d%d%d%d",&a1,&a2,&a3,&a4);
25     while(f(&m,a1,a2,a3,a4))
26         m++; 
27     printf("The max is %d.\n",--m);
28     return 0;
29 }

16、火鍋火鍋和火鍋

題目內容:

眾所周知,沫沫以火鍋為生。在E8的聚餐活動中,他經常賣萌賣無辜領着大家吃火鍋。。

有一天,沫沫聽說學校附近的哺呷哺呷在某現充的贊助下有一個優惠活動,只需30軟妹幣,對每個客人,它會上N道菜,但是客人只能挑選其中連續上的一些菜。

於是他非常興奮的拉着灰灰和渣渣去吃火鍋去啦。

沫沫是一個十分挑食的人,所以他對每一道菜都有一個愉快度(當然因為他的挑食,某些事物的愉快度會是負數)。

為了讓沫沫能非常愉快的享受這次聚餐,善解人意的灰灰和渣渣決定幫他計算,他們應該怎么選擇菜才能使沫沫最開心地吃完這次聚餐。

輸入格式:

第一行是一個整數T,(T <= 10)表示測試案例的個數

對於每個測試案例,第一行是一個整數N,( 1<=N <= 10000)表示菜的個數

接下來的N個數字,第i個數字si表示沫沫對第i道菜的愉快度。( -1000 <=si <= 1000)

PS:由於CF又被血虐掉rating,所以沫沫的起始愉快度是0

PPS:沫沫完全可能得到一個為負值的愉快值, poor 沫沫。。

輸出格式:

對於每個樣例,輸出一個數字,表示沫沫吃完之后愉快度的最大值。

HINT:

對於 5

6 -1 5 4 -7

我們選擇6, -1, 5, 4這四道菜(注意必須是連續的,所以不能跳過-1)

做完后請思考,如果N的范圍是1<=N<=100000呢?

輸入樣例:

2
5
6 -1 5 4 -7
7
0 6 -1 1 -6 7 -5

輸出樣例:

14
7
 1 #include<stdio.h>
 2 int main()
 3 {
 4     /**<1.案例個數*/
 5     int n;
 6     scanf("%d",&n);
 7     while(n--)
 8     {
 9         /**<2.菜的個數*/
10         int m,sum = 0,max = -1000;
11         scanf("%d",&m);
12         while(m--)
13         {
14             int x;
15             scanf("%d",&x);
16             sum += x;
17             if(sum>max)/**<愉快度x的最大值也可能是負值*/
18                 max = sum;
19             /**< 為了sum最大,一旦發現sum小於0賦值為0*/
20             else if(sum<0)
21                 sum = 0;
22         }
23         printf("%d\n",max);
24     }
25     return 0;
26 }

17、子數整除 

題目內容:

對於一個五位數a1a2a3a4a5,可將其拆分為三個子數:

  • sub1=a1a2a3

  • sub2=a2a3a4

  • sub3=a3a4a5

例如,五位數20207可以拆分成:

  • sub1=202

  • sub2=020(=20)

  • sub3=207

現在給定一個正整數K,要求你編程求出10000到30000之間所有滿足下述條件的五位數,條件是這些五位數的三個子數sub1、sub2、sub3都可被K整除。

輸出時請按照由小到大的順序排列(每行輸出一個數)。

輸入格式:

一個正整數K

輸出格式:

請按照由小到大的順序排列(每行輸出一個數)

輸入樣例:

15

輸出樣例:

22555[回車]

25555[回車]

28555[回車]

30000[回車]

 1 #include<stdio.h>
 2 int  main( )
 3 { 
 4     int k;
 5     scanf("%d",&k);
 6     for(int i=10000; i<=30000;++i)
 7     {
 8         int sub1 = i/100;
 9         int sub2 = i/10%1000;
10         int sub3 = i%1000;
11         
12         if(sub1%k==0&&sub2%k==0&&sub3%k==0)
13             printf("%d\n",i);
14     }    
15     return 0; 
16 }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM