零基础(伪)HDOJ水题总结【1】

首先要解决的是输入输出的问题。作为一个渣渣新手,我用以前学的 C++写了错误代码提交,后果可想而知。

首先是C++与C开始让我看的很不习惯的,先贴上

printf(“格式字符控制串”,输出表列)

转换说明符
%a(%A) 浮点数、十六进制数字和p-(P-)记数法(C99)
%c 按字符型输出
%d 有符号十进制整数  %ld 十进制长整型
%f 浮点数(包括float和doulbe)  
%e(%E) 浮点数指数输出[e-(E-)记数法]
%g(%G) 浮点数不显无意义的零"0"
%i 有符号十进制整数(与%d相同)
%u 无符号十进制整数
%o 八进制整数 e.g. 0123
%x(%X) 十六进制整数0f(0F) e.g. 0x1234
%p 指针
%s 字符串
%% "%"

 所以认认真真的看了【ACM新手之八大输入输出】,格式记好,在后面运用会越用越熟的。

2000
很easy的一题,首先,现在假设我什么都不会(至少编译器,头文件,基本格式知道)我要解决该怎么办?(以后需要学的和缺少的直接补上,不多说。)
1.比较大小,高中算法讲过。三个数的轮序比较。至于排序算法。我搜到的【冒泡排序】以后再探讨。
2.但是getchar()的用法,忘了。我只知道用一个东西(…)把字符转化成ASCII码,然后可以排序。

关于ASCII:

A65 - Y91

048 - 957

 另:getchar()  putchar()  puts()

puts()是用来输出字符串并换行 
putchar()是输出字符变量

getchar() 永远只向缓存中输入一个字符,回车读取。

puts(char *p),专门输出字符串,参数为一个指向字符串的指针p,一个串的地址。

printf(char *p,s)

审题:空格!

#include<stdio.h>
int main()
{
    char ch1,ch2,ch3,temp;
    while(scanf("%c%c%c",&ch1,&ch2,&ch3)!=EOF)
    {
        getchar();
        if(ch1>ch2)
        {
          temp=ch1;
          ch1=ch2;
          ch2=temp;
        }
         if(ch1>ch3)
        {
            temp=ch1;
            ch1=ch3;
            ch3=temp;
        }
        if(ch2>ch3)
        {
            temp=ch2;
            ch2=ch3;
            ch3=temp;
        }
        printf("%c%2c%2c\n",ch1,ch2,ch3);
    }
return 0;
}

2002

1.第二题竟然狗血的想到了数组(其实没那么麻烦,两个变量罢了)学呗,数组此题的代码不是一般的长啊。本着KISS原则(keep it simple and stupid)。还是用简单方法吧。【数组】

(定义一个二维数组Dist[2][10],假设有两点a(2,3),b(5,6),将他们的坐标放入数组中

Dist[0][0]=2;

Dist[0][1]=5;

Dist[1][0]=3;

Dist[1][1]=6;

他们间的距离就是double x=(Dist[0][0]-Dist[0][1])*(Dist[0][0]-Dist[0][1])+(Dist[1][0]-Dist[1][1])*(Dist[1][0]-Dist[1][1]);
double distance = Math.sqrt(x);)

神烦……


2.<math.h>与<cmath>
sqrt 和 abs fabs比较常用?库函数使用得当可以提高编码效率。

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

2002
1.#define 宏定义,方便以后的修改。
2.(刚搞懂C语言中没乘方:BASIC是有的。)

 C语言是高效率、高速、简洁风格的语言,基本语法中不允许有冗余、低效的成份;

乘方的功能就用标准函数库实现 
#include <math.h>
double  y=pow(m,n); // m的n次方

 “异或”运算符(^)用法是如果两个相应的二进制位为同号,则该位的结果值为1否则为0。

"按位与”运算符(&)用法是如果两个相应的二进制位都为1,则该位的结果值为1否则为0。0&0=0,1&0=0,1&1=1
“按位或”运算符(|)用法是如果两个相应的二进制位有一个为1,则该位的结果值为1否则为0。
与其它语言不同,C语言和C++语言的异或不用xor,而是用“^”,键入方式为Shift+6。(而其它语言的“^”一般表示乘方)

若需要交换两个变量的值,除了通常使用的借用中间变量进行交换外,还可以利用异或,仅使用两个变量进行交换,如:

1
2
3
a=a^b;
b=b^a;
a=a^b;

详解:

1
2
3
a1=a^b
b=a1^b
a=a1^b=a1^(a1^b)=a1^a1^b=b

集合:

1
a=a^b^(b=a);

这样就完成了a与b的交换。

综上:同一变量与另一变量和其异或值异或等于自身。 
#define PI 3.1415927
#include<stdio.h>
int main()
{
    double a,v;
    while(scanf("%lf",&a)!=EOF)
    {
        v=(4.0/3)*PI*a*a*a;
        printf("%.3lf\n",v);
    }
    return 0;
}

关于C语言运算符:

算数运算符:

名称符号说明
加法运算符 + 双目运算符,即应有两个量参与加法运算。如a+b,4+8等。具有右结合性。
减法运算符 - 双目运算符。但“-”也可作负值运算符,此时为单目运算,如-x,-5等具有左结合性。
乘法运算符 * 双目运算符,具有左结合性。
除法运算符 / 双目运算符,具有左结合性。参与运算量均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型。
求余运算符(模运算符) % 双目运算符,具有左结合性。要求参与运算的量均为整型,不能应用于float或double类型。 求余运算的结果等于两数相除后的余数,整除时结果为0。

2003

1.与其用函数,不如直接来的爽快。

2.double

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

 2004

1.switch语句  学习 注意break

#include<stdio.h> 
int main()
{
    int a,b;
    while(scanf("%d",&a)!=EOF)
    {
        b=a/10;
        if(a<0||a>100)
            b=(-1);
        switch(b)
        {
        case 10:
        case 9: printf("A\n");break;
        case 8: printf("B\n");break;
        case 7: printf("C\n");break;
        case 6: printf("D\n");break;
        case 5:
        case 4:
        case 3:
        case 2:
        case 1:
        case 0: printf("E\n");break;
        case -1:printf("Score is error!\n");break;
        default:break;
        }
    }
return 0;
}

default:注意

2.但是 冗长剪枝。这是和下一题是一个道理。于是,看的【数组】就用上了。

#include <stdio.h>
char r[11]={'E','E','E','E','E','E','D','C','B','A','A'};
int main()
{
    int s;
    while (scanf("%d",&s)!=EOF)    
    {
        if(s>100||s<0)
            printf("Score is error!\n");
        else
            printf("%c\n",r[s/10]);
    }
    return 0;
}

2005

1.直接贴代码,如上

#include <stdio.h>
int Month[2][13]={
    {0,31,28,31,30,31,30,31,31,30,31,30,31},
    {0,31,29,31,30,31,30,31,31,30,31,30,31}
};
int main()
{
    int y,m,d,sum,f,i;
    while (scanf("%d/%d/%d",&y,&m,&d)!=EOF)    
    {
        sum=0;
        f=((y%400==0) || (y%100!=0) && (y%4==0));
        i=1;
        while (i<m)    
            sum+=Month[f][i++];
        printf("%d\n",sum+d);
    }
    return 0;
}

①、普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1901年不是闰年)

②、世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)
③、对于数值很大的年份,这年如果能整除3200,并且能整除172800则是闰年。如172800年是闰年,86400年不是闰年(因为虽然能整除3200,但不能整除172800)(此按一回归年365天5h48'45.5''计算)。
判定公历闰年遵循的一般规律为:四年一闰,百年不闰,四百年再闰.

运算符:

==  比较运算符,即等于

=     赋值运算符,i=2即 2放入i中

  另:复合运算符  ,a+=b 其实就是a=a+b

2006

1.while与for语句

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

2.for和while粗解

for(语句1;语句2;语句3)
{
循环体
}
的执行顺序是
S1.执行语句1
S2.执行语句2(一般为判断条件,比如a<b之类的),如果为0,则退出循环,否则执行循环体
S3.执行语句3,返回S2

while(语句)
{
循环体
}
的执行是
S1 语句是0则结束,否则进入循环体(同for的第二个,一般情况下是判断条件)
S2 执行循环体,返回S1
for和while那个更优化现在不用纠结这个以后会探讨。
逗号运算符 :在C语言中,多个表达式可以用逗号分开,其中用逗号分开的表达式的值分别结算,但整个表达式的值是最后一个表达式的值。

2007

1.有没有发现读题的重要性……m、n比较大小坑了很多人呐。

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

2.“你可以认为32为注意保存”所以只要用“int”就可以了。

关于 int float double -

float是单精度浮点型,double是双精度浮点型,这两个区别不是太大,字面上就能理解,只是精度不同而已,也就是小数点后的位数不同,
char是字符型,所有的数字啊,字母啊,符号啊都可以是字符型的,表示的形式是‘’单引号里面加上东西就是字符了,不过只能加一个啊;
long,short都属于int型,long是64位无符号数字,有符号的则是32位,
有符号short的范围-32768~+32767,无符号0~65535
-整型 short>=16 int>=short long>=32 long>=int longlong>=64 longlong>=long
-浮点 fioat>=32 double>=48 longdouble>=double(80/96/128)指数范围(-37.37)
2008
1.
这是我一开始的思路,想调用math.h来实现。

关于bool函数:标准C语言中并没有关于bool的定义,
不过bool的定义可以是
#define bool int
#define false 0
#define true 1
有这三个宏那么就可以了


#include <stdio.h>
#include <math.h>
int cnt[3];
int main()
{
    int n,t;
    double m;
    while (scanf("%d",&n),n)    
    {
        cnt[0]=cnt[1]=cnt[2]=0;//初赋值
        while(n--)
        {
            scanf("%lf",&m);
            if(m==0)
            {
                cnt[1]++;
            }
            else
            {
                t=m/fabs(m);//求绝对值函数
                cnt[t+1]++;
            }
        }
        printf("%d %d %d\n",cnt[0],cnt[1],cnt[2]);
    }
    return 0;
}

2.

上面的方法不是很理解

但是发现有一种简单的方法:

#include<stdio.h>
int main()
{
    int n,b,c,d,i;
    float a;
    while(scanf("%d",&n)&&(n!=0))
    {
      b=0;c=0;d=0;// 别忘了赋初值哦~
     for(i=0;i<n;i++)
        {
           scanf("%f",&a);
                if(a<0) b=b+1;
                else if(a==0) c=c+1;
                else if(a>0) d=d+1;
        }
        printf("%d %d %d\n",b,c,d);
    }
    return 0;
}

 2009

#include<stdio.h>
#include<math.h>
double buf[1005];
int main()
{
    int n, m;
    int i;
    double sum;
    while(scanf("%d %d", &n, &m) == 2)
    {
        sum = 0;
        buf[0] = n;
        for(i = 1; i < m; i++)
            buf[i] = sqrt(buf[i-1]);
        for(i = 0; i < m; i++)
            sum += buf[i];
        printf("%.2lf\n", sum);
    }
    return 0;
}

2010

#include<stdio.h>
int main()
{
    int m,n,a,b,c,i,j,s,d[1000];
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        j=0;
       for(i=m;i<=n;i++)
        {
            a=i/100;//取其百位数字
            b=i/10-10*a;//取其十位数字
            c=i%10;//取其个位数字
            s=a*a*a+b*b*b+c*c*c;
            if(s==i)
            {d[j]=i;//判断三位数字的立方和是否等于本身,若等于

j++
;} 则将其存放到一数组中。 } if(j==0) printf("no\n"); else if(j==1) printf("%d\n",d[0]); else if(j>=2) { for(i=0;i<j-1;i++) printf("%d ",d[i]); printf("%d\n",d[j-1]); } } return 0;}

 

原文地址:https://www.cnblogs.com/whitecube71/p/waterone.html