大整数乘法

#include <iostream>
#include <string>
using namespace std;
 
string max_i,min_i;
 
string count_add(string s1,string s2)                   //进行两个数相加
{
    max_i = s1;min_i = s2;
    if(s2.size()>s1.size())
    {
        max_i = s2;                                     //取长度大的数为max
        min_i = s1;
    }
     
    for(int i = min_i.size()-1,j = max_i.size()-1; i>=0;i--,j--)     //模拟整数加的过程
    {
        max_i[j] += min_i[i] -'0';                                      //选择将结果保存在max变量中
         
        if(max_i[j] > '9')                                               //字符值大于9需要处理
        {
            if(j > 0)
            {
                max_i[j - 1] ++;
                max_i[j] -= 10;
            }
            else
            {
                max_i = "1" + max_i;
                max_i[j] -= 10;
            }
        }
    }
     
    return max_i;
}
 
int main()
{
    string s1,s2; //直接按字符串乘 
    cin>>s1>>s2;
 
    int i,j;
    bool nega_s1 = false,nega_s2 = false;//标记负数 
     
    //负数情况 
    if(s1[0] == '-')                                //若带负号,则取出数字部分
    {
        nega_s1 = true;
        s1 = s1.substr(1);                          //选取第一位以后的字符串重新赋值给s1	
    }
     
    if(s2[0] == '-')
    {
        nega_s2 = true;
        s2 = s2.substr(1);
    }
     
    char unit, decade = '0'; //个位  十位 
     
    int a,b;
    string result_one[s2.size()];                   //保存中间的s2的每一位乘s1的结果
     //模拟相乘过程
    for(i = s2.size()-1; i >= 0; i--)                //倒序循环 
    {
        a = s2[i] - '0';
        for(j = s1.size()-1; j >= 0; j--)
        {
            b = s1[j] - '0';
             
            unit =((a * b) + decade - '0') % 10 + '0' ;     //保存两个数字相乘的个位、十位
            decade = ((a * b) + decade - '0') / 10 + '0';
 
            result_one[s2.size() -1- i] = unit + result_one[s2.size() -1- i] ;  //按顺序输入 
        }
        if(decade != '0')  //十位 
            result_one[s2.size() -1- i] = decade + result_one[s2.size() -1- i];
 
        decade = '0';
    }
     
    for(i = 0; i < s2.size(); i++)                   //对中间结果补齐位数
    {
        for(j = i;j > 0; j--)
        {
            result_one[i] = result_one[i] + '0';
        }
    }
     
    string sum = "0";                               //用sum变量保存最终结果
     
    for(i = 0;i < s2.size(); i++)                    
    {      
        sum = count_add(sum,result_one[i]);         //相加
    }
     
    int tip = 0;
     
    for(i = 0; i < sum.size(); i++)                  //找出非零的起始位置
    {
        if(sum[i] == '0' )
        {
            tip ++;
        }
        else
            break;
    }  
     
    if(nega_s1 + nega_s2 == 1)                      //输出符号
        cout<<"-";
     
    for(i = tip ; i < sum.size(); i++)               //输出数字部分答案
    {
        cout<<sum[i];
    }
 
    if(tip == sum.size())
        cout<<"0";
     
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值