大數運算之加減乘除


大數運算

1.為什么要有大數運算

我們都知道計算機能夠儲存的各種類型數的大小是有限的,比如int型在32位的情況下范圍是從-231~231-1,那么如果我們要計算的數非常的大,我們該如何做呢?那樣便需要運用到大數運算。

2.大數運算怎么實現

大數運算本質上來說是模仿人們進行筆算時的操作,將人們筆算時的操作通過代碼來實現,從而達到實現大數運行的結果。

3.大數加法

c++代碼如下:

#include <cstring>
#include <cstdio>
using namespace std;
const int Max =10001;
int main(){
    char a[Max],b[Max];//用來以字符串形式存放輸入的數字
    int aa[Max],bb[Max];//以每位數字的形式存放輸入的數字
    int sum[Max];//用來存放每位數字的和
    int lena,lenb;
    scanf("%s%s",a,b);
    lena = strlen(a);//記錄數字長度
    lenb = strlen(b);
	//將字符轉化為數字
    for(int i= 0 ; i < lena; i ++){
        aa[i] = a[i] - 48;
    }
    for(int i= 0 ; i < lenb; i ++){
        bb[i] = b[i] - 48;
    }
    int num = 0;
	//當一方數字每位都計算完后結束循環
    while(lena > 0 && lenb > 0){
        lena -- ;
        lenb -- ;
        sum[num ++ ] = aa[lena] + bb[lenb];
    }
	//位數較多的直接加到sum數組后面
    while(lena > 0){
        lena --;
        sum[num ++] = aa[lena] ;
    }
    while(lenb > 0){
        lenb -- ;
        sum[num ++ ] = bb[lenb];
    }
	//進位操作,sum[i]>10則進位
    for(int i = 0 ; i < num ; i ++ ){
        if(sum[i] >= 10){
            sum[i+1] += 1;
            sum[i] -= 10;
        }
    }
	//判斷最高位是否進位
    if(sum[num] != 0){
        num ++ ;
    }
    for(int i = num -1 ; i >= 0 ; i -- ){
        printf("%d",sum[i]);
    }
    printf("\n");
    return 0;
}

4.大數減法

C++代碼如下:

#include <cstring>
#include <cstdio>
using namespace std;
const int Max = 10001;
char a[Max], b[Max];
int aa[Max], bb[Max];
int sum[Max];
int lena, lenb;
int flag = 0;
//若aa>bb的值則返回true
bool cmp() {
	//記錄變化
	bool f = false;
	if (lena > lenb) {
		return true;
	}
	else if (lena == lenb){
		for (int i = 0; i < lena; i++) {
			if (aa[i] > bb[i])
				f = true;
			if (aa[i] < bb[i] && f != true)
				return false;
		}
		return true;
	}
	return false;
}
int main() {
	scanf("%s%s", a, b);
	lena = strlen(a);
	lenb = strlen(b);
	for (int i = 0; i < lena; i++) {
		aa[i] = a[i] - 48;
	}
	for (int i = 0; i < lenb; i++) {
		bb[i] = b[i] - 48;
	}
	int num = 0;
	//判斷哪個數更大
	if (cmp()) {
		while (lena > 0 && lenb > 0) {
			lena--;
			lenb--;
			sum[num++] = aa[lena] - bb[lenb];
		}
		while (lena > 0) {
			lena--;
			sum[num++] = aa[lena];
		}
	}
	else {
		flag = 1;
		while (lena > 0 && lenb > 0) {
			lena--;
			lenb--;
			sum[num++] = bb[lenb] - aa[lena];
		}
		while (lenb > 0) {
			lenb--;
			sum[num++] = bb[lenb];
		}
	}
	//若相減小於零,則向前借位
	for (int i = 0; i < num; i++) {
		if (sum[i] < 0) {
			sum[i + 1] -= 1;
			sum[i] += 10;
		}
	}
	//添加正負號
	if (flag) {
		for (int i = num - 1; i >= 0; i--) {
			if (sum[i] != 0) {
				sum[i] = -sum[i];
				break;
			}
		}
	}
	bool zero = false;
	for (int i = num - 1; i >= 0; i--) {
		if (sum[i] != 0)
			zero = true;
		if(zero == true)
			printf("%d", sum[i]);
	}
	if (zero == false) {
		printf("0");
	}
	printf("\n");
	return 0;
}

5.大數乘法

C++代碼如下:

#include <cstring>
#include <cstdio>
using namespace std;
const int Max = 10001;
int main(){
    char a[Max],b[Max];
    int aa[Max],bb[Max];
    int sum[Max*2];
    scanf("%s%s",a,b);
    int lena = strlen(a);
    int lenb = strlen(b);
    for (int i = 0 ; i < lena; i ++ ){
        aa[i] = a[i] - 48;
    }
    for (int i = 0 ; i < lenb; i ++ ){
        bb[i] = b[i] - 48;
    }
    memset(sum,0,sizeof(sum));
    int num;
    for(int j = lenb - 1 ; j >= 0 ; j --){
		//模仿乘法,第一次放在最低位,第二次放在前一位,依次類推
        num = lenb - 1 - j;
        for(int i = lena - 1 ; i >= 0 ; i -- ){
            sum[num ++ ] += bb[j] * aa[i];
        }
    }
    for (int i = 0 ; i < num ; i ++ ){
		//若最高位大於10,則循環位數加一,直至最高位不大於10
        if(sum[num - 1] >= 10){
            num ++ ;
        }
        sum[i + 1] += sum[i] /10 ;
        sum[i] = sum[i] % 10;
    }
    for (int i = num- 1 ; i >= 0 ; i-- ){
        printf("%d",sum[i]);
    }
    printf("\n");
    return 0;
}

6.大數除法

C++代碼如下:

#include <cstdio>
#include <cstring>
using namespace std;
const int Max = 10001;
int Sub(int * aa , int * bb , int lena , int lenb){
	//判斷是否是被除數更大,是則返回-1
    if (lena < lenb){
        return -1;
    }
    else if(lena == lenb){
        for(int i = lena -1 ; i >=0 ; i--){
            if (aa[i] > bb[i])  break;
            else if(aa[i] < bb[i]) return -1;
        }
    }
    for(int i = 0; i < lena ; i ++){
        aa[i] -= bb[i];
        if(aa[i] < 0){
            aa[i+1] -= 1;
            aa[i] += 10;
        }
    }
    for (int i = lena -1 ; i >= 0 ; i--){
        if (aa[i]) return (i+1);
    }
    return 0;
}
int main(){
    char a[Max],b[Max];
    int aa[Max],bb[Max];
    int sum[Max];
	//記錄最長長度,因為除法不可能比被除數大(考慮的是整數除法)
    int maxlen;
    scanf("%s%s",a,b);
    int lena = strlen(a);
    int lenb = strlen(b);
    memset(aa,0,sizeof(aa));
    memset(bb,0,sizeof(bb));
    memset(sum,0,sizeof(sum));
	//注意逆序
    for(int i = lena - 1 , j = 0 ; i >= 0 ; i --  ,j ++){
        aa[j] = a[i] - 48 ;
    }
    for(int i = lenb - 1 , j = 0 ; i >= 0 ; i --  ,j ++){
        bb[j] = b[i] - 48 ;
    }
	//被除數小於除數,為0
    if(lena < lenb){
        printf("0\n");
        return 0;
    }
    maxlen = lena;
    int n = lena - lenb;
	//用於將bb數組里對應最高位的數移至aa數組最高位位置
    for(int i = lena - 1 ; i >= 0 ; i --){
        if(i >= n){
            bb[i] = bb[i-n];
        }
        else{
            bb[i] = 0;
        }
    }
    lenb = lena;
    int t;
    for (int i = 0 ; i <= n ; i ++ ){
		//循環執行減法
        while((t = Sub(aa,bb+i,lena,lenb-i)) >= 0){

            lena = t;
            sum[n - i] ++;
        }
    }
    int i;
    for( i = maxlen -1 ;i >= 0 ;i--){
        if(sum[i]) break;
    }
    if(i >= 0){
        for(;i>=0;i--){
            printf("%d",sum[i]);
        }
    }
    else{
        printf("0");
    }
    printf("\n");
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM