Zeke @ 2021-11-19 11:47:09
//luogu P1303 A*B
#include <iostream>
using namespace std;
short a[3000]={0},b[3000]={0};
short c[5000000];
void swap(short &a,short &b)
{
short c=a;
a = b;
b = c;
}
int main()
{
char t;
while(t = getchar())
{
if(t == '\n') break;
a[++a[0]] = t-'0';
}
while(t = getchar())
{
if(t == '\n') break;
b[++b[0]] = t-'0';
}
for(int i = 1;i <= (1+a[0])/2;i ++) swap(a[i],a[a[0]-i+1]);
for(int i = 1;i <= (1+b[0])/2;i ++) swap(b[i],b[b[0]-i+1]);
for(int i = 1;i <= a[0];i ++)
for(int j = 1;j <= b[0];j ++)
{
c[i+j-1] += a[i]*b[j];
if(i+j-1 > c[0]) c[0]=i+j-1;
}
for(int i = 1;i <= c[0];i ++)
{
if(c[i]/10)
{
c[i+1] += c[i]/10;
c[i] %= 10;
if(i == c[0]) c[0] ++;
}
}
for(int i = c[0];i;i --) if(c[i] == 0) {c[0]--;break;}
for(int i = c[0];i;i --) cout << c[i];cout << endl;
return 0;
}
连第一个点都没过
测试数据下载了,输入输出都一样?
by Terrible @ 2021-11-19 13:06:02
@Zeke
1.应该是输入的问题,建议重写一下,可能数据中有回车符'\r'
。除此之外,出于严谨考虑,我们不能认为文件末尾一定有换行,这个要慎重(虽然题目数据确实末尾有换行,其实输入是3行)。
2.万一short
不够用了怎么办?用int
吧
by Terrible @ 2021-11-19 13:07:13
3.还得考虑结果是 0 的情况,至少要有一位输出
for(int i = c[0];i>1;i --) if(c[i] == 0) {c[0]--;break;}
by Terrible @ 2021-11-19 13:15:42
考虑一种极端情况,数据是两个
那么 c[1999]
运算过程中需要加起来 c[1999]
会超过
by Zeke @ 2021-11-19 14:04:10
@Terrible 多谢0.0
by Terrible @ 2021-11-19 16:49:13
您可以试试这么读入 @Zeke
char c1[3001],c2[3001];
scanf("%s %s",c1,c2);
for(int i=0;c1[i];i++)a[++a[0]]=c1[i]-'0';
for(int i=0;c2[i];i++)b[++b[0]]=c2[i]-'0';
by Terrible @ 2021-11-19 16:51:23
#include <iostream>
using namespace std;
short a[3000]={0},b[3000]={0};
int c[5000];
void swap(short &a,short &b)
{
short c=a;
a = b;
b = c;
}
int main()
{
char t;
char c1[3001],c2[3001];
scanf("%s %s",c1,c2);
for(int i=0;c1[i];i++)a[++a[0]]=c1[i]-'0';
for(int i=0;c2[i];i++)b[++b[0]]=c2[i]-'0';
for(int i = 1;i <= (1+a[0])/2;i ++) swap(a[i],a[a[0]-i+1]);
for(int i = 1;i <= (1+b[0])/2;i ++) swap(b[i],b[b[0]-i+1]);
for(int i = 1;i <= a[0];i ++)
for(int j = 1;j <= b[0];j ++)
{
c[i+j-1] += a[i]*b[j];
if(i+j-1 > c[0]) c[0]=i+j-1;
}
for(int i = 1;i <= c[0];i ++)
{
if(c[i]/10)
{
c[i+1] += c[i]/10;
c[i] %= 10;
if(i == c[0]) c[0] ++;
}
}
while(c[c[0]]==0&&c[0]>1)c[0]--;
for(int i = c[0];i;i --) cout << c[i];cout << endl;
return 0;
}
这是我提交的
by Zeke @ 2021-11-19 17:06:40
@Terrible 过了,两种输入好像有所不同,所以第一个点没过。然后我的去掉高位0的方法多了个break;
谢谢啦