题目还是比较简单的,但是由于自己的粗心大意导致调试了1个半小时,问题总结如下:
1. 写代码时候复制,粘贴部分一定要细心修改变量名;
2. 将代码从纸上转移到机器上的时候也要思考,考虑是否可以优化每一行代码,--、++一定不能写错;
3. 仔细考虑每种可能的情况,尤其是内存
#include<iostream>
using namespace std;
void multiply(int* a1, int* a2, int* result, int m, int n)
{
for(int i = m - 1; i >= 0; i--)
{
if(1 == a1[i])
for(int j = n - 1; j >= 0; j--)
{
if(1 == a2[j])
(++result[i + j]) %= 2; //对乘法结果进行统计
}
}
}
void module(int* result, int* a3, int l, int s)
{
//千万注意num数据大小的定义
int num[2002]; //当l很大而s很小的时候,num定义为1000大小就可能越界超成Runtime Error,因此需要定义num足够大
memset(num, 0, sizeof(num));
for(int i = l - 2; i >= 0; i--)
{
if(1 == result[i])
{
int temp = i - s + 1;
if(temp >= 0)
{
for(int m = temp; m <= s + temp - 1; m++)
num[m] = a3[m - temp]; //num的值表示将除数乘以x的temp次方
for(int n = i; n >= 0; n--)
result[n] = result[n] ^ num[n];//相当于result-num的值
}
else
break;
}
}
}
int main()
{
int a1[1001], a2[1001], a3[1001];
int result[2002];
int t;
cin >> t;
while(t--)
{
memset(a1, 0, sizeof(a1));
memset(a2, 0, sizeof(a2));
memset(a3, 0, sizeof(a3));
memset(result, 0, sizeof(result));
int m, n, s;
cin >> m;
for(int i = m - 1; i >= 0; i--)
cin >> a1[i];
cin >> n;
for(int i = n - 1; i >= 0; i--)
cin >> a2[i];
cin >> s;
for(int i = s - 1; i >= 0; i--)
cin >> a3[i];
multiply(a1, a2, result, m, n);
module(result, a3, m+n, s);
int i;
for(i = m + n - 2; i >= 0; i--)
if(1 == result[i])
break;
if(-1 == i)
cout << "0 0" << endl;
else
{
cout << i + 1 << " ";
for(int j = i; j >= 0; j--)
cout << result[j] << " ";
cout << endl;
}
}
system("pause");
return 0;
}
空间这种,很容易出错。