UCE-group / fortnightly-plan

北京化工大学 BUCT-UCE 社团: 编程学习 - 周计划WP,双周计划FP,月计划MP
35 stars 12 forks source link

【WP】2019年秋季-第12周-宋俊霖 #351

Open song731 opened 4 years ago

song731 commented 4 years ago

//两个超大数相乘 
#include<iostream>
using namespace std;
void BigMutiple(string str1, string str2)
{
    //求字符串长度
    int len1=str1.length();
    int len2=str2.length();
    //定义输出字符串长度
    string str(len1+len2,'0');    //两数相乘结果的位数是两数位数之和-1 
                                //str初始化为0      
    int temp1=0,i,j,h=0,temp2=0;
    //乘法、加法位
    int mulflag=0, addflag=0;
    for(i=len2-1; i>=0; --i) 
    {    
           for(j=len1-1; j>=0; --j)
           {          
                //处理乘法进位
                temp1=(str2[i]-'0')*(str1[j]-'0')+mulflag;  //temp1两个位上的数相乘之后经过进位后留下来的最终的数 
                mulflag=temp1/10;   //乘法进位
                temp1=temp1%10;
                //处理加法进位
                temp2=str[i+j+1]-'0'+temp1+addflag;  /*两数的两个位上的数相加之后和位于结果的第i+j位上, 
                这里str[i+j+1]是 留出最高位str[0]作为符号位 当前位赋值*/
                str[i+j+1]=temp2%10+'0'; 
                addflag=temp2/10;//加法进位
           }
           str[i]+=mulflag+addflag;/*最高位的进位,因为每边乘一次,最高位由于前面没有位了,进的位只能暂时
            保留下来(str[i])加到下次遍乘结果中(示例:5289*376); */
     }
     if(str[0]=='0') //首位为0,如200*300=060000
     {
           str=str.substr(1, str.size()-1);//功能:复制字符串,第一个参数是开始复制的起始位置,第二个参数是复制的长度 
    }//size()返回字符串大小 
    while(str[h]!='\0'){
        ++h;
    }
    cout<<str[h-1]<<endl;
}/
int main(){
    int i=0;
    string str1,str2;
    while(cin>>str1>>str2){//控制多组数据输入 
        BigMutiple(str1,str2);
    }
    return 0;
}
       至今还有一个地方没有看懂,表示超大整数对我这个小白来说实在是太难了,加油,
       争取在2020年之前把他拿下。

加油,先生