常见错误
(题刷得少,下面的错误原因可能不够全面)
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是不是整数");