高精度運算練習題(藍橋杯)

2021-10-02 14:15:28 字數 3382 閱讀 2125

實現高精度的加法、減法、快速除法。

#include

#include

#include

#include

using

namespace std;

class

bign

;bign

(string a)

;void

add(

const bign& a)

;//加法

void

minus

(const bign& a)

;//減法

bign devide

(const bign& a)

;//除法,返回商,自己變成餘數

friend ostream&

operator

<<

(ostream &out,

const bign &obj)

;int

compare

(const bign& a)

;private

: string data;

//低位在前,高位在後 };

intmain()

bign bign::

devide

(const bign& a)

copy_a=a;

t=data.

size()

-len-1;

}//減法 (直接做減法會超時)

while

(compare

(copy_a)

>=0)

return ans;

}void bign::

minus

(const bign& a)

else

}for

(temp=newlen-

1;ans[temp]

=='0'

;temp--);

ans.

erase

(temp+1)

;this

->data=ans;

}int bign::

compare

(const bign& a)

return0;

}void bign::

add(

const bign& a)

if(rel[newlen-1]

=='0'

)rel.

erase

(newlen-1)

;this

->data=rel;

}ostream&

operator

<<

(ostream &out,

const bign &obj)

else

return out;

}bign::

bign

(string a)

給出乙個整數 n(n< 10^30) 和 k 個變換規則(k< =15)。

規則:一位數可變換成另乙個一位數:

規則的右部不能為零。

例如:n=234。有規則(k=2):

2-> 5

3-> 6

上面的整數 234 經過變換後可能產生出的整數為(包括原數):

234、534、264、564

共 4 種不同的產生數

問題:給出乙個整數 n 和 k 個規則。

求出:經過任意次的變換(0次或多次),能產生出多少個不同整數。

僅要求輸出個數。

234 2

2 53 6

(a) 先用floyd演算法,求出某乙個數字可以到達的目的地(即經過0次或若干次變換的結果)

(b) 高精度運算

但是int(4位元組)的範圍是[-2^31^,2^31^-1],即[-2147483648,2147483647],

用乙個int來表示1個數字太浪費了,可以用1個int來儲存8位數(為了使得乘法不越界),

#include

#include

#include

#define inf 99999

using namespace std;

class bign

vector<

int> data;

void

mult

(int k)

; friend ostream& operator<<

(ostream &out, bign& obj)

;static

int n;};

int bign:

:n=10000000

;void bign:

:mult

(int k)

if(t)

data.

push_back

(t);

}ostream& operator<<

(ostream &out,bign& obj)

return out;

}int

numofdig

(int k)

return rel;

}int

main()

//flody演算法的三重迴圈

for(

int k=

0;k<

10;k++

)for

(int i=

0;i<

10;i++

)for

(int j=

0;j<

10;j++)if

(d[i]

[j]>d[i]

[k]+d[k]

[j])

d[i]

[j]=d[i]

[k]+d[k]

[j];

int flag[10]

=;//用於記錄該數字會變成幾種其他數字

for(

int i=

0;i<

10;i++)if

(0)cout<} cout<<

"*******************"

int i=

0;i<

10;i++

) cout<<<

' ';cout

"*******************"

<} bign rel(1

);for(

int i=

0;ilength()

;i++

) rel.

mult

(flag[n[i]

-'0'])

; cout

}

ACM 藍橋杯練習題

小a的學校有一些小河和一些湖泊,現在把它們統一看成水池,小a手裡有一張學校某處的地圖,這個地圖上僅標識了此處是否是水池,小a想知道這塊地方有多少個水池,現在,任務交給你了,請編寫程式算出該地圖中有幾個水池 第一行輸入乙個整數n,表示共有n組測試資料 每一組資料都是先輸入該地圖的行數m 輸出該地圖中水...

藍橋杯)基礎練習 高精度加法

時間限制 1.0s 記憶體限制 512.0mb 問題描述 輸入兩個整數a和b,輸出這兩個整數的和。a和b都不超過100位。演算法描述 由於a和b都比較大,所以不能直接使用語言中的標準資料型別來儲存。對於這種問題,一般使用陣列來處理。定義乙個陣列a,a 0 用於儲存a的個位,a 1 用於儲存a的十位,...

藍橋杯基礎練習 高精度加法

問題描述 輸入兩個整數a和b,輸出這兩個整數的和。a和b都不超過100位。演算法描述 由於a和b都比較大,所以不能直接使用語言中的標準資料型別來儲存。對於這種問題,一般使用陣列來處理。定義乙個陣列a,a 0 用於儲存a的個位,a 1 用於儲存a的十位,依此類推。同樣可以用乙個陣列b來儲存b。計算c ...