TSOJ食用说明书

版权声明:版权归饺子个人所有,未经允许,不得私自传播 https://blog.csdn.net/qq_43848497/article/details/85012870

作为南信大的学子,我们肩负着 “ 守正创新,开创未来 ” 的使命,因此,我们首先要脚踏实地,做好本分,肝好OJ。

为了让大家能够更好地食用OJ,饺子在这里给大家列出一些注意事项,这些事项往往是许多人栽跟头的地方。

1.TSOJ应ACM的要求,采用多组输入,多组输入通常有两大种形式,具体的代码实现如下。

    
    while(scanf("%d",&n)!=EOF)
    {

    }
        
    while(gets(str)!=NULL)  // 其中 NULL 可换成 0 ,也可换成 '\0' ,三者是通用的
    {

    }

2.注意到使用scanf()函数读入字符串时,空格键和回车键都是作为读入字符串的结束标志的,如果要读入带有空格的字符串,最好还是使用gets()函数,以回车键作为读入字符串的结束标志。同时,在使用gets()前如果使用scanf()读入数据,那么读入数据时的空格结束标志会被gets()读入,作为读入的字符串,因此我们可以用getchar()来吞掉这个结束标志。

3.对于字符串,strlen()和sizeof()是有区别的,strlen()求出的是字符数组中第一个'\0'前的元素的个数,而sizeof()求出的则是字符数组所占的内存空间。


char str[20]="0123456789";
int a=strlen(str);         // a=10; >>>> strlen 计算字符串的长度,以结束符 '\0' 为字符串结束。
int b=sizeof(str);         // 而 b=20; >>>> sizeof 计算的则是分配的数组 str[20] 所占的内存空间

4.要熟记各种变量类型的取值范围,如果题目要求的范围过大,就需要考虑用字符串来处理。以( TOSJ 1073 )为例,数据范围:-10^50 <= N <= 10^50,饺子反正是没思考出不用字符串的办法 。

5.使用scanf()函数以及printf()函数时,格式控制和变量类型要匹配。比如%d对应整型,%lf对应double型,%c对应字符型。如果不相匹配,可能会出现意想不到的结果。同时,我们要注意计算以及赋值过程中的类型转换问题,必要时可以采用强制类型转换来处理数据。再者,不要在scanf()中写入一些莫名其妙的东西,比如逗号作分隔,或者在结尾加上'\n',这些错误要尽量避免。

6.为了保证精度不损失,我们对于浮点数的处理一律采用双精度类型(double),此数据类型与单精度数据类型(float)相似,但精确度比float高,当然,编译时所占的内存空间依不同的编译器而有所不同。值得注意的是,双精度的有效数字是15-16位,远远超过单精度的6-7位,因此我们采用double型来处理数据。

7.由于OJ系统对格式方面的要求较为苛刻,稍微有一点不一样就会PE错误。常见的格式要求有:(1)每个整型数据占6位。我们采用%6d来进行控制,注意到我们不能再scanf()函数的""中写入多余的空格,如果写入多余空格,比如"%6d  ",每个数据有多余的空格输出,显然不满足要求。(2)最终结果以换行为结尾。这时候我们只需要在最后printf()一个换行符即可。(3)每输出6个数据换行。我们就可以定义一个整型变量temp,来存储输出元素的个数,用temp%6==0来控制换行。(4)每两个数据之间用一个空格作为分隔,且最后一个元素后面没有空格。通常我们可以先用"%d "输出前面n-1个数,将第n个数单独输出,当然也有许多更骚的操作等待你去发掘。

8.开数组时,要先用 “ #define 标识符 常量 ” 的方法先定义一个符号常量,然后用此符号常量作为数组大小开数组。

9.很多人在多组输入时第一组测试数据能得出正确的结果。但从第二组测试数据开始,结果往往又是错误的,这时我们就要考虑到是否已经将各个变量恢复到之前的状态,这个过程和初始化有些类似。

饺子暂时就先讲这么多,日后还会进行补充。

猜你喜欢

转载自blog.csdn.net/qq_43848497/article/details/85012870