64,648
社区成员
发帖
与我相关
我的任务
分享
#include<iostream>
#include<string>
using namespace std;
void set_zero(string& s){ //将string全部置零
for(int i=0;i<s.size();i++)
s[i]='0';
}
string fun(string s,char c){ //多位于一位相乘,结果为正确的反序
string sum;
sum.resize(s.size()+1);
set_zero(sum);
int dan_wei_ji,jin_wei_1=0,jin_wei_2=0,pos=0;
for(int i=s.size()-1;i!=-1;--i,++pos){
dan_wei_ji=(s[i]-48)*(c-48);
sum[pos]=(dan_wei_ji%10+jin_wei_1+jin_wei_2)%10+48;
jin_wei_2=(dan_wei_ji%10+jin_wei_1+jin_wei_2)/10;
jin_wei_1=dan_wei_ji/10;
}
sum[pos]=jin_wei_2+jin_wei_1+48;
return sum;
}
void add(string& sum,string& s,int pos){ //多位相加
int jin_wei=0,temp=0;
for(int j=0;j<s.size();j++,pos++){
temp=(sum[pos]-48)+jin_wei+(s[j]-48);
sum[pos]=temp%10+48;
jin_wei=temp/10;
}
while(true){
if(jin_wei==0)
return ;
else{
temp=(sum[pos]-48)+jin_wei;
sum[pos]=temp%10+48;
jin_wei=temp/10;
}
}
}
string fun(string s1,string s2){ //多位相乘
string sum;
string temp;
sum.resize(s1.size()+s2.size());
temp.resize(s1.size()+1);
set_zero(sum);
set_zero(temp);
for(int i=s2.size()-1,pos=0;i!=-1;--i,++pos){
temp=fun(s1,s2[i]);
add(sum,temp,pos);
}
return sum;
}
string _tream(string s){ //去除整数部分前面的零
int count=0,i;
for(i=0;s[i]=='0';i++)
count++;
if(count==s.size()){
string str="";
return str;
}
if(count==0)
return s;
string str;
str.resize(s.size()-count);
for(int j=0;j<str.size();j++,i++)
str[j]=s[i];
return str;
}
string tream_(string s){//去除小数部分后面的零
int count=0,i;
for(i=s.size()-1;s[i]=='0';--i)
count++;
if(count==0)
return s;
if(count==s.size()){
string s="";
return s;
}
string str;
str.resize(s.size()-count);
for(int j=str.size()-1;j>-1;j--,--i)
str[j]=s[i];
return str;
}
string reverse(string& s){//将string反序
char c;
for(int i=0;i<s.size()/2;i++){
c=s[i];
s[i]=s[s.size()-i-1];
s[s.size()-i-1]=c;
}
return s;
}
int main(void){
string s,s1,s2,s1_t;
int n;
while(cin>>s>>n){
int i,j,count=0;
for(i=0;s[i]!='.';i++)
count++;
s1.resize(s.size()-1);
for(i=0,j=0;i<s.size();i++)
if(s[i]!='.'){
s1[j]=s[i];
j++;
}
s1_t=s1;
for(i=1;i<n;i++)
s1_t=reverse(fun(s1_t,s1));//循环算出去除小数点的n次方
int len=(s.size()-count-1)*n;
s1.resize(s1_t.size()-len);//保留整数部分
s2.resize(len); //保留小数部分
for(i=0;i<s1_t.size();i++){
if(i < s1_t.size()-len)
s1[i]=s1_t[i];
else{
s2[i-s1_t.size()+len]=s1_t[i];
}
}
cout<<_tream(s1)<<"."<<tream_(s2)<<endl;//输出结果
}
return 0;
}