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 }