在c語言中,最大整型變數的範圍在−9×
1018→
9×10
18-9\times10^\to9\times 10^
−9×101
8→9×
1018
。有時候題目中資料的大小超過最大整型變數,我們不能用c語言自帶的變數型別,只能模擬加減乘除的過程。這就需要用到結構體來自定義乙個大整數(高精度整數)。
大整數儲存:
由於大整數沒有適合的整型變數儲存,讀入時可以通過string類讀入。struct bign
}
因此需要通過自定義乙個函式來將string類轉化為bign類。
注意,正常情況下string中從0開始是整數形式的高位,為了方便計算轉化時可以倒序讀入,輸出時倒序輸出。bign change(string str)
return c;
}
對於兩個bign型別資料的大小比較可以定義乙個比較函式 **compare()**或者過載 **==**符號。
int compare(bign a,bign b)
return 0;//a等於b
}}
演算法:bool operator==(bign a,bign b)
return true;
}return false;
}
對於兩個整數相加,147+65,
將個位上的數相加,5+7=12;進製1。
將十位上的數相加,4+6=10;再加上個位上的進製10+1=11;進製1。
第二個數沒有百位,但是有進製,1+1=2。
因此可以用大整數型別模擬加法,兩數按相同位相加,保留進製。
和大整數加法類似,也是模擬整型變數的減法運算。bign add(bign a,bign b)
if(carry)
return c;
}
對於兩個減法:147-65
個位相減,7-5=2。
十位相減,由於4<6,需要向高位借位,4-6+10=8;借位1。
減數沒有百位,但是有借位,1-1=0。
進行減法前先比較大小,保證a>b。
低精度就是基本資料型別,如int或long long 。bign sub(bign a,bign b)
return c;
}
對於高精度與int 相乘:147$\times$35
7$\times$35=245,個位數取5,進製24。
4$\times$35+24=164,十位取4,進製16。
1$\times$35+16=51,百位取1,進製5。
千位取5。
對於高精度與低精度除法:1234/7bign multi(bign a,int b)
while(carry)
return c;
}
1<7,商為0,餘數1。
1*10+2=12>7,商為1,餘數5。
5*10+3=53>7,商為7,餘數4。
4*10+4=44>7,商為6,餘數2。
高精度乘高精度:147$\times$35bign divide(bign a,int b,int &c)
else c.b[i] = 0;
}c = carry;
while(c.len - 1 > 0 && c.b[c.len - 1] == 0)
return c;
}
個位,5$\times$7=35,先存在個位不進製。
十位,5$\times4+3
4+34+
3\times$7=41,先存在十位不進製。
百位,5$\times1+3
1+31+
3\times$4=17,先存在百位不進製。
千位,1$\times$3=3,先存在千位不進製。
高精度加法,相當於a+b problem,不用考慮負數.bign multi(bign a,bign b)
}for(int i = 0; i < a.len + b.len - 1; i++)
while(carry)
return c;
}
分兩行輸入。a,b
≤1
0500
a,b \leq 10^
a,b≤10
500輸出只有一行,代表a+b的值
輸入 #1複製
輸出 #11
1
2
輸入 #2
輸出 #21001
9099
10100
**
求兩數的積。#include#include#includeusing namespace std;
struct node
};node change(string n)
return c;
}node add(node a,node b)
return 0;
}
兩行,兩個整數。
一行乙個整數表示乘積。
輸入 #1複製
輸出 #1複製1
2
2
每個數字不超過 1
02000
10^10
2000
,需用高精。
**
#include#include#include#includeusing namespace std;
#define f(i,s,e) for(int i = s; i < e; i++);
typedef long long ll;
struct node
};node change(string n)
return c;
}node multi(node a,node b)
} for(int i = 0; i < a.len + b.len - 1; i++)
while(carry)
return c;
}void print(node a)
return 0;
}
超長整數運算(大整數運算)
問題描述 將形如1234567890123456789不能儲存在long變數中的數稱為超長整數或大整數。現討論大整數的加減乘除運算。思想方法 用陣列儲存超長整數,且為處理的簡單起見約定每個元素存放相同位的數字。如 每個元素存放4位。1 加法運算 void add int a,int b,int c ...
大整數運算
包括大整數的四則運算,一般都是用陣列來模擬大整數的,如果是每一位陣列只存一位數的話,空間浪費比較嚴重,所以這裡每一位陣列儲存4位數,所以是10000進製。加法 輸入 不超過兩百位的非負整數,可能有多餘的前導零。輸出 相加後的結果,不能有多餘的前導零 首先是一些基本的常量定義 define bir 1...
大整數運算
大整數加法 實現 include include intmain c lenc x while c lenc 0 lenc 1 lenc for int i lenc i 1 i printf d c i return0 大整數減法 實現 include include intmain b 205 ...