2021.7.12刷题总结

今天开始了在杭电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

abs()

求绝对值

acos()

求反余弦

asin()

求反正弦

atan()

求反正切

atan2()

求反正切,按符号判定象限

ceil()

求不小于某值的最小整数 (求上界)

cos()

求余弦

cosh()

求双曲余弦

div()

求商和余数

exp()

求e的幂

fabs()

求浮点数的绝对值

floor()

求不大于某值的最大整数 (求下界)

fmod()

求模数

frexp()

求数的科学表示法形式

labs()

求长整型数的绝对值

ldexp()

以科学计数法计算

ldiv()

以长整型返回商和余数

log()

自然对数

log10()

以10为底的自然对数

modf()

将一个数分解成整数和小数部分

pow()

求幂

sin()

求正弦

sinh()

求双曲正弦

sqrt()

求平方根

tan()

求正切

tanh()

求双曲正切

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;
}
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值