您的位置:首页 > 其它

POJ 1001

2013-09-26 23:34 197 查看
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
#define MAX 500

#include <stdio.h>
#include <string.h>

int a[500] , n , poi , t , b[500] , c[500] ;

void format(string s)//转换字符串,同时记录小数点的位置
{
int i , k = 0 ;
size_t len = s.size() ;
for( i = 0 ; i < len ; i++ )
{
if(s[len-1-i]>='0'&&s[len-1-i]<='9')
a[k++] = s[len-1-i]-'0' ;
else if(s[len-1-i]=='.')
poi = i ;
}
}

int main()
{
//char str[20];
string str;
int  i , j , k , flag , num , p ;
while((cin>>str>>t))
{
memset(a,0,sizeof(a)) ;//三个都清零
memset(b,0,sizeof(b)) ;
memset(c,0,sizeof(c)) ;
poi = 0 ;
format(str) ;
for( i = 0 ; i < 6 ; i++ )//把b[]数组作为底数
b[i] = a[i] ;
if(!t)
cout<<1<<endl;
else
{
for( i = 2 ; i <= t ; i++ )
{
for( j = 0 ; j < 500 ; j++ )
{//每次开始高精度前把a[]数组置为c[]数组,然后a[]数组存储中间量
c[j] = a[j] ;
}
memset(a,0,sizeof(a)) ;
for( j = 0 ; j < 6 ; j++ )
{
for( k = 0 ; k < 490 ; k++ )
{
a[k+j]+=c[k]*b[j] ;
}
}
flag = 0 ;
for( j = 0 ; j < 500 ; j++ )
{//得出当前次运算所得结果,统一处理进位
num = a[j]+flag ;
a[j] = num%10 ;
flag = num/10 ;
}
}
p = poi*t ;
for( i = 0 ; i < poi*t ; i++ )//确定是否有结尾的0,及其位置(
{
if(a[i])
{
p = i ;
break ;
}
}
flag = 0 ;
for( i = 499 ; i >= p ; i-- )
{//输出,没啥说的,flag放这更方便
if(i==poi*t-1&&!flag)
{

cout<<"."<<a[i];
flag =1 ;
}
else if(i==poi*t-1&&flag)

cout<<"."<<a[i];
else if((!flag)&&a[i])
{
flag = 1 ;

cout<<a[i];
}
else if(flag)

cout<<a[i];

else if(i==p)

cout<<a[i];

}

cout<<endl;
}
}
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: