在C中,一個整數(int)的範圍介於-2147483648~2147483647之間,
如果想做超出這個範圍的運算,可能會發生和預期不同的結果~
因此,有一種東西叫做大數運算,
概念是如果現在有一個整數,有100位數,那就用100個int去個別存這100位每一位的數字是多少,再用直式的方式做運算。
假設我們要計算111+19:
先寫成這樣,將兩個數字的最低位對齊:
1 1 1
+ 1 9
----------
然後從最低位開始一位一位做加法,
1
1 1 1
+ 1 9
----------
0
發現1+9=10需要進位,就將1加倒下一位~
1
1 1 1
+ 1 9
----------
3 0
然後繼續做加法,直到加完每個位數~
1 1 1
+ 1 9
----------
1 3 0
我們習慣用array來存每個位數,假設用一個int來存一個位數,
假設我們用一個int array來存19,並且用a[0]存最低位,
那麼19可以存成:
a[1]=1
a[0]=9
假設我們用另一個array b 來存111這個數字,並拿array c 來儲存結果,
那麼計算111+19的時候,我們可以這樣寫:
for(i=0;i<4;i++){ // 三位數+二位數最高可達4位數
c[i]+=a[i]+b[i]; // 做第i位數的加法
c[i+1]+=c[i]/10; // 進位後,下一位數字要加多少
c[i]%=10; // 進位後,這一位數字剩下多少
}
如果我們要計算111x19:
for(i=0;i<2;i++){
for(j=0;j<3;j++){
c[i+j]+=a[i]*b[j]; // 做乘法
}
}
// 然後進位
for(i=0;i<5;i++){ // 三位數乘二位數最高會變成5位數
c[i+1]+=c[i]/10;
c[i]%=10;
}
這題的題目是,給你兩個整數 p 和 r ,請你計算 p 開 r 次根號的結果。
你可能記得,或許你忘記,在那不知道是國中還是高中的時候,大部分考試不能帶工程用計算機,
可是題目會叫你開根號,
這時候,有一種方法,叫做直式開方法,
這個方法非常深奧難以用二次元的圖片或文字說明,讓我們直接看一段影片~
Hint:
Maybe you can use something in or ?
關於各種型別的範圍,可以參考這裡。
大數運算還有很多其他的細節,你可以上網搜尋更多資料或是偷看演算法筆記。
第一行為T(0<=T<=25),代表有T組測試資料。
接著有T行,每一行有兩個整數 p ( 0 <= p < 10^101 )和 r ( r = 2, 4, 8, 16, 32 中任何一個數)。
根據input每行的p和r輸出p開r次根號後的結果k ( 0 <= k <= 10^9 ),k可能會有小數,不過你只需要輸出k的整數部分就可以了~