算法提高 P1001(模拟)
2018-03-31 09:44
211 查看
要注意进位(无论是乘法的进位还是最后加法的进位)看网上有人用分块乘法,感觉很流弊以下用的是普通的模拟乘法的方法
#include<iostream> #include<stdio.h> #include<string> #include<sstream> #include<fstream> #include<vector> #include<iomanip> #include<stack> #include<list> #include<map> #include<set> #include<algorithm> #include<cmath> using namespace std; int f[17][17]={0}; int main(){ string s1,s2; cin>>s1>>s2; //cout<<s1<<endl<<s2<<endl; if(s1=="0"||s2=="0"){//没有这个的话最后一组用例无法通过 cout<<0; return 0; } int ip=0;//和jp一起作为f的下标 for(int i=s2.length()-1;i>=0;i--){ int jp =16 +(i-s2.length()+1);//16,15,14... for(int j=s1.length()-1;j>=0;j--){ int s = int(s2[i]-'0')*int(s1[j]-'0'); f[ip][jp--]+=s%10; f[ip][jp] = s/10; //进位正好在前一位 //printf("f[%d][%d]=%d\n",ip,jp+1,s%10); } ip++; // printf("f[%d][%d]=%d",ip-1,jp+1,tip); // cout<<"========="<<endl; } int fin[17]={0};//记录加法最终结果 for(int k =16;k>=0;k--){ for(int p = 0;p<ip;p++){ fin[k]+=f[p][k]; } fin[k-1] = fin[k]/10;//记录进位 fin[k] = fin[k]%10; } int ii = 0; while(fin[ii]==0)ii++;//忽略前导0 for(int i=ii;i<17;i++){ cout<<fin[i]; } return 0; }
相关文章推荐
- 2016蓝桥杯算法提高——P1001(大数乘法)
- 算法提高 P1001
- 算法提高 最大乘积 模拟
- 算法提高 P1001 (大数相乘)
- 蓝桥杯 ADV-197 算法提高 P1001
- 算法-蓝桥杯-算法提高 P1001(JAVA)
- 算法提高 P1001
- 算法提高 P1001
- 算法提高P1001
- 算法提高 P1001
- 蓝桥杯--算法提高 我们的征途是星辰大海 (模拟)
- 算法提高 P1001
- 算法提高 P1001(Java解题)
- 算法提高 P1001 (大数乘法)
- JZOJ4744. 【NOIP2016提高A组模拟9.2】同余 一类比较好的分类思想+根号算法
- 算法提高 ADV-197 P1001
- 算法提高 P1001
- 算法笔记_097:蓝桥杯练习 算法提高 P1001(Java)
- 算法提高 P1001
- 【算法】轰炸(BOMB)解题报告(模拟提高组)