高精度運算模板C語言

來源:互聯網
上載者:User
#include<iostream>#include<string.h>#include<algorithm>#include<stdio.h>#define maxx 100using namespace std;//高精度加法:void add(char *s1,char *s2){int n,m,i,j,a[maxx+10]={0},b[maxx+10]={0};int l1=strlen(s1);int l2=strlen(s2);for(i=l1-1,j=maxx;i>=0;i--,j--)a[j]=s1[i]-'0';for(i=l2-1,j=maxx;i>=0;i--,j--)b[j]=s2[i]-'0';for(i=maxx;i>=0;i--){a[i]+=b[i];if(a[i]>=10) a[i-1]+=a[i]/10,a[i]%=10;}int temp=0;for(i=0;i<=maxx;i++){if(a[i]!=0 && temp==0) temp=1;if(temp==1)printf("%d",a[i]);}puts("");}//高精度減法void sub(char *s1,char *s2){int n,m,i,j,a[maxx+10]={0},b[maxx+10]={0},c[maxx+10]={0};int l1=strlen(s1);int l2=strlen(s2);for(i=l1-1,j=maxx;i>=0;i--,j--)a[j]=s1[i]-'0';for(i=l2-1,j=maxx;i>=0;i--,j--)b[j]=s2[i]-'0';for(i=maxx;i>=0;i--){c[i]+=a[i]-b[i];if(c[i]<0){c[i]+=10;c[i-1]--;}}int temp=0;for(i=0;i<=maxx;i++){if(c[i]!=0 && temp==0) temp=1;if(temp==1)printf("%d",c[i]);}puts("");}//高精度乘法void mul(char *s1,char *s2){int n,m,i,j,i1,j1,a[maxx+10]={0},b[maxx+10]={0},c[2*maxx+10]={0};int l1=strlen(s1);int l2=strlen(s2); for(i=l1-1,j=0;i>=0;i--)a[j++]=s1[i]-'0';for(i=l2-1,j=0;i>=0;i--)b[j++]=s2[i]-'0';for(i=0;i<l2;i++)for(j=0;j<l1;j++)c[i+j]+=b[i]*a[j];for(i=0;i<maxx*2;i++)if(c[i]>=10){c[i+1]+=c[i]/10;c[i]%=10;}int t=0; for(i=maxx*2;i>=0;i--)if(t) printf("%d",c[i]);else if(c[i]){printf("%d",c[i]);t=1;} if(!t)  printf("0");puts("");}//高精度除法#include<iostream>#include<string.h>#include<algorithm>#include<stdio.h>#define maxx 100using namespace std;int an1[maxx+10],an2[maxx+10];int ans[maxx+10];/*sun函數:長度為 l1的大整數p1減去長度為l2的大整數p2,減的結果放在p1裡,傳回值代表結果的長度 */int sub(int *p1,int *p2,int l1,int l2){int i;if(l1<l2)  return -1;//下面判斷p1是否比p2大,如果不是,返回-1 bool temp=false;if(l1==l2){for(i=l1-1;i>=0;i--){if(p1[i]>p2[i]) temp=true;else if(p1[i]<p2[i]){if(!temp)return -1;}}}for(i=0;i<l1;i++){ //做減法 p1[i]-=p2[i]; //要求調用本函數時給的參數能確保當i>=len2時,p2[i]=0 if(p1[i]<0){p1[i]+=10;p1[i+1]--;}}for(i=l1-1;i>=0;i--)if(p1[i])   return i+1; return 0;}int main(){int i,j;char s1[maxx+10],s2[maxx+10];scanf("%s%s",s1,s2);int l1=strlen(s1),l2=strlen(s2);memset(an1,0,sizeof(an1));memset(an2,0,sizeof(an2));memset(ans,0,sizeof(ans));for(i=l1-1,j=0;i>=0;i--)an1[j++]=s1[i]-'0';for(i=l2-1,j=0;i>=0;i--)an2[j++]=s2[i]-'0';if(l1<l2){printf("0\n");return 0;}l1=sub(an1,an2,l1,l2);if(l1<0){ printf("0\n");return 0;}else if(l1==0){printf("1\n");return 0;}ans[0]++;int ntimes=l1-l2;if(ntimes<0) goto outputresult;else if(ntimes>0){for(i=l1-1;i>=0;i--){if(i>=ntimes)an2[i]=an2[i-ntimes];elsean2[i]=0;}}l2=l1;for(j=0;j<=ntimes;j++){int ntmp;//一直減到不夠為止,先減去若干個 ans*(10 的 ntimes 次方)//不夠減了,再減去若干個ans*(10 的 ntimes 次方)while((ntmp=sub(an1,an2+j,l1,l2-j))>=0){l1=ntmp;ans[ntimes-j]++;}}outputresult://下面的迴圈統一處理進位問題 for(i=0;i<maxx;i++){if(ans[i]>=10){ans[i+1]+=ans[i]/10;ans[i]%=10;}} bool t=false;for(i=maxx;i>=0;i--)if(t) printf("%d",ans[i]);else if(ans[i]){printf("%d",ans[i]);t=true;}if(!t)printf("0\n");printf("\n");return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.