POJ2109 高精度(含大數開方) 二分

2021-07-15 04:32:56 字數 2794 閱讀 8138

1 高精度(含大數開方)+二分

乙個技巧和三點注意:

技巧:假設k^n=p;(k的n次方),那麼p的位數/n得到的是k的位數!例如:n=7,p=4357186184021382204544,p的位數為22,用22/7的結果向上取整,得到4,即為k的位數,也就是說k的取值範圍是1000~9999。(引自code_pang)不利用這一點,高精度+直接二分,也會超時。用這乙個技巧合理縮小二分的範圍。

注意:看code的main中的注釋。

(二分思想不熟練,因為二分演算法很高效,所以一定要暴力點直接確定left和right,然後根據情況,優化也是將left變大和right變小,而不會是其他奇怪的情況。另外,注意left=mid+1,right=mid-1,這很重要)

#include #include #include #include #include #include using namespace std;

const int numlen = 105; // 位數

int max(int a, int b)

struct bign

bign(int num)

bign(const char *num)

bign operator = (const int num)

bign operator = (const char *num)

void deal()

bign operator + (const bign &a) const

return ret;

}bign operator - (const bign &a) const

ret.s[ret.len++] = now;

}ret.deal();

return ret;

}bign operator * (const bign &a) const

for(int i = 0;i < ret.len; i++)

ret.deal();

return ret;

}//乘以小數,直接乘快點

bign operator * (const int num)

while(bb)

ret.deal();

return ret;

}bign operator / (const bign &a) const

}ret.deal();

return ret;

}bign operator % (const bign &a) const

bign operator += (const bign &a)

bign operator -= (const bign &a)

bign operator *= (const bign &a)

bign operator /= (const bign &a)

bign operator %= (const bign &a)

bool operator < (const bign &a) const

bool operator > (const bign &a) const

bool operator <= (const bign &a) const

bool operator >= (const bign &a) const

bool operator == (const bign &a) const

bool operator != (const bign &a) const

string str() const

};istream& operator >> (istream &in, bign &x)

ostream& operator << (ostream &out, const bign &x)

// 大數開平方

bign sqrt(bign x)

else

a[top++] = x.s[i] + x.s[i+1]*10;

}bign ret = (int)sqrt((double)a[top-1]);

int xx = (int)sqrt((double)a[top-1]);

bign pre = a[top-1] - xx*xx;

bign cc;

for(int i = top-2;i >= 0; i--) }}

return ret;

}int main()

else if(len%a!=0)

bign sum=1;

bign mid;

bign left=pow(10.0,(int)pos-1);

bign right=pow(10.0,(int)pos);

/*在math.h中,函式pow有三種過載形式:

long double pow(long double,int)

float pow(float,int)

double pow(double,int)

對於所給的引數int,int,如果編譯器無法判斷應該匹配哪個函式,因此報編譯錯誤

可以將**改為pow(10.0,(int)i)

*/while(left<=right)

if(sum==b)

if(left>right)

}//然而oj給的資料並不是像題目中所說k一定是整數,所以最後取滿足k^n=p的不大於k的最大的整數。

//另外,還要注意最後判斷一步時,也要判斷sum>b是否會出現這種情況,如果不判斷提交wa,判斷就ac了。但為什麼還要加sum>b的判斷?!不理解。

if(!flag)

if(sum>b)

cout<

C C 高精度運算 大整數運算 詳解(含壓位)

1.1 高精度加法 高精度運算的基本運算就是加和減。和算數的加減規則一樣,模擬豎式計算,考慮錯位運算與進製處理。下面是我老師給的 目前比網上其他的 要精簡和巧妙。include include int main b 202 scanf s s a,b int alen strlen a blen s...

高精度 大整數減法

求兩個大的正整數相減的差。共2行,第1行是被減數a,第2行是減數b a b 每個大整數不超過200位,不會有多餘的前導零。一行,即所求的差。本題考察的是高精度減法。我們可以模擬減法的豎式計算過程從而實現高精度的計算。和高精度加法一樣,也是使用字串來進行輸入 儲存。豎式計算時,也是低位對齊,從低位向高...

高精度 大整數加法

求兩個不超過200位的非負整數的和。有兩行,每行是乙個不超過200位的非負整數,可能有多餘的前導0。一行,即相加後的結果。結果裡不能有多餘的前導0,即如果結果是342,那麼就不能輸出為0342。22222222222222222222 33333333333333333333 本題考察的是高精度計算...