Operação em grande número - operação de alta precisão - adição, subtração, multiplicação e divisão de números super grandes

Link do título: http://acm.hdu.edu.cn/showproblem.php?pid=1314

O código é o seguinte:

 

#include <iostream>

#include <algorithm>

#include <math.h>

#include<iomanip>

#include<string.h>
#include<sstream>
using namespace std;
void max(string &a,string &b)
{
	string t;
	if(a<b)
	{
		t=a;
		a=b;
		b=t;
	}
 } 
string Plus(string str1,string str2)         ////大数加法
{
    string ans;
    int len1=str1.size();
    int len2=str2.size();
    if(len1<len2){
        for(int i=1;i<=len2-len1;i++){
            str1="0"+str1;
        }
    }else {
        for(int i=1;i<=len1-len2;i++){
            str2="0"+str2;
        }
    }
    int len=max(len1,len2);
    int carry=0;
    for(int i=len-1;i>=0;i--){
        int tmp=str1[i]-'0'+str2[i]-'0'+carry;
        carry=tmp/10;
        tmp%=10;
        ans=char(tmp+'0')+ans;
    }
    if(carry) ans=char(carry+'0')+ans;
    return ans;
}
string Sub(string a,string b) /////////大数减法
{
	string sub;
	int i,a1,b1;
	int a_len=a.size();
	int b_len=b.size();
	if(a_len>=b_len)
	{
		for(i=0;i<a_len-b_len;i++)
		{
			b='0'+b;
		}
	 } 
	 else 
	 {
	 	for(i=0;i<b_len-a_len;i++)
	 	{
	 		a='0'+a;
	    }
	 }
	 max(a,b);
	 for(i=a_len-1;i>=0;i--)
	 {
	 	a1=a[i]-'0';
	 	b1=b[i]-'0';
	 	if(a1-b1<0)
	 	{
	 	   	a[i-1]=a[i-1]-'0'-1+'0';
	 	   	sub=char(a1+10-b1+'0')+sub;
		}
		else 
		{
			sub=char(a1-b1+'0')+sub;
		}
	 }
	 sub.erase(0,sub.find_first_not_of('0'));
	 if(sub.empty()) sub="0";
	 return sub;
	
}
string mul(string str1,string str2)  ////大数乘法
{
    string ans;
    int len1=str1.length();
    int len2=str2.length();
    for(int i=len2-1;i>=0;i--){
        string tmpstr="";
        int data=str2[i]-'0';
        int carry=0;
        if(data!=0){
            for(int j=1;j<=len2-1-i;j++){
                tmpstr+="0";
            }
            for(int j=len1-1;j>=0;j--){
                int t=data*(str1[j]-'0')+carry;
                carry=t/10;
                t%=10;
                tmpstr=char(t+'0')+tmpstr;
            }
            if(carry!=0) tmpstr=char(carry+'0')+tmpstr;
        }
        ans=Plus(ans,tmpstr);
    }
    ans.erase(0,ans.find_first_not_of('0'));
    if(ans.empty()) ans="0";
    return ans;
}
string chu(string a,int n)       ///大数除法
{
   string t;
   int i,m,yushu=0;
   for(i=0;i<a.size();i++)
   {
   	  m=(yushu*10+a[i]-'0')/n;
   	  yushu=(yushu*10+a[i]-'0')%n;
   	  t=t+char(m+'0');
   }
   t.erase(0,t.find_first_not_of('0'));
   if(t.empty()) t="0";
   return t;
}
int   mod(string a, int b)         ///大数取模
{
	int i,m,n=0;
	for(i=0;i<a.size();i++)
	{
		m=(n*10+a[i]-'0')/b;
		n=(n*10+a[i]-'0')%b;
	}
	return n;
}
string change(int n)
{
	string s;
	stringstream ss;
	ss<<n;
	ss>>s;
	return s;
}
int change(string n)
{
	int a;
	stringstream aa;
	aa<<n;
	aa>>a;
	return a;
}
string mi(int a,int  b)
{
	int i,j;
	string t;
	t='1'+t;
	for(i=0;i<b;i++)
	{
		string k;
		int m=0,n=0;
		for(j=t.size()-1;j>=0;j--)
		{
			m=(int)(t[j]-'0')*a+n;
			k=char(m%10+'0')+k;
			n=m/10;
		}
		if(n>0)
		{
			k=char(n+'0')+k;
		}
		t=k;
	}
	return t;
	
}
int main(){
  string s;
  int i;
    while(cin>>s,s[0]!='*')
    {
        if('a'<=s[0]&&s[0]<='z')
        {
            string num=change(s[0]-'a'+1);
            for( i=1;i<s.size();i++)
            {
                num=Plus(mul(num,change(26)),change(s[i]-'a'+1));
            }
            cout<<s;
            for( i=s.size()+1;i<23;i++)cout<<' ';
            int k=num.size()%3;
            for( i=0;i<num.size();i++)
            {
                if((num.size()-i)%3==0&&i!=0) cout<<","<<num[i];
                else cout<<num[i];
            }
            cout<<endl;
        }
        else 
        {
        	string num;
        	int n;
        	string s1=s;
        	for(;change(s)>26;)
        	{
        	   n=mod(s,26);
        		num=char(n+'a'-1)+num;
        		s=chu(s,26);
			}
				n=change(s);
				num=char(n+'a'-1)+num;
			cout<<num;
			for(i=num.size()+1;i<23;i++)  cout<<' ';
			for(i=0;i<s1.size();i++)
            {
                if((s1.size()-i)%3==0&&i!=0) cout<<","<<s1[i];
                else cout<<s1[i];
            }
            cout<<endl;
		}
    }
    return 0;
}

 

 

Publicado 6 artigos originais · Gosto1 · Visitas 141

Acho que você gosta

Origin blog.csdn.net/qq_46015269/article/details/104399231
Recomendado
Clasificación