详细题解

黄戈  •  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;
}

没办法了,题目有问题。暴力解决得了


评论:

.


黄戈  •  5个月前