【C】大數 Big Numnbers

  • 何謂大數?

目前C只能存到最高64bit,大約是19位,超過即為大數。
在這邊先弄清楚各個type最多可存幾位
32bit- int:約9位
64bit – long long :約19位

  • 如何評估運算之後會是幾位數?
2位數 + 3位數 <= 4位數
2位數 x 3位數 <= 5位數
  • 用陣列存大數,個位數靠前,後面要補0 (不補0也可,但要記長度)
e.g. 若我要存123456789

?
1
int num[MAX_LENGTH] = {9,8,7,6,5,4,3,2,1,0,0,0};

Code (十進位&百進位)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define MAX_LENGTH 15
 
using namespace std;
 
void big_add(int *num1, int *num2, int *answer){
    int carry = 0;
    for (int i = 0; i < MAX_LENGTH; i++) {
        answer[i] = (num1[i]+num2[i]+carry)%10;
        carry = (num1[i]+num2[i]+carry)/10;
        /*answer[i] = (num1[i]+num2[i]+carry)%100;
        carry = (num1[i]+num2[i]+carry)/100;*/
    }
    if (carry != 0) printf("Overflow!\n");
}
 
void big_mul(int *num1, int *num2, int *answer){
    for(int i=0; i< MAX_LENGTH; i++) answer[i] = 0;
    int carry;
    for (int i=0; i< MAX_LENGTH; i++) {
        carry = 0;
        for (int j=0; j< MAX_LENGTH; j++) {
            if ((i+j) < MAX_LENGTH){ /*not overflow*/
                int tmp = answer[i+j]+num2[i]*num1[j]+carry;
                answer[i+j] = tmp%10;
                carry = tmp/10;
                /*answer[i+j] = tmp%10;
                carry = tmp/10;*/
            }
        }
    }
}
 
void big_sub(int *num1, int *num2, int *answer){
    /*num1>=num2且都為正*/
    int borrow = 0; //0或-1
    for (int i=0; i< MAX_LENGTH; i++) {
        answer[i] = num1[i]-num2[i]+borrow;
        if (answer[i] < 0){ //借位
            answer[i] += 10;
            //answer[i] += 100;
            borrow = -1;
        }
        else borrow = 0;
    }
    if (borrow != 0) printf("Underflow!\n");
}
 
void output(int *answer){
    int flag = 0;
    for (int i = MAX_LENGTH; i >= 0; i--) {
        if (answer[i]!=0 && flag==0) flag = 1;
        if (flag==1) printf("%d",answer[i]);
    }
    printf("\n");
}
 
int main(){
    int b[MAX_LENGTH] = {2,1,5,6,2,8,3,0,0,0,0,0,0,0,0};
    int a[MAX_LENGTH] = {3,7,8,9,3,2,5,0,0,0,0,0,0,0,0};
    /*int a[MAX_LENGTH] = {23,11,52,65,0,0,0,0,0,0,0,0,0,0,0};
    int b[MAX_LENGTH] = {37,72,86,91,0,0,0,0,0,0,0,0,0,0,0};*/
    int answer[MAX_LENGTH];
    big_add(a, b, answer);
    printf("ADD : "), output(answer);
    big_mul(a, b, answer);
    printf("MUL : "), output(answer);
    big_sub(a, b, answer);
    printf("SUB : "), output(answer);
    return 0;
}
Advertisements

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s