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 本題考察的是高精度計算...