欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

致初学者(一): HDU 2000~ 2013题解

程序员文章站 2022-12-21 14:30:19
对于开始学习C语言程序设计或C++程序设计面向过程部分的同学来说,利用在线OJ网站进行实践训练,对提高自己的编程能力很有好处。国内外OJ网站很多,每个都去看看,去刷个题,是不现实的,也没必要。即使一个OJ网站,上面3~4千道题也难全部刷完。因此,给大家推荐两个OJ网站。一个是北京大学的PKU Jud ......

      对于开始学习c语言程序设计或c++程序设计面向过程部分的同学来说,利用在线oj网站进行实践训练,对提高自己的编程能力很有好处。国内外oj网站很多,每个都去看看,去刷个题,是不现实的,也没必要。即使一个oj网站,上面3~4千道题也难全部刷完。因此,给大家推荐两个oj网站。一个是北京大学的pku judgeonline(),简称poj;另一个是杭州电子科技大学的hdu online judge system (),简称 hdu。将这两个网站结合起来用于程序设计的训练是有帮助的。

       poj上面有3千多道题,绝大部分是英文题目,显得高大上些;hdu上有近6千道题,有部分中文题目,比poj接地气些。这两个oj网站上的题目编排顺序不是按难易程度,也不是按专题(hdu稍微好些,有时还有些专题集锦的小概念)。因此,对初学者而言,究竟找哪些题刷是个问题。题目难了,无从下手,伤信心和兴趣,老刷简单的,对提高作用就不大了。有时逛网络,又经常发现一些文章这水题一枚,那水题又一枚,自己拿来一看,又不一定是那回事。作为一个程序设计初学者,你就是一小学生,有那么一嘚瑟的大学生跟你讲微积分简单,一元二次方程不值得提,道理一样。别过多在意别人的说法,自己根据自己的水平,找到适合自己做的事就好了。

      有鉴于此,我整理了一个随笔专题:致初学者。主要想帮助初学者在poj和hdu上找到合适的题目训练。大牛们别笑话,路过好了。

      我们先看hdu。hdu 题目集第11卷中pro.id号为2000~2099这100道题中85%是中文题目,题意理解起来不存在语言障碍。并且这100道题本身被归结为一些小专题,比如2000~2032这33道题就被归结为“c语言程序设计练习(一) ”~“c语言程序设计练习(五) ”,对于初学者作为习题进行训练恰到好处。下面我以题解的形式先给出这100道题的ac程序,供大家参考。

hdu 2000:  ascii码排序

      简单的分支选择结构。输入a,b,c三个字母,比较交换a和b,使a比b小;比较交换a和c,使a比c小;这样a就是最小的字母了;最后比较交换b和c,使b比c小。

#include <stdio.h>
int main()
{
    char c1,c2,c3,temp;
    while (scanf("%c%c%c",&c1,&c2,&c3)!=eof)
    {
        if (c1>c2)
        {
            temp=c1; c1=c2; c2=temp;
        }
        if (c1>c3)
        {
            temp=c1; c1=c3; c3=temp;
        }
        if (c2>c3)
        {
            temp=c2; c2=c3; c3=temp;
        }
        printf("%c %c %c\n",c1,c2,c3);
        getchar();
    }
    return 0; 
}

hdu 2001:计算两点间的距离

      简单公式计算。已知两点坐标(x1,y1)和(x2,y2),两点距离公式为sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1))。

#include <stdio.h>
#include <math.h>
int main()
{
    double x1,x2,y1,y2,dis;
    while (scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2)!=eof)
    {
        dis=sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
        printf("%.2lf\n",dis);
    }
    return 0; 
}

hdu 2002:2002 计算球体积 

       简单公式计算题。已知半径r,球的体积计算公式为:v=4/3*pi*r3

#include <stdio.h>
#define pi 3.1415927
int main()
{
    double r,v;
    while (scanf("%lf",&r)!=eof)
    {
        v=4.0/3*pi*r*r*r;
        printf("%.3lf\n",v);
    }
    return 0; 
}

hdu 2003: 求绝对值 

      简单选择结构 if (x<0)  x=-x;

#include <stdio.h>
int main()
{
    double x;
    while (scanf("%lf",&x)!=eof)
    {
        if (x<0)
            x=-x;
        printf("%.2lf\n",x);
    }
    return 0; 
}

hdu 2004:成绩转换 

     多分支嵌套 if …else if ……

#include <stdio.h>
int main()
{
    int score;
    while (scanf("%d",&score)!=eof)
    {
        if (score<0 || score>100)
            printf("score is error!\n");
        else if (score<60)
            printf("e\n");
        else if (score<70)
            printf("d\n");
        else if (score<80)
            printf("c\n");
        else if (score<90)
            printf("b\n");
        else 
            printf("a\n");
    }
    return 0; 
}

hdu 2005:第几天?

    switch …case …结构的灵活使用。

#include <stdio.h>
int main()
{
    int year,month,day,d;
    while (scanf("%d/%d/%d",&year,&month,&day)!=eof)
    {
        d=0;
        switch(month-1)
        {
            case 11:d+=30;
            case 10:d+=31;
            case 9:d+=30;
            case 8:d+=31;
            case 7:d+=31;
            case 6:d+=30;
            case 5:d+=31;
            case 4:d+=30;
            case 3:d+=31;
            case 2:d+=28;
                 if (year%4==0 && year%100!=0 || year%400==0) d++;
            case 1:d+=31;
        }
        d=d+day;
        printf("%d\n",d);
      }
      return 0; 
}

   或数组的应用。

#include <stdio.h>
int main()
{
    int table[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    int year,month,day,d,i;
    while (scanf("%d/%d/%d",&year,&month,&day)!=eof)
    {
        d=0;
        for (i=1;i<=month-1;i++)
            d+=table[i];
        if (month>2 && (year%4==0 && year%100!=0 || year%400==0)) 
            d++;
        d=d+day;
        printf("%d\n",d);
      }
      return 0; 
}

hdu 2006:求奇数的乘积 

      简单循环结构。

#include <stdio.h>
int main()
{
    int n,x,p,i;
    while (scanf("%d",&n)!=eof)
    {
         p=1;
         for (i=1;i<=n;i++)
         {
             scanf("%d",&x);
             if (x%2) 
                 p*=x;
         }
         printf("%d\n",p);
    }
    return 0; 
}

hdu 2007:平方和与立方和 

      简单循环结构。

#include <stdio.h>
int main()
{
    int x,y,i,t,sum1,sum2;
    while (scanf("%d%d",&x,&y)!=eof)
    {
       if (x>y)
       {
           t=x; x=y; y=t;
       }
       sum1=sum2=0;
       for (i=x;i<=y;i++)
       {
             if (i%2) 
                 sum2+=i*i*i;
             else
                 sum1+=i*i;
       }
       printf("%d %d\n",sum1,sum2);
    }
    return 0; 
}

hdu 2008:数值统计 

      循环体中用选择结构分别统计大于0、等于0和小于0的数的个数。

#include <stdio.h>
int main()
{
    int n,i,a,b,c;
    double x;
    while (scanf("%d",&n) && n!=0)
    {
       a=b=c=0;
       for (i=1;i<=n;i++)
       {
           scanf("%lf",&x);
           if (x>0)
               c++;
           else if (x<0)
              a++;
           else
              b++;
       }
       printf("%d %d %d\n",a,b,c);
    }
    return 0; 
}

hdu 2009:求数列的和 

      简单循环结构。

#include <stdio.h>
#include <math.h>
int main()
{
    int n,m,i;
    double x,sum;
    while (scanf("%d%d",&n,&m)!=eof)
    {
       x=1.0*n;
       sum=0.0;
       for (i=1;i<=m;i++)
       {
           sum+=x;
           x=sqrt(x);
       }
       printf("%.2lf\n",sum);
    }
    return 0; 
}

hdu 2010:水仙花数

     简单循环结构。设a,b,c分别表示3位数x的百位、十位和个位,则

     a=x/100 ;     b=x%100/10;     c=x%10;

#include <stdio.h>
#include <math.h>
int main()
{
    int n,m,i,a,b,c,cnt;
    while (scanf("%d%d",&m,&n)!=eof)
    {
       cnt=0;
       for (i=m;i<=n;i++)
       {
           a=i/100;
           b=i%100/10;
           c=i%10;
           if (i==a*a*a+b*b*b+c*c*c)
           {
               cnt++;
               if (cnt!=1)
                   printf(" ");
               printf("%d",i);
           }
       }
       if (cnt==0)
           printf("no\n");
       else
           printf("\n");
    }
    return 0; 
}

hdu 2011:多项式求和 

      简单循环结构。为进行奇数项相加,偶数项相减的切换。定义变量flag,初始值为1,之后每循环一次后flag=-flag,即 1,-1,1,-1,1,-1,…,从而实现加减的切换。

#include <stdio.h>
#include <math.h>
int main()
{
    int n,m,i,flag;
    double sum;
    scanf("%d",&m);
    while (m--)
    {
       sum=0.0;
       flag=1;
          scanf("%d",&n);
       for (i=1;i<=n;i++)
       {
           sum+=flag*1.0/i;
           flag=-flag;
       }
       printf("%.2lf\n",sum);
    }
    return 0; 
}

hdu 2012:素数判定

      将素数的判定抽象为一个函数。原型为: bool isprime(int x);

#include <stdio.h>
#include <math.h>
bool isprime(int x)
{
    int i,n;
    n=(int)sqrt(1.0*x);
    for (i=2;i<=n;i++)
        if (x%i==0) return false;
    return true;
}
int main()
{
    int x,y,i,cnt;
    while (1)
    {
       scanf("%d%d",&x,&y);
       if (x==0 && y==0) break;
       cnt=0;
       for (i=x;i<=y;i++)
       {
           if (isprime(i*i+i+41))
               cnt++;
       }
       if (cnt==y-x+1)
           printf("ok\n");
       else
           printf("sorry\n");
    }
    return 0; 
}

hdu 2013:蟠桃记

      简单循环迭代计算。迭代式为  num=2*(num+1);  迭代初值num=1。

#include <stdio.h>
int main()
{
    int n,day,num;
    while (scanf("%d",&n)!=eof)
    {
        num=1;
       for (day=n-1;day>=1;day--)
       {
           num=2*(num+1);
       }
       printf("%d\n",num);
    }
    return 0; 
}