大数加法乘法的模拟过程---创新实验室纳新

https://www.qduoj.com/problem/596

#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
typedef long long ll;
ll t1[55],t2[100];
ll temp[4];
int main(){
	string a;
	ll b;
	cin>>a>>b;
	//将b的各位分开 
	temp[0]=b%10;//个位 
	temp[1]=(b/10)%10;//十位 
	temp[2]=(b/100)%10;//百位 
	temp[3]=b/1000;//千位 
	ll len=a.size();//大数a的长度 
	ll jinwei=0;
	ll cnt=0;
/******************加法部分***********************************/
	if(len<=4){//a<=b的时候,直接运算 
		ll summ=0;
		for(ll i=0;i<len;i++){
			summ+=(a[len-i-1]-'0')*(ll)(pow((double)10,i));
		}
		printf("%lld",summ+b);
	}
	else {//a>b的时候 
		for(ll i=len;i>0;i--){//从len开始,留一位0,用来存储最后的那个进位 
		if(cnt>3){//cnt>3说明b的最高位已经加过 
			t1[i]=(a[i-1]-'0'+jinwei)%10;
			jinwei=(a[i-1]-'0'+jinwei)/10;
		}
		else {
			t1[i]=(temp[cnt]+a[i-1]-'0'+jinwei)%10;
			jinwei=(temp[cnt]+a[i-1]-'0'+jinwei)/10;
			cnt++;
		}
	}
	t1[0]=jinwei;//最后的进位 
	ll tt=0;
	if(t1[0]==0)
	    tt=1;
	for(;tt<=len;tt++){
		printf("%lld",t1[tt]);
	}
	}
	printf("\n");
/***************乘法部分*****************************************/
	jinwei=0;
	for(ll i=0;i<4;i++){
		cnt=i;
		jinwei=0;
		//模拟乘法的过程 
		for(ll j=len-1;j>=0;j--){
			t2[cnt]=(t2[cnt]+((a[j]-'0')*temp[i]+jinwei));
			jinwei=t2[cnt]/10;//进位 
			t2[cnt]%=10;//该位的数字 
			cnt++;
		}
		t2[cnt]=jinwei;
	}
	ll flag=0,pp=0;
	for(ll i=cnt;i>=0;i--){
		//去掉前导零 
		if(t2[i]==0){
			if(flag==0){
				continue;
			}
			else {
				pp=1;
				printf("0");
			}
		}
		else {
			flag=1;
			pp=1;
			printf("%lld",t2[i]);
		}
	}
	//如果全是零,就打印0 
	if(pp==0)
	printf("0");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值