大整數乘法以及空間效能優化

2021-07-24 22:20:03 字數 2483 閱讀 5000

在c++版的資料結構中有一道課後練習題—大整數求和,不過這次我想弄的是大整數乘法並對它進行空間效能優化一下,因為書本上的乙個int型別只能存放0~9的數字,很容易造成空間上的浪費,這次我的乙個int型別存放4位數字,不過在實現之前我們還是做一下大整數加法,畢竟要先從容易的入手,題目如下所示: 

用某種程式語言進行程式設計時,可能需要處理非常大或者運算精度要求非常高的整數(稱為大整數),這種大整數用該語言的基本資料型別是無法直接表示的。處理大整數的一般方法是用陣列儲存大整數,陣列元素代表大整數的一位,通過陣列運算模擬大整數的運算。

以上為題目: 首先我來說一下我的解題思路: 

2. 陣列的中的排序為從低位到高位,即123在陣列用321來表示,因為加法運算時是從低位算起的。

具體**如下: 

#include

#include

using namespace std;

const int max_size = 100000;

int num1[max_size];    

int num2[max_size];      

int sum[max_size];

//加法函式

void add() 

max = num2[max_size-1];

}else

max = num1[max_size-1];

}sum[max_size-1] = max;

for(int i=0;i            sum[i] = num1[i]+num2[i];

//進製

//感覺當時應該把num1,num2傳進來的,現在num1已經被汙染了

//(ps: 不能以int* 的方式傳陣列,因為以指標的方式一樣會被汙染的)

if(sum[i]>9)

}sum[max-1] = num1[max-1]+num2[max-1];

if(sum[max-1]>9)

}int main()

//用陣列的最後乙個存放該陣列的長度 

num1[max_size-1] = strlen(num);

//給num2陣列賦值,重複以上步驟

cin>>num;

for(int i=strlen(num)-1;i>=0;i--)

num2[max_size-1] = strlen(num); 

add();

for(int i=sum[max_size-1]-1;i>=0;i--)

return 0;

}上面為大整數加法,下面來討論大整數乘法,在實現之前先說一下我的思路: 

1. 當我們輸入123456789(char型別)時,6789存放在int[0]中,2345存放在int[1]中,1存放在int[2]中,因為輸入的char型別,所以要將四個字元轉為四位數字(即千位數),但前面都是存放4個字元,可以用統一的**來實現,但最後乙個1只有乙個字元,需要特殊處理一下。(其實也不用這樣處理的,只需在char陣列前留空幾個字元就可以,可以參考一下鍊錶中使用空頭結點來統一**的思路)

2. 當輸出結果時,有些存放的數字是0123,真正輸出的是123,所以要做一些處理,將其轉換一下。

3. 剛開始做這道題時,我以為跟大整數求和的差不多,其實這道題並是很簡單的,有很多需要注意的問題,有興趣的可以做下。

具體**如下: 

#include

#include

using namespace std;

const int max_size = 10000;

char num[max_size*4];

int num1[max_size] = ;

int num2[max_size] = ;

int sum[max_size*2] = ;

int num1_len,num2_len,sum_len,num_len;

void char_to_int(int i,int* a)

char_to_int(++i,++a);

}void mutil()

if(sum[i+j]>9999)}}

if(!sum[sum_len-1])

}int main() 

//這次我用的遞迴函式處理...(傳入的i為給第i個陣列賦值) 

char_to_int(0,num1);

//重複上述步驟,給num2賦值

cin>>num;

num_len = strlen(num);

start = num_len%4-1;

num2_len = (num_len-1)/4+1;

n = 1;

while(start != -1)

char_to_int(0,num2);

mutil();

cout<      for(int i=sum_len-2;i>=0;i--)else if(sum[i]<100)else if(sum[i]<1000)

cout<      }

return 0;

}

大整數乘法

參考 http hi.baidu.com operationsystem blog item 6e45dd1af1acadf3ae51330b.html 在計算機中,長整型 long int 變數的範圍是 2147483648 至 2147483647,因此若用長整型變數做乘法運算,乘積最多不能超過...

大整數乘法

問題描述 by 計算機演算法設計與分析 王曉東 p17 通常,在分析乙個演算法的計算複雜性時,都將加法和乘法運算當作是基本運算來處理,即將執行一次加法或乘法運算所需的計算時間當作乙個僅取決於計算機硬體處理速度的常數。這個假定僅在計算機硬體能對參加運算的整數直接表示和處理時才是合理的。然而,在某些情況...

大整數乘法。

include using namespace std int multi int num1,int size1,int num2,int size2 int size size1 size2 int ret new int size int i 0 for i 0 iret i 0 for i 0...