e024: 少年πの超大數運算(1)

e024: 少年πの超大數運算(1)

題目連結:e024: 少年πの超大數運算(1)

題意:

給你兩個數n,m(0<n,m<=100000),求n^m

解法:

C++:

大數
用陣列存數字
一個整數要多存幾位(我存9位)才不會TLE

time: 8.9s
memory used: 784KB
code:
  1. #include<iostream>
  2. #include<iomanip>
  3. using namespace std;
  4. int main(){
  5.     ios::sync_with_stdio(false);
  6.     cin.tie(0);
  7.     long int a,i,b;
  8.     long long int n,m,v,s;
  9.     while(cin>>n>>m&&n&&m){
  10.         long long int x[55560]={0};
  11.         v=0;
  12.         s=1;
  13.         x[0]=1;
  14.         for(a=1;a<=m;a++){
  15.             for(i=0;i<s;i++){
  16.                 x[i]=x[i]*n+v;
  17.                 v=x[i]/1000000000;
  18.                 x[i]=x[i]%1000000000;
  19.                 if(v!=0&&i+1==s)
  20.                 s++;
  21.             }
  22.         }
  23.         for(b=s-1;b>=0;b--){
  24.             if(b!=s-1)
  25.             cout << setfill('0') << setw(9) << x[b];
  26.             else
  27.             cout << x[b];
  28.         }
  29.         cout <<'\n';
  30.     }
  31.  }

Python:

Python已內建大數,直接運算即可

time: 4.7s
memory used: 7.7MB
code:
  1. import sys
  2. while True:
  3.  line=sys.stdin.readline()
  4.  if not line:
  5.   break
  6.  a,b=map(int,line.split())
  7.  if a==0 and b==0:
  8.   break
  9.  print(a**b)
據說快速冪寫法較快,但實測並沒有
time: 4.8s
memory used: 7.1MB
code:
  1. import sys
  2. def power(a,b):
  3.     if b==1:
  4.         return a
  5.     if b&1 == 0:
  6.         temp=power(a, b>>1)
  7.         return temp*temp
  8.     else:
  9.         temp=power(a,b>>1)
  10.         return temp*temp*a
  11.  
  12. for line in sys.stdin:
  13.     nums=line.split(' ')
  14.     a=int(nums[0])
  15.     b=int(nums[1])
  16.     if a==0 and b==0:
  17.         break
  18.     print(power(a,b))

有一個很快的寫法: Decimal模組
time: 78ms
memory used: 8MB
code:
  1. import sys
  2. from decimal import *
  3. setcontext(Context(prec=500001,rounding=ROUND_HALF_DOWN))
  4. while True:
  5.  line=sys.stdin.readline()
  6.  a,b=map(Decimal,line.split())
  7.  if a==b==0break
  8.  print(a**b)
本人的分享到此結束
若有更好的想法或建議,請在留言區留言喔

Comments

Popular Posts