ACM经验

来源:互联网 发布:linux less 向上翻页 编辑:程序博客网 时间:2024/05/20 13:19



6.特别需要注意的地方: 

(1).在G++/GCC下'main'函数必须定义成int型,定义成void main会得到'Compilation Error'。 

(2).In function `int main()': 

error: name lookup of `i' changed for new ISO `for' scoping 

error: using obsolete binding at `i' 

这个是你在当前for里定义了i,那么其作用域只限于当前for循环里面,在下一个for里直接调用了i将出现此错误。 

7.效率问题:一般情况下,C语言运行时I/O函数比C++的效率高一些,所以处理大数据量的时候,建议使用scanf/printf组合 

8.提交题目常见结果: 

(1).Accepted (AC) : 您的程序是正确的,恭喜! 

(2).Presentation Error (PE) : 虽然您的程序貌似输出了正确的结果,但是这个结果的格式有点问题。请检查程序的输出是否多了或者少了空格(' ')、制表符('\t')或者换行符('\n')。 

(3).Wrong Answer (WA) : 输出结果错,这个一般认为是算法有问题。 

(4).Runtime Error (RE) : 运行时错误,这个一般是程序在运行期间执行了非法的操作造成的。以下列出常见的错误类型: 

ACCESS_VIOLATION 您的程序想从一些非法的地址空间读取或向其中写入内容。一般例如指针、数组下标越界都会造成这个错误的。 

ARRAY_BOUNDS_EXCEEDED 您的程序试图访问一个超出硬件支持范围的数组单元。 

INTEGER_DIVIDE_BY_ZERO 在进行整数除法的时候出现了除数为零的异常。 

STACK_OVERFLOW 栈溢出。一般是由于无限递归或者在函数里使用了太大的数组变量的原因。 

(5).Time Limit Exceeded (TLE) : 您的程序运行的时间已经超出了这个题目的时间限制,请改进算法 

(6).Memory Limit Exceeded (MLE) : 您的程序运行的内存已经超出了这个题目的内存限制。 

(7).Output Limit Exceeded (OLE) : 您的程序输出内容太多,超过了这个题目的输出限制。 

(8).Compile Error (CE): 您的程序语法有问题,编译器无法编译。具体的出错信息可以点击链接察看。 

(9). System Error (SE) : OJ内部出现错误。由于我们的OJ可能存在一些小问题,所以出现这个信息请原谅,同时请及时与管理员联系。请注意你的程序结尾不要加system("pause"),因为system函数是一个很危险的函数,我们不允许用户在OJ上运行包含此函数的程序有时候,你的程序出现严重的内存越界也会出现这个问题。

9.特殊说明:个别题目未明确说明数据量的大小,请尽可能大的定义数组,若定义的数组特别大,请定义为全局数组,动态生成的时间效率低于静态生成,因为静态生成的数组在编译的时候已经分配空间,而动态数组是在程序运行的时候动态分配的,需要占用一定的时间。 

10.用于将一整个数组置值。大数组时比用for语句快得多

例如 int a[Max]; memset(a,1,sizeof(a)); // 可以实现把这个数组置1的效果。(头文件string.h)

11. 一般来说,如果题目没有特别说明输入结束的标志的话,默认是以EOF(End of File)作为输入结束标志的。这种情况下可以这样写

C:     whlie (scanf(%d,&a)!=EOF)   { …… }

考虑数据的奇偶性

关于__int64的用法收藏 __int64是MS自创的, 要用64位int的话C中本来就自带: #include <stdio.h> #include <limits.h> int main() {     long long a = LLONG_MAX;     unsigned long long b = ULLONG_MAX;     printf("%lld\n%llu", a, b); } 参考资料:ANSI C99 资料二: // MS Windows下的VC、BCB、MingW GCC等用: __int64 n; scanf("%I64u",&n); printf("%I64u\n", n); 其中MingW GCC还支持用long long声明,但输入输出的格式串仍用I64开头。 __int64关键字和I64标号确实是MS专有的。标准C用long long和%lld。所以在Unix、Linux、Cygwin下编程就应该用标准的用法了。

备注:__64前面两个下划线

换行读字符可用getchar()将空格跳过

最后输出一定要有回车。

Float b;int a; a=(b+0.5); 这样写的话,就是四舍五入。

acm题一般代码不超过200行,不需要很复杂的算法,这也是很大的局限性
看书从算法导论开始,然后就是做题,没有捷径,做100道题,你就脱胎换骨了,注意看看别人的代码多少字节,自己的代码多少字节

考虑数组的下标越界,超过或者小于0。

输出一定要准确:注意大小写。

很多题目都要求在输出数据的恰当位置加空行。一个空行就是一个单独的"\n"。这里,有的题目说:“After each test case, you should output one blank line”,而有的题目说:“Between each test case, you should ouput one blank line”。要注意After和Between的区别,因为如果多了一或少了空行,将导致Presentation Error甚至Wrong Answer。

sprintf(s,"%d%d",a,b)输出到字符串

字符数组保证是以"\0"结尾

函数的返回值最好是int或double

函数遇return直接退出

定义新类型

typedef struct{double x,y;}Point;

Point a,b

测int范围:printf("%u",-1);

c语言常用:

freopen("date.in","r",stdin);  //重定向所有标准的输入为文件输入   

freopen("date.out","w",stdout);//重定向所有标准的输出为文件输出   

fclose(stdout);//输出结束  

freopen("date.in","r",stdin);  //重定向所有标准的输入为文件输入

freopen("date.out","w",stdout);//重定向所有标准的输出为文件输出

fclose(stdout);//输出结束

gets(s);以回车作为字符的分解符,不管s的可用空间有多大!

scanf一个特别好用的地方,就是可以滤去一些不想要的东西。
举例说明如下:
比如输入为日期 yyyy-mm-dd,就可以这样写:
int year,moth,day;
scanf(“%d-%d-%d”,&year,&moth,&day);

sscanf():
sscanf()经常用来分解字符串,功能非常强大,但很多功能都需要正则表达式的知识,所以就介绍一下最简单的几种用法,大家如果想了解更多的话,自己去网上找吧。
1、
char str[100],str1[100],str2[100];
gets(str);
sscanf(str,”%s%s”,str1,str2);
将读入的一整行字符串按空格,制表符或回车符分割成两个字符串。
2、
取指定长度的字符串。如在下例中,取最大长度为4字节的字符串。
  sscanf("123456 ", "%4s", str);

getch()、getche()和getchar()函数   
(1)   getch()和getche()函数   这两个函数都是从键盘上读入一个字符。其调用格式为:   getch();   getche(); 
  两者的区别是:   getch()函数不将读入的字符回显在显示屏幕上,   而getche()   函数却将读入的字符回显到显示屏幕上。   
  例7: 
#include   <stdio.h> 
#include   <conio.h> 
void     main()   

char   c,   ch; 
c=getch();   /*从键盘上读入一个字符不回显送给字符变量c*/ 
putchar(c);   /*输出该字符*/   
ch=getche();   /*从键盘上带回显的读入一个字符送给字符变量ch*/ 
putchar(ch);   

利用回显和不回显的特点,   这两个函数经常用于交互输入的过程中完成暂停等功能。   
例8:   
#include   <stdio.h> 
#include   <conio.h> 
void   main() 

char   c,   s[20]; 
printf( "Name: "); 
gets(s);   
printf( "Press   any   key   to   confinue... ");   
getch();   /*等待输入任一键*/   

(2)getchar()函数 
getchar()函数也是从键盘上读入一个字符,   并带回显。 
它与前面两个函数   的区别在于:   
getchar()函数等待输入直到按回车才结束,   回车前的所有输入字   符都会逐个显示在屏幕上。 
但只有第一个字符作为函数的返回值。   
getchar()函数的调用格式为:   getchar();   
例9: 
#include   <stdio.h> 
#include   <conio.h> 
void   main() 

char   c;   
c=getchar();   /*从键盘读入字符直到回车结束*/   
putchar(c);   /*显示输入的第一个字符*/   
getch();   /*等待按任一健*/   
}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++

+++++++++++++++++++++++++++++++++++++++++++++++++++++++

原创粉丝点击