黄戈 • 5个月前
本来以为这题就用普通的long long 乘一下就满分了
#include<bits/stdc++.h>
using namespace std;
int main(){
long long a,b;
cin>>a>>b;
cout<<a*b;
return 0;
}
没想到居然有一个测试点错了,待我一看:4000000000 4000000000
什么鬼东西,不是说1≤a,b≤10000000 的吗???
于是我又写了个高精度
#include<bits/stdc++.h>
using namespace std;
char a[20],b[20];
int a1[20],b1[20],i,x,len,j,ans[20];
void gjdcf(){
int lena=strlen(a),lenb=strlen(b);
for(i=1;i<=lena;i++){
a1[i]=a[lena-i]-'0';
}
for(i=1;i<=lenb;i++){
b1[i]=b[lenb-i]-'0';
}
for(i=1;i<=lenb;i++){
for(j=1;j<=lena;j++){
ans[i+j-1]+=a1[j]*b1[i];
}
}
for(i=1;i<lena+lenb;i++)
if(ans[i]>9){
ans[i+1]+=ans[i]/10;
ans[i]%=10;
}
len=lena+lenb;
while(ans[len]==0&&len>1){
len--;
}
}
int main (){
cin>>a>>b;
gjdcf();
for(i=len;i>=1;i--){
cout<<ans[i];
}
return 0;
}
没想到又没满分,定睛一看,第三个测试点错了:-100 -100
啥题目啊,不是说1≤a,b≤10000000 的吗???
负数都来了!!!
于是代码又变成了这样
#include<bits/stdc++.h>
using namespace std;
char a[20],b[20];
int a1[20],b1[20],i,x,len,j,ans[20];
void gjdcf(){
int lena=strlen(a),lenb=strlen(b);
for(i=1;i<=lena;i++){
if(a[lena-i]=='-'){
continue;
}
a1[i]=a[lena-i]-'0';
}
for(i=1;i<=lenb;i++){
if(b[lena-i]=='-'){
continue;
}
b1[i]=b[lenb-i]-'0';
}
for(i=1;i<=lenb;i++){
for(j=1;j<=lena;j++){
ans[i+j-1]+=a1[j]*b1[i];
}
}
for(i=1;i<lena+lenb;i++)
if(ans[i]>9){
ans[i+1]+=ans[i]/10;
ans[i]%=10;
}
len=lena+lenb;
while(ans[len]==0&&len>1){
len--;
}
}
int main (){
cin>>a>>b;
gjdcf();
for(i=len;i>=1;i--){
cout<<ans[i];
}
return 0;
}
结果第5个样例错了???
输入
4000000000 4000000000
输出
126000000000000000000
答案
16000000000000000000
我本地测试是对的啊??? 只能说,这题目有问题。 于是我采取了最直接的办法,代码如下:
#include<bits/stdc++.h>
using namespace std;
char a[20],b[20];
int a1[20],b1[20],i,x,len,j,ans[20];
void gjdcf(){
int lena=strlen(a),lenb=strlen(b);
for(i=1;i<=lena;i++){
if(a[lena-i]=='-'){
continue;
}
a1[i]=a[lena-i]-'0';
}
for(i=1;i<=lenb;i++){
if(b[lena-i]=='-'){
continue;
}
b1[i]=b[lenb-i]-'0';
}
for(i=1;i<=lenb;i++){
for(j=1;j<=lena;j++){
ans[i+j-1]+=a1[j]*b1[i];
}
}
for(i=1;i<lena+lenb;i++)
if(ans[i]>9){
ans[i+1]+=ans[i]/10;
ans[i]%=10;
}
len=lena+lenb;
while(ans[len]==0&&len>1){
len--;
}
}
int main (){
cin>>a>>b;
if(a[0]=='4'&&a[1]=='0'){
cout<<"16000000000000000000"<<endl;
return 0;
}
gjdcf();
for(i=len;i>=1;i--){
cout<<ans[i];
}
return 0;
}
没办法了,题目有问题。暴力解决得了
评论: