51Nod 1873 初中的算术
Noder现在上初三了,正在开始复习中考。他每天要计算型如 (a× a× a× ⋯× a)n个a 的式子。 其中 0.0<a<99.999,0<n<26 。
虽然Noder会计算,但是老是算错,现在他想要你来写一个程序输出正确的结果,以便他核对。
Input
单组测试数据。 第一行有一个实数a和一个整数n,中间用空格分开。 0.0 < a < 99.999,a总是占6位(a长度<=6),0<n<26。
Output
输出一个实数表示结果,不要输出前导0,后面多余的0也不要输出,如果是整数不要输出小数点。
Input示例
样例输入1 0.4321 20 样例输入2 1.0100 12
Output示例
样例输出1 .00000005148554641076956121994511276767154838481760200726351203835429763013462401 样例输出2 1.126825030131969720661201
高精度模拟,只是后面的小数保留有点麻烦
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <vector> #include <queue> #include <stack> #include <cstdlib> #include <iomanip> #include <cmath> #include <cassert> #include <ctime> #include <map> #include <set> using namespace std; #pragma comment(linker, "/stck:1024000000,1024000000") #define lowbit(x) (x&(-x)) #define max(x,y) (x>=y?x:y) #define min(x,y) (x<=y?x:y) #define MAX 100000000000000000 #define MOD 1000000007 #define pi acos(-1.0) #define ei exp(1) #define PI 3.1415926535897932384626433832 #define ios() ios::sync_with_stdio(true) #define INF 0x3f3f3f3f #define mem(a) ((a,0,sizeof(a))) typedef long long ll; string ss,s=""; int pos,n; string multiply(string a,string b) { string res=""; int num[1006]; memset(num,0,sizeof(num)); int len_a=a.size(),len_b=b.size(); for(int i=0;i<len_a;i++) for(int j=0;j<len_b;j++) num[i+j]+=(a[i]-'0')*(b[j]-'0'); for(int i=1;i<=len_a+len_b;i++) { num[i]+=num[i-1]/10; num[i-1]%=10; } int i; for(i=len_a+len_b;i>=0;i--) if(num[i]) break; for(int j=0;j<=i;j++) res+=num[j]+'0'; return res; } void solve(string s,int n) { reverse(s.begin(),s.end()); string res="1"; while(n) { if(n&1) res=multiply(res,s); n>>=1; s=multiply(s,s); } int len=res.size(); for(int i=len;i<=1003;i++) res+='0'; int i,j; for(i=1000;i>=pos;i--) if(res[i]!='0') break; for(j=0;j<pos;j++) if(res[j]!='0') break; if(j>i) printf("0\n"); else { for(int l=i;l>=max(0,pos);l--) printf("%c",res[l]); if(j<pos && res[j]!='0') printf("."); for(int r=pos-1;r>=max(j,0);r--) printf("%c",res[r]); printf("\n"); } } int main() { cin>>ss>>n; pos=ss.find('.'); if(pos!=-1) {pos=ss.size()-pos-1;pos*=n;} else pos=0; int k=ss.size(); for(int i=0;i<k;i++) if(ss[i]!='.') s+=ss[i]; solve(s,n); return 0; }