Open song731 opened 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年之前把他拿下。