• 致初学者(二): 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
    ",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("
    ");
        }
        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("
    ");
        }
        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]!='';i++)
                if (str[i]>='0' && str[i]<='9')
                    cnt++;
            printf("%d
    ",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
    ",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("
    ");
        }
        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("
    ");
        }
        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
    ",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
    ",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("
    ");
            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("
    ");
            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
    
    ",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]!='';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
    ");
            else
                printf("no
    ");
        }
        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]!='';i++)
             {
                 if (max<str[i])
                    max=str[i];
              }
              for (i=0;str[i]!='';i++)
              {
                    printf("%c",str[i]);
                    if (str[i]==max)
                       printf("(max)");
              }
              printf("
    ");
         }
         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]!='';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("
    ");
        }
        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]!='';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
    e:%d
    i:%d
    o:%d
    u:%d
    ",num1,num2,num3,num4,num5);
            if (n>0) printf("
    ");
        }
        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
    ",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
    ");
            else
                printf("yes
    ");
        }
        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]!='';i++)
            {
                if ((str[i] & 0x80)!=0) cnt++;
            }
            printf("%d
    ",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("
    ");
        }
        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("
    ");
            }
            printf("
    ");
        }
        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
    ",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("
    ");
            }
            printf("
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    VMware + CentOS 7搭建环境(二)
    VMware + CentOS 7搭建环境(一)
    电脑清理的问题整理
    windows下搭建vue+webpack的开发环境
    git使用指南
    如何使用前端技术设置地理围栏?
    js点击按钮button效果(波效果)
    计算两个日期时间之间的时间差:28小时38分钟
    jQuery实现的全选、反选和获取当前所有选中的值功能
    vue恼人的node_modules目录删除方法
  • 原文地址:https://www.cnblogs.com/cs-whut/p/11521319.html
Copyright © 2020-2023  润新知