入门ACM的个人总结(持续更新中)

常见错误

(题刷得少,下面的错误原因可能不够全面)
1.Runtime Error
数组开得太小

2.Time Limit Exceeded
程序执行时间超过题目规定时间,算法有待优化

3.Memory Limit Exceeded
程序使用的内存超过了题目所规定的内存

4.Presentation Error
输出的内容正确,可能是换行和空格不符合输出要求

5.Output Limit Exceeded
输出内容过多

注意事项:

输出的内容中末尾应该包含两个换行符。

在这里插入图片描述
题目中没有规定A,B,C是整形还是浮点型,但我们声明成浮点型。

在这里插入图片描述
这种类型要特别注意输出格式!!

有多组输入数据时:用while( scanf ( “%d” , &n ) != EOF ) 或者是 while( ~ scanf ( “%d” , &n )或者是while ( gets( f ) != NULL )

当题目要求输入含有空格或者回车的字符串时,用gets()而不用scanf(),若要用scanf(),要加上循环。scanf()不能接收空格或者回车。gets函数详解,,scanf函数详解
当题目要求输入字符时,记得用getchar()接收回车键。

若getchar()接受错误的变量类型的变量时会返回-1,因此,建议int c ; c = getchar() 。而不是 char c ; c = getchar() 。

switch语句的使用在多选择的情况下要比if…else语句效率高。

判断字符是否是汉字:汉字机内码使用两个字节来保存汉字,并且汉字的每个字节的值<0,因为ASⅡ码都是非负的,因此我们可以判断值是否大于零来作为字符是否为汉字的依据(注意:若是求汉字的个数,记得计数器要除以2
题目:HDU2030

判断两个浮点数是否相等不能用 == 或者 != 来直接进行比较!
题目:HDU2054

if ( scanf( “%d(%d)”, &a , &b ) == 2 ) 可以很好处理输入数字和括号的问题
题目:HDU2093

负的十进制转换成十六进制:先把十进制转换成正的,把正数转换成十六进制,前面再添负号。(为啥不直接进行转换?这个涉及到补码,本人没有深究。)
题目:HDU2057

汉诺塔问题中,求第k块圆盘移动的次数,公式:2^(n-k)(n是圆盘总数)
题目:HDU1995

printf默认的是左对齐(注意:printf("%-10d" , 99 ) 是左对齐),若要右对齐:在转义字符之间加上字符宽度,如:printf("%10d" , 99 ) 。

求分数的最小公倍数:最小公倍数的分子---->两个分数分子的最小公倍数
最小公倍数的分母---->两个分数分母的最大公约数数
题目:HDU1713(注意:原题意是表示转26501圈要6335天,题意有误,实际是表示转6335圈要26501天)

无限循环小数转换成分数:用扩倍的方法,把无限循环小数扩大十倍、一百倍或一千倍……使扩大后的无限循环小数与原无限循环小数的“尾巴”完全相同,然后这两个数相减,去掉“尾巴”
例如:把0.325656(56是循环部分)化成分数
0.325656(65) * 100 = 32.5656(56) …①
0.325656(65) * 10000 = 3256.56(56) …②
② - ① —> 0.325656(65) * 9900 = 3233
分数形式:3233 / 9900
题目:HDU1717

在有求两个数(a,b)的积除以一个数(c)的情况下,最好先a/c * b,因为如果直接a*b的话,两个数的积可能会超过了a,b类型的范围
题目:HDU2028

常用的函数:

1.qsort()函数:头文件<stdlib.h>

int cmp (const void * a , const void * b )
{	return * ( int * ) a - * ( int * ) b ;	}
qsort( arr , n , sizeof( arr [ 0 ] ) , cmp ) ;
其形参分别代表的是:数组名,排序个数,数组元素大小,cmp函数

2.数学函数<math.h>

double sqrt( double x ) //开根号
int abs (int x) //求绝对值
double fabs ( double x ) //求绝对值

3.很多东西数组不初始化是都做不了的

用memset()函数<string.h>
memset()函数原型是 extern void *memset(void *buffer, int c, int count) ;
用法 : memset(buffer, 0, sizeof(buffer))
buffer:为指针或是数组,	
c:是赋给buffer的值,
count:是buffer的长度.

详解请阅:memset()函数及其作用

4.判断素数

for( i = 2 ; i <= sqrt( n ) ; i++ )
{	if( a % i == 0 ) printf( "a不是素数" ) ;	}

5.求最大公约数

int gcd( int a , int b )
{	return b == 0 ? a : gcd( b , a % b ) ; }

6.求最小公倍数
两数相乘再除以两者的最大公约数。

7.判断一个数是否是整数

if( a != (int) a ) printf("a是不是整数");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值