致初學者(二): HDU 2014~ 2032題解
下面繼續給出HDU 2014~2032的AC程式,供大家參考。2014~2032這19道題就被歸結為“C語言程式設計練習(三) ”~“C語言程式設計練習(五) ”。
HDU 2014:青年歌手大獎賽_評委會打分
用max儲存最高分,min儲存最低分,sum表示總分,則最後平均分為(sum-max-min)/(n-2)。
#include <stdio.h> int main() { int n,i,score,min,max,sum; while (scanf("%d",&n)!=EOF) { sum=0; min=1000; max=-1; for (i=1;i<=n;i++) { scanf("%d",&score); sum+=score; if (min>score) min=score; if (max<score) max=score; } printf("%.2f\n",1.0*(sum-max-min)/(n-2)); } return 0; }
HDU 2015: 偶數求和
簡單迴圈程式。用變數cnt記錄偶數的個數,用sum儲存偶數的累加和。
#include <stdio.h> int main() { int n,m,num,cnt,sum,i,first; while (scanf("%d%d",&n,&m)!=EOF) { num=2; sum=0; cnt=0; first=0; for (i=1;i<=n;i++) { sum+=num; num+=2; cnt++; if (cnt==m) { if (first!=0) printf(" "); printf("%d",sum/cnt); first=1; sum=0; cnt=0; } } if (cnt!=0) { if (first!=0) printf(" "); printf("%d",sum/cnt); } printf("\n"); } return 0; }
HDU 2016: 資料的交換輸出
陣列的簡單應用。
#include <stdio.h> int main() { int n,i,j,t,a[100]; while (scanf("%d",&n) && n!=0) { for (i=0;i<n;i++) scanf("%d",&a[i]); j=0; for (i=1;i<n;i++) if (a[j]>a[i]) j=i; t=a[j]; a[j]=a[0]; a[0]=t; for (i=0;i<n;i++) { if (i!=0) printf(" "); printf("%d",a[i]); } printf("\n"); } return 0; }
HDU 2017: 字串統計
字串的簡單應用。
#include <stdio.h> int main() { int n,i,cnt; char str[100]; scanf("%d",&n); while (n--) { scanf("%s",str); cnt=0; for (i=0;str[i]!='\0';i++) if (str[i]>='0' && str[i]<='9') cnt++; printf("%d\n",cnt); } return 0; }View Code
HDU 2018: 母牛的故事
設f[i]表示第i年母牛的數目,顯然可以這樣看第i年母牛的數量,第i-1年的所有牛在第i年仍然活著(存在),第i-3年的每頭牛(在第i年正好屬於第4個年頭)在第i年都會產一頭小牛,故
f[i]=f[i-1]+f[i-3];
#include <stdio.h> int main() { int n,i; int f[55]={0,1,2,3,4}; for (i=5;i<55;i++) f[i]=f[i-1]+f[i-3]; while (scanf("%d",&n) && n!=0) { printf("%d\n",f[n]); } return 0; }View Code
HDU 2019: 數列有序!
採用插入排序的思想將m插入到有序的數列中。具體做法是從數列的後面向前面尋找,若當前數比m大,則向後移一個位置;若當前數比m小,退出迴圈,將m 插在當前數後面即可。
#include <stdio.h> int main() { int n,m,i; int a[101]; while (1) { scanf("%d%d", &n,&m); if (n==0 && m==0) break; for (i=0;i<n;i++) scanf("%d",&a[i]); for (i=n-1;i>=0 && a[i]>m;i--) a[i+1]=a[i]; a[i+1]=m; for (i=0;i<=n;i++) if (i!=0) printf(" %d",a[i]); else printf("%d",a[i]); printf("\n"); } return 0; }View Code
HDU 2020: 絕對值排序
採用氣泡排序法將陣列A中的各元素按其絕對值從大到小排列。
#include <stdio.h> #include <math.h> int main() { int n,i,j,t; int a[101]; while (scanf("%d", &n) && n!=0) { for (i=0;i<n;i++) scanf("%d",&a[i]); for (i=0;i<n-1;i++) for (j=0;j<n-1-i;j++) if (abs(a[j])<abs(a[j+1])) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } for (i=0;i<n;i++) if (i!=0) printf(" %d",a[i]); else printf("%d",a[i]); printf("\n"); } return 0; }View Code
HDU 2021: 發工資咯:)
簡單迴圈。處理時,先用足100元,剩下再足50元,剩下依次用足10元、5元和2元,最後剩下用1元。
#include <stdio.h> int main() { int n,i,salary,cnt; while (scanf("%d",&n) && n!=0) { cnt=0; for (i=1;i<=n;i++) { scanf("%d",&salary); cnt+=salary/100; salary%=100; cnt+=salary/50; salary%=50; cnt+=salary/10; salary%=10; cnt+=salary/5; salary%=5; cnt+=salary/2; salary%=2; cnt+=salary; } printf("%d\n",cnt); } return 0; }View Code
HDU 2022: 海選女主角
簡單二維陣列的輸入,求各元素絕對值最大的元素及其位置。
#include <stdio.h> #include <math.h> int main() { int m,n,i,j,maxi,maxj,max; int a[101][101]; while (scanf("%d%d",&m,&n) !=EOF) { for (i=0;i<m;i++) for (j=0;j<n;j++) scanf("%d",&a[i][j]); max=a[0][0]; maxi=0; maxj=0; for (i=0;i<m;i++) for (j=0;j<n;j++) if (abs(max)<abs(a[i][j])) { max=a[i][j]; maxi=i; maxj=j; } printf("%d %d %d\n",maxi+1,maxj+1,max); } return 0; }View Code
HDU 2023: 求平均成績
學習二維陣列的輸入和遍歷方法。定義 int score[50][5]儲存學生的各門課程成績,
double stu[50]儲存各學生的平均成績, double course[5] 儲存各課程的平均成績。
#include <stdio.h> int main() { int n,m,score[50][5],i,j,sum,cnt,flag; double stu[50],course[5]; while (scanf("%d%d",&n,&m)!=EOF) { for (i=0;i<n;i++) // 輸入n個學生的成績並計算每個學生的平均成績 { sum=0; for (j=0;j<m;j++) { scanf("%d",&score[i][j]); sum+=score[i][j]; } stu[i]=1.0*sum/m; } for (i=0;i<n;i++) // 輸出n個學生的平均成績 { if (i!=0) printf(" "); printf("%.2lf",stu[i]); } printf("\n"); for (j=0;j<m;j++) // 計算m門課程的平均成績 { sum=0; for (i=0;i<n;i++) sum+=score[i][j]; course[j]=1.0*sum/n; } for (i=0;i<m;i++) // 輸出m門課程的平均成績 { if (i!=0) printf(" "); printf("%.2lf",course[i]); } printf("\n"); cnt=0; for (i=0;i<n;i++) // 統計各科成績均大於等於平均成績的學生數量 { flag=1; for (j=0;j<m;j++) if (1.0*score[i][j]<course[j]) { flag=0; break; } if (flag==1) cnt++; } printf("%d\n\n",cnt); } return 0; }View Code
HDU 2024: C語言合法識別符號
簡單字串處理。C語言合法識別符號規則是:識別符號是由大小寫英文字母、數字以及下劃線(_)所構成的字元序列,第一個字元不能是數字。
#include <stdio.h> #include <string.h> bool isLegalChar(char ch) { if (ch>='0' && ch<='9') return true; if (ch>='A' && ch<='Z') return true; if (ch>='a' && ch<='z') return true; if (ch=='_') return true; return false; } int main() { int n,i,flag; char str[51]; scanf("%d",&n); getchar(); while (n--) { gets(str); flag=1; for (i=0;str[i]!='\0';i++) { if (i==0 && str[i]>='0' && str[i]<='9') { flag=0; break; } if (!isLegalChar(str[i])) { flag=0; break; } } if (flag==1) printf("yes\n"); else printf("no\n"); } return 0; }View Code
HDU 2025: 查詢最大元素
字串簡單應用。
#include <stdio.h> int main() { char str[101],max; int i; while (scanf("%s",str)!=EOF) { max=str[0]; for (i=1;str[i]!='\0';i++) { if (max<str[i]) max=str[i]; } for (i=0;str[i]!='\0';i++) { printf("%c",str[i]); if (str[i]==max) printf("(max)"); } printf("\n"); } return 0; }View Code
HDU 2026: 首字母變大寫
簡單字串處理。通過空格確定是否為下一個單詞,將單詞的首字母小寫變大寫(ASCII值減32即可)。
#include <stdio.h> #include <string.h> int main() { int i,flag; char str[101]; while (gets(str)) { flag=0; // 需小寫改大寫 for (i=0;str[i]!='\0';i++) { if (flag==0 && str[i]>='a' && str[i]<='z') { printf("%c",str[i]-32); flag=1; } else if (str[i]==' ') { printf("%c",str[i]); flag=0; } else printf("%c",str[i]); } printf("\n"); } return 0; }View Code
HDU 2027: 統計母音
簡單字串處理。
#include <stdio.h> #include <string.h> int main() { int n,i,num1,num2,num3,num4,num5; char str[101]; scanf("%d",&n); getchar(); while (n--) { gets(str); num1=num2=num3=num4=num5=0; for (i=0;str[i]!='\0';i++) { switch (str[i]) { case 'a': num1++; break; case 'e': num2++; break; case 'i': num3++; break; case 'o': num4++; break; case 'u': num5++; break; } } printf("a:%d\ne:%d\ni:%d\no:%d\nu:%d\n",num1,num2,num3,num4,num5); if (n>0) printf("\n"); } return 0; }View Code
HDU 2028: Lowest Common Multiple Plus
將求整數x和y的最小公倍數抽象為一個函式,函式原型為:int lcm(int x,int y);
#include <stdio.h> int lcm(int x,int y) { int t1,t2,r; t1=x; t2=y; while (t1%t2!=0) { r=t1%t2; t1=t2; t2=r; } return x/t2*y; } int main() { int n,i,x,y; while (scanf("%d",&n) !=EOF) { y=1; for (i=1;i<=n;i++) { scanf("%d",&x); y=lcm(x,y); } printf("%d\n",y); } return 0; }View Code
HDU 2029: Palindromes _easy version
字串str是否為“迴文”的判斷。採用類雙指標的方法,下標i指向左端(初始值為0),j指向右端(初始值為strlen(str)-1),比較str[i]和str[j],如果兩者不相等,則str肯定不是迴文,退出迴圈比較;如果兩者相等,則i++向右走,j--向左走,直到兩個指標相遇或交錯,此時可確定str是迴文。
#include <stdio.h> #include <string.h> int main() { int n,i,j; char str[101]; scanf("%d",&n); while (n--) { scanf("%s",str); for (i=0,j=strlen(str)-1;i<j;i++,j--) { if (str[i]!=str[j]) break; } if (i<j) printf("no\n"); else printf("yes\n"); } return 0; }View Code
HDU 2030: 漢字統計
簡單字串處理。漢字機內碼採用2個位元組儲存,且每個位元組的最高位為1,檢測字串中每個位元組的最高位即可,用位運算 (str[i] & 0x80) !=0 表示 str[i]最高位為1。
#include <stdio.h> #include <string.h> int main() { int n,i,cnt; char str[10001]; scanf("%d",&n); getchar(); while (n--) { gets(str); cnt=0; for (i=0;str[i]!='\0';i++) { if ((str[i] & 0x80)!=0) cnt++; } printf("%d\n",cnt/2); } return 0; }View Code
HDU 2031: 進位制轉換
十進位制數轉換成R進位制數的方法是:將十進位制整數不斷除以R,記下餘數,直到商為0,將所得的餘數逆序排列就是對應的R進位制數。採用字串陣列
char b[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; 來儲存R進位制的各數碼。
#include <stdio.h> #include <string.h> int main() { char b[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; int c[32],n,base,i; while (scanf("%d%d",&n,&base)!=EOF) { i=0; if (n<0) { printf("-"); n=-n; } do { c[i]=n % base; i++; n=n/base; } while(n!=0); for(--i;i>=0;--i) printf("%c",b[c[i]]); printf("\n"); } return 0; }View Code
HDU 2032: 楊輝三角
可以採用二維陣列來儲存楊輝三角的各項。
#include <stdio.h> int main() { int n,i,j,y[31][31]={0}; for (i=1;i<=30;i++) y[i][1]=y[i][i]=1; for (i=3;i<=30;i++) for (j=2;j<i;j++) y[i][j]=y[i-1][j-1]+y[i-1][j]; while (scanf("%d",&n)!=EOF) { for (i=1;i<=n;i++) { for (j=1;j<=i;j++) { if (j!=1) printf(" "); printf("%d",y[i][j]); } printf("\n"); } printf("\n"); } return 0; }View Code
也可以採用一維陣列來儲存楊輝三角的最後一行的各項,這樣邊求下一行邊輸出。
#include <stdio.h> #include <string.h> int main() { int y[30],row,col,n; while (scanf("%d",&n)!=EOF) { memset(y,0,sizeof(y)); // 陣列元素初始化為0 y[0]=1; printf("%d\n",y[0]); for (row=1;row<n;row++) { for (col=row;col>=1;col--) y[col]=y[col]+y[col -1]; for (col=0;col<=row;col++) { if (col!=0) printf(" "); printf("%d",y[col]); } printf("\n"); } printf("\n"); } return 0; }View Code
&n