C语言算法题的一些技巧

1.floor函数为向下取整函数。floor(x)可以返回X的整数部分。如果想实现四舍五入的效果,可以用floor(x+0.5)。

2.π的表示方法。const double pi = 4.0 * atan(1.0)。atan为反正切函数。

3.想要获取程序的执行时间,可以用clock()函数,除以clocks_per_sec得到的值以秒为单位。注意需要引入time.h头文件。
但是这个时间会受到输入的影响。为避免影响,可以在windows命令行里里面敲echo x|abc。x是输入数据,abc是程序名。这种方法叫管道。

4.在windows下,输入完毕后先按enter键,再按ctrl+z,再按enter即可结束输入。

5.windows的记事本的换行符是/r/n。

6.全局变量,包括静态全局变量,和非静态全局变量,在没有初始化值时,其值自动为0.
即定义在所有函数外,不归属于任何一个函数的,在没有初始化值时,自动为0。
静态局部变量。
当定义在函数内的局部变量,有static 标记时,默认初始化为0值。
非静态局部变量,无默认初始值,C标准规定初始化值为随机值,但具体实现由编译器决定。

7.在C中,char型是一字节整型,int是四字节(早期的是二字节)整型,它们是可以通用的,甚至一些C的库函数如getc、getchar等在接收键盘输入的字符时返回的就是int型值而并非char型值。char型在%d控制下按int型输出时符号位将被扩展至总长度为四字节,而int型在%c控制下按char型输出时,将从低位截取一字节而放弃前三个字节。下面的代码可以佐证此情况:

#include "stdio.h"
int main(int argc,char *argv[]){
    int a=0xF978CA41;
    char c='a',d=-2;
    printf("a = %c\n",a);//这里只截取a的最低字节0x41,对应字符是A
    printf("c = %d\n",c);//这里将c的值'a'(即97)符号位扩展后输出97
    printf("d = %d\n",d);//这里将d的值-2符号位扩展后输出-2
    return 0;
}

8.while (~scanf("%d%d",&m,&n))什么用的?
  ACM中比较常见,其功能是循环从输入流读取m和n,直到遇到EOF为止,等同于while (scanf("%d%d",&m,&n)!=EOF)。

scanf()函数返回成功赋值的数据项数,出错时则返回,EOF定义为-1。~是按位取反,-1十六进制补码表示为0x ffffffff,f是二进制的1111,取反后就全部变成0了,于是while结束。只有返回值为EOF(即-1)时,其取反的的值(即while循环的判断条件)才为0,才能结束循环,其它输入情况下(无论是否输入成功)while循环的判断条件为非0,即为真。

这种写法的漏洞在于:一但输入的值为字母、符号之类的,scanf赋值不成功把读到的内容又返回到stdin的缓冲区(假设这个值为t),其取反得到的值使while又进入到下一次循环,scanf又从stdin缓冲区里读到了原先吐回的t,如此成了死循环……

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值