日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

C语言实现大数运算(长整数的加、减、乘、除)

發布時間:2023/11/27 生活经验 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言实现大数运算(长整数的加、减、乘、除) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

由于整型數的位數有限,因此整型數不能滿足大整數(超長整數)的運算要求 。大整數計算是利用字符串來表示大整數,即用字符串的一位字符表示大整數的一位數值,然后根據四則運算規則實現大整數的四則運算。

簡單表述大數運算實現過程:
1、加法:兩數末尾對齊,自末端逐個相加,如果有進位則高位加一;
2、減法:比較好兩數大小,大數減去小數,兩數末尾對齊,自末端逐個相減,減不掉就向高位借一
3、乘法:取其中任意一個數,分別用此數各位中數字與另一個數字相乘,各個位置相乘的結果重疊部分相加,最終考慮進位關系。
4、除法:如果被除數大于被除數,先保持除數和被除數位數相同,然后被除數一次次減去除數,最終得到在此位之下被除數對于除數的倍數,改變位數,得到其他位數下的倍數,最終得到結果。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>int a[1000],b[1000],c[1000];//返回兩者較大值 
int max(int a,int b){if(a>b)return a;else return b;
}//將數組設置為0 
int setZero(int*num,int len){for(int i=0;i<len;i++)num[i]=0;
}//比較兩個數組形式數字大小 
int compare(int*num1,int*num2){int i,j;for(i=999;num1[i]==0;i--);for(j=999;num2[j]==0;j--);if(i<j)return -1;else if(i>j)return 1;else{for(;i>=0;i--){if(num1[i]>num2[i])return 1;else if(num1[i]<num2[i])return -1;}return 0;}
}//將一個數組賦給另一個數組 
int copy(int*num1,int*num2){int i,j;for(i=0;i<1000;i++)num1[i]=0;for(i=999;num2[i]==0;i--);for(j=0;j<=i;j++)num1[j]=num2[j];return i+1;
}//大數加法 
void add(char*str1,char*str2){setZero(a,1000);setZero(b,1000);setZero(c,1000);printf("%s + %s = ",str1,str2);int i,carry=0;int len1=strlen(str1),len2=strlen(str2),len=max(len1,len2);for(i=0;i<len1;i++)a[i]=str1[len1-1-i]-'0';for(i=0;i<len2;i++)b[i]=str2[len2-1-i]-'0';for(i=0;i<len;i++){c[i]=(a[i]+b[i]+carry)%10;carry=(a[i]+b[i]+carry)/10;}if(carry!=0)c[len++]=1;for(i=len-1;i>=0;i--)printf("%d",c[i]);printf("\n");
}//大數減法 
void sub(char*str1,char*str2){setZero(a,1000);setZero(b,1000);setZero(c,1000);printf("%s - %s = ",str1,str2);int i,borrow=0;int len1=strlen(str1),len2=strlen(str2),len=max(len1,len2);for(i=0;i<len1;i++)a[i]=str1[len1-1-i]-'0';for(i=0;i<len2;i++)b[i]=str2[len2-1-i]-'0';	//初步根據位數判斷兩數大小	if(len2>len1){ printf("-");for(i=0;i<len;i++){c[i]=b[i]-a[i]-borrow;if(c[i]<0){borrow=1;c[i]+=10;}elseborrow=0;}}else{for(i=0;i<len;i++){c[i]=a[i]-b[i]-borrow;if(c[i]<0&&i+1<len){borrow=1;c[i]+=10;}elseborrow=0;}}//如果發現被減數小于減數,則重新計算,用減數減去被減數,輸出負號 if(c[len-1]<0){printf("-");for(i=0;i<len;i++){c[i]=b[i]-a[i]-borrow;if(c[i]<0&&i+1<len){borrow=1;c[i]+=10;}elseborrow=0;}}while(c[len-1]==0&&len>1)len--;for(i=len-1;i>=0;i--)printf("%d",c[i]);printf("\n");
}//大數乘法 
void mul(char*str1,char*str2) {setZero(a,1000);setZero(b,1000);setZero(c,1000);printf("%s * %s = ",str1,str2);int i,j,k,carry=0,tmp; int len1=strlen(str1),len2=strlen(str2);for(i=0;i<len1;i++)a[i]=str1[len1-1-i]-'0';for(i=0;i<len2;i++)b[i]=str2[len2-1-i]-'0';for(i=0;i<len1;i++){for(k=i,j=0;j<len2;j++,k++){c[k]+=a[i]*b[j];}}for(i=0;i<=k;i++) {c[i]+=carry;tmp=c[i];c[i]=tmp%10;carry=tmp/10;}for(i=k;c[i]==0;i--);for(;i>=0;i--)printf("%d",c[i]);printf("\n");
}//大數除法 
void div(char*str1,char*str2){setZero(a,1000);setZero(b,1000);setZero(c,1000);printf("%s / %s = ",str1,str2);int i,j,tmp,tmp2=0,borrow=0,temp[1000]={0},temp2[1000]={0};int len1=strlen(str1),len2=strlen(str2);for(i=0;i<len1;i++)a[i]=str1[len1-1-i]-'0';for(i=0;i<len2;i++)b[i]=str2[len2-1-i]-'0';if(compare(a,b)<0){printf("0\n");return;}while(compare(a,b)>=0){			tmp=len1-len2;if(tmp==tmp2&&tmp>0)tmp--;tmp2=tmp;setZero(temp2,1000);for(i=len1-1;i>=tmp;i--)temp2[i]=b[i-tmp];copy(temp,a);if(compare(temp,temp2)<0)continue;for(j=1;;j++){borrow=0;for(i=tmp;i<len1;i++){temp[i]=a[i]-temp2[i]-borrow;if(temp[i]<0){borrow=1;temp[i]+=10;}elseborrow=0;}len1=copy(a,temp);			c[tmp]=j;if(compare(temp,temp2)<0)break;}}for(i=999;c[i]==0;i--);for(;i>=0;i--)printf("%d",c[i]);printf("\n");
}int main() {add("265151916516519419516","15616651622161651616");sub("163165165161984116165","15454874487989819449");mul("798794149194949451949","98491516194941631316");div("16516498416516516191981916516165","12345678");
}

代碼效果:

總結

以上是生活随笔為你收集整理的C语言实现大数运算(长整数的加、减、乘、除)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。