今天开始了在杭电oj上的刷题,因为不太了解这个平台,所以我选择从入门题集开始做。而一天下来也证明了我的选择是对的。
入门题集 相对简单,没有考察什么数学、逻辑思维能力,大部分就是对输入输出做了一些严格要求,因此我也将基础知识掌握得更加牢固了。
下面是我今天刷题的一些总结:
1.如果题目没有控制输入数据的数量,那么就是以没有输入数据了而结尾。那么在不断的输入之中(循环),总有一个结束条件。
对于C语言:
while(scanf("%d %d", &a ,&b) != EOF){
.....
.....
}
对于C++:
while(cin >> a >> b){
......
......
}
循环既是在将a,b的值输入,又在判断输入是否到结尾了。
2.标准函数库中有一个<math.h>,在求一些关于数学的运算上是非常方便的。其中有求绝对值的函数,但是要注意区分:
1)对于int型求绝对值使用abs()函数;
2)对于double、float这样的浮点型求绝对值要使用fabs()函数;
补充:<math.h>里的函数总结
Standard C Math
求绝对值 | |
求反余弦 | |
求反正弦 | |
求反正切 | |
求反正切,按符号判定象限 | |
求不小于某值的最小整数 (求上界) | |
求余弦 | |
求双曲余弦 | |
求商和余数 | |
求e的幂 | |
求浮点数的绝对值 | |
求不大于某值的最大整数 (求下界) | |
求模数 | |
求数的科学表示法形式 | |
求长整型数的绝对值 | |
以科学计数法计算 | |
以长整型返回商和余数 | |
自然对数 | |
以10为底的自然对数 | |
将一个数分解成整数和小数部分 | |
求幂 | |
求正弦 | |
求双曲正弦 | |
求平方根 | |
求正切 | |
求双曲正切 |
3.输入输出进制数的时候要记清楚各进制的符号(以下是容易忘记的)
%ld长整型
%o八进制 %x十六进制
%u十进制unsigned型(无符号数)
%e以指数形式输出实数
%g根据大小自动选f格式或e格式,且不输出无意义的零
4.关于int和double
1)感觉做题的时候只要是有小数点的运算都是先使用的double类型进行运算,之后在输出的时候,若题目要求了精度,再以要求的精度输出。
eg. 要求输出时保留两位小数点,输出时可以:
//a是double类型
printf("%.2lf", a);
2)若想得到小数结果,一定要在运算过程中进行强制转换;
如果不进行强制转换,就会变成这样:
输出4,3 结果为1.00
说明是先得到相除的整数结果,之后才变成double型
解决办法:
我目前总结有两种方法:
1.表明double的强制转换
在a/b这个运算过程之前加一个(double),表示double型的运算;
当然这里也可以不要double c = ...这一行
可以直接输出的时候输出: (double) a / b;
2.将a或b变成浮点型(乘一个1.0)
a乘上1.0之后变成了一个浮点型,之后的运算也都是浮点型之间的运算了。
写在函数里直接运算时可以写 4/3.0之类的来变成浮点数
但是不要在该输入整数的时候输入4.0、3.0,这样是没有用的,甚至可能得到奇怪的结果
5.缓冲区的注意事项
1)在cin一个整数之后,若要再使用getline(),必须先用getchar()清除缓冲区的空白字符;
2)scanf也是,如果前一步是scanf("%d",&a); ,后面有一个输入的步骤是scanf("%c",&b)或者是gets()(整行读入字符串的函数),它们之间都得有getchar()这样的函数来清除缓冲区不想要的字符;
如果不清除缓冲区的空白字符,会使得输入的字符不是我们原本想要的,在细节方面要十分注意!
eg.1
scanf("%d",&c);
...
getchar();
scanf("%c", &a);
eg.2
scanf("%d", &c);
...
getchar();
while(...){
gets(s);
...
}
其他:
strlen()函数算长度时,如果字符串里面有空格,也是被算进去的,只有最后的到'\0'才截止且'\0'是不会被算进去的;(strlen是string.h头文件里面的函数)
当给定了数的大小范围,字符串的长度,是可以用一个定长的数组来“装”每组数据的,这样很方便。
#include<stdio.h>
#include<string.h>
int main(){
int n;
char s[1001];
scanf("%d", &n);
getchar();
while(n--){
gets(s);
int p = 0, q;
int len = strlen(s);
for(int i = 0; i < len; i++){
if(s[i] == ' '){
q = i - 1;
for(int j = q; j>= p; j--)
putchar(s[j]);
putchar(' ');
p = i + 1;
}
}
for(int k = len - 1; k >= p; k--)
putchar(s[k]);
printf("\n");
}
return 0;
}