大数运算,队列实现大数加法乘法
发布时间:2020-12-14 03:09:04 所属栏目:大数据 来源:网络整理
导读:以下代码可进行大数加法,乘法的计算 【代码】: #includecstdio#includecstring#includequeue#includestackusing namespace std;const int mod=10000;//万进制queueint getnum(char str[])//把字符串转化成队列型大数 {queueint q;int len=strlen(str),num=
以下代码可进行大数加法,乘法的计算 【代码】: #include<cstdio> #include<cstring> #include<queue> #include<stack> using namespace std; const int mod=10000;//万进制 queue<int> getnum(char str[])//把字符串转化成队列型大数 { queue<int> q; int len=strlen(str),num=0,k=1; for(int i=len-1;i>=0;i--) { num+=k*(str[i]-'0'); k*=10; if(k>=mod||i==0) { q.push(num); num=0; k=1; } } return q; } void printnum(queue<int> q)//输出队列大数 { stack<int> s; while(!q.empty()) { s.push(q.front()); q.pop(); } int flag=1; while(!s.empty()) { if(flag)printf("%d",s.top()); else printf("%04d",s.top()); s.pop(); flag=0; } printf("n"); } queue<int> add(queue<int> q1,queue<int> q2)//加 { queue<int> sum; int flag=0;//进位 while(!q1.empty()||!q2.empty()) { int num1=0,num2=0; if(!q1.empty()){ num1=q1.front(); q1.pop(); } if(!q2.empty()){ num2=q2.front(); q2.pop(); } sum.push(flag+(num1+num2)%mod); flag=(num1+num2)/mod; } if(flag) sum.push(flag); return sum; } queue<int> multi(queue<int> q1,queue<int> q2)//乘 { queue<int> ans; int k=0; while(!q2.empty())//模拟手工运算 { int n=q2.front(); q2.pop(); queue<int> temp,re=q1;//re暂存q1 for(int i=0;i<k;i++) temp.push(0); k++; int flag=0;//进位 while(!re.empty()) { temp.push(flag+(n*re.front())%mod); flag=(n*re.front())/mod; re.pop(); } if(flag) temp.push(flag); ans=add(ans,temp);//累加 } return ans; } int main() { char a[1000],b[1000]; puts("Input two num:"); scanf("%s%s",a,b); queue<int> numa=getnum(a); queue<int> numb=getnum(b); printf("相加得:n"); printnum(add(numa,numb)); printf("相乘得:n"); printnum(multi(numa,numb)); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |