Autumn_w @ 2024-07-13 23:08:23
#include <bits/stdc++.h>
#define up(r,l,i) for(int i=r;i<=l;i++)
#define dn(r,l,i) for(int i=r;i>=l;i--)
using namespace std;
int n;
int c[1000], a[1000], b[1000],len;
void supperAdd(int x[], int y[]) {
memset(c, 0, 1005);
up(1, sizeof(b) / sizeof(b[0]), i) {
c[i] += a[i] + b[i];
c[i + 1] = c[i] / 10;
c[i] = c[i] % 10;
}
}
int main()
{
cin >> n;
a[1] = 1;
b[1] = 2;
len = 1;
up(3, n, i) {
supperAdd(a, b);
memcpy(a, b, sizeof(b) / sizeof(b[0]));
memcpy(b, c, sizeof(c) / sizeof(c[0]));
}
len = 999;
while (c[len] == 0 && len > 1) len--;
dn(len, 1, i) {
cout << c[i];
}
return 0;
}
by anda @ 2024-07-13 23:19:18
不是,你为啥弄这么麻烦……弄的人看不懂你在怎么做
by Terrible @ 2024-07-13 23:21:07
这份代码在我这里跑样例都不过。输出了 3,呃呃。
by Terrible @ 2024-07-13 23:35:18
@Autumn_w
建议给编译器配置打开 O2,具体方法可以百度搜索。测试或者提交的时候最好都保证是开 O2 的,现在正规比赛一般都开 O2。
开不开 O2 的结果是可能有差异的,差异来源于不规范的行为。
①memcpy
memset
用得不对。memset、memcpy
②sizeof(b) / sizeof(b[0])
的结果是 c[1000]
数组越界了。洛谷环境中 数组在内存之间大概的相对顺序。开 O2 的时候越界到 n
的位置了。
by Autumn_w @ 2024-07-14 16:09:52
@Terrible 感谢dalao,问题已经解决,的确是memcpy memset用法不对,访问到边界的问题,开O2后会中途停止,只输出3,导致结果出错。关注奉上%%%%%