1. 程式人生 > >致初學者(二): HDU 2014~ 2032題解

致初學者(二): 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;
}
View Code

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; 
}
View Code

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; 
}
View Code

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