byd xdoj

话不多说了,开骂

其一:NTM要我怎么输入

这是最普遍,最操蛋的问题
对于以下题目
r13加密
100分代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdio.h>
#include<stdlib.h>
int main()
{
char string[100] = {'\0'};
//输入部分始
fgets(string, sizeof(string), stdin);
//输入部分终
for(int i = 0; string[i]; i++)
{
if((string[i] >= 'a' && string[i] <= 'm') || (string[i] >= 'A' && string[i] <= 'M'))
string[i] += 13;
else if ((string[i] >= 'n' && string[i] <= 'z') || (string[i] >= 'N' && string[i] <= 'Z'))
string[i] -= 13;
}
printf("%s\n", string);
return 0;
}

40分代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
#include<stdlib.h>
int main()
{
char string[100] = {'\0'};
//输入部分始
for(int i = 0; ; i++)
{
string[i] = getchar();
if(string[i] == '\n')
{
string[i] = '\0';
break;
}
}
//输入部分终
/*
* 下面一样的,省略了
*/
}

以输入样例来看,两则代码对字符串的处理如下:

1
2
第一则处理后:Abc# 2xyz'\n'
第二则处理后:Abc# 2xyz'\0'

这两则在字符串的处理上有什么不同?在vscode + mingw-gcc编译器上编译出来的完全没问题,为何在oj上的Visual C++就不同了呢?
于是我统一用fgets函数读取字符串,但又遇到问题:
找字符串字串
100分代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <stdio.h>
#include<string.h>
int getLength(char string[])
{
int result = 0;
for (int i = 0; string[i] != '\0'; i++)
result++;
return result - 1;
}
int main()
{
int status, g = 0;
char domString[30] = {'\0'};
char subString[30] = {'\0'};
gets(domString);
gets(subString);
int lengthDom = strlen(domString);
int lengthSub = strlen(subString);

for (int i = 0; i < lengthDom; i++)
{
status = 1;
for (int j = 0; j < lengthSub; j++)
{
if (domString[i + j] == subString[j])
status *= 1;
else
status *= 0;
}
if (status)
{
printf("%d ", i + 1);
g++;
}
}
if (!g)
printf("No!");
return 0;
}

75分代码如下

1
2
3
4
5
6
7
8
9
10
11
//前面忘了
char domString[30] = {'\0'};
char subString[30] = {'\0'};
fgets(domString, 30, stdin);
fgets(subString, 30, stdin);
int lengthDom = strlen(domString) - 1;
int lengthSub = strlen(subString) - 1;

domString[lengthDom] = '\0';
subString[lengthSub] = '\0';
//后面忘了

这一段更加离谱,同等配置下两串字符串完全相等,但oj就是拦着一个不给过,我至今搞不明白发生了什么。

后续

后来我明白了,原来是oj上有一些字符串没有回车符,这样就导致了在平时测试时完全看不出问题,但在oj上会报错了情况……
得,你nb!

其二:我犯了什么错?

对于如下题目
勒让德多项式
20分代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
double p(double x, int n)
{
if (!n)
return 1;
else if (n == 1)
return x;
else
return ((2 * n - 1) * p(x, n - 1) * x - (n - 1) * p(x, n - 2)) / (n * 1.0);
}
int main()
{
int n;
double x;
double rsl = 0.0;
scanf("%d %lf", &n, &x);
for(int i = 1; i <= n; i++)
rsl += p(x, i);
printf("%.4lf", rsl);
return 0;
}

100分代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>

double p(double x, int n)
{
if (!n)
return 1;
else if (n == 1)
return x;
else
return ((2 * n - 1) * p(x, n - 1) * x - (n - 1) * p(x, n - 2)) / (n * 1.0);
}
int main()
{
int n;
double x;
double rsl = 0.0;

scanf("%d %lf", &n, &x);

for(int i = 1; i <= n; i++)
rsl += p(x, i);
printf("%.4lf", rsl);

return 0;
}

各位看看有什么区别吧,编译器也没有换,一直都是Visual C++

其三:库文件混乱

题目如下
判断梅森尼数
附源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <cmath>
int isPrime(int n)
{
if (n == 2 || n == 3)
return true;
for (int i = 2; i * i <= n; i++)
if (!(n % i))
return false;
return true;
}

int main()
{
int n, m;
scanf("%d", &n);
m = (int)pow(2, n) - 1;
printf("%d %d\n", m, isPrime(m));
return 0;
}

啥?为什么用C++的库?因为用C语言的库时,编译器不认pow函数,认为

1
2
3
4
5
6
7
8
9
10
11
12
13
用于 x86 的 Microsoft (R) C/C++ 优化编译器 18.00.21005.1 版版权所有(C) Microsoft Corporation。  保留所有权利。

cl: 命令行 warning D9035 :“o”选项已否决,并将在将来的版本中移除
xdoj682.c
xdoj682.c(18) : error C2668: “pow”: 对重载函数的调用不明确
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\math.h(1233): 可能是“long double pow(long double,int) throw()”
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\math.h(1231): 或 “long double pow(long double,long double) throw()”
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\math.h(1117): 或 “float pow(float,int) throw()”
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\math.h(1115): 或 “float pow(float,float) throw()”
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\math.h(1027): 或 “double pow(double,int) throw()”
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\math.h(512): 或 “double pow(double,double)
尝试匹配参数列表“(int, int)”时

好吧,你赢了

其四:亿点小疑惑

数值信息报表
0分代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n, array[60] = {0}, sum/*差别在这里哟*/, tempmax, tempmin;
int max = -1, min = 1e6;
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &array[i]);
for(int i = 0; i < n; i++)
{
sum += array[i];
if(max < array[i])
{
tempmax = i + 1;
max = array[i];
}
if(min > array[i])
{
tempmin = i + 1;
min = array[i];
}
}
printf("%d %d %d %d %d", sum, max, tempmax, min, tempmin);
return 0;
}

100分代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<stdio.h>
#include<stdlib.h>

int main()
{
int n, array[60] = {0}, sum = 0/*差别在这里哟*/, tempmax, tempmin;
int max = -1, min = 2e6;
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &array[i]);
for(int i = 0; i < n; i++)
{
sum += array[i];
if(max < array[i])
{
tempmax = i + 1;
max = array[i];
}
if(min > array[i])
{
tempmin = i + 1;
min = array[i];
}
}
printf("%d %d %d %d %d", sum, max, tempmax, min, tempmin);
return 0;
}

我在自己的电脑上运行是没有问题的,但在oj上就是0分,合理的解释就是开了O2优化,学校的oj有什么地方能像洛谷一样关了O2优化呢?


byd xdoj
http://example.com/2023/12/27/fuck-XDOJ/
作者
Ivan Chen
发布于
2023年12月27日
许可协议
IVAN