POJ1000题解法


/*
输入格式:
95.123 12
0.4321 20
5.1234 15
6.7592  9
98.999 10
1.0100 12

输出格式:
548815620517731830194541.899025343415715973535967221869852721
.00000005148554641076956121994511276767154838481760200726351203835429763013462401
43992025569.928573701266488041146654993318703707511666295476720493953024
29448126.764121021618164430206909037173276672
90429072743629540498.107596019456651774561044010001
1.126825030131969720661201
*/

#include<iostream>
using namespace std;
#define max 200
int main()
{
	int a[max]={0},n,e,j,k,q,set=0;
	//base的n次方
	char c[20];
	//接收输入字符串
	while(cin>>c>>n)
	{
		int len=strlen(c),base=0,i,record=0;
		//将实数转换为整数 并记录小数点的位置
		for(i=0;i<len;i++)
		{
			if(c[i]=='.')
			{
				//record为小数的位数
				record=len-i-1;
				continue;
			}
			base=base*10+c[i]-'0';
		}
		//去掉后面多余的0 如95.120
		if(record)
		{	
			for(k=len-1;c[k]=='0';k--,record--)
			{
				base/=10;
			}
		}

		//record为总的小数位
		record = record * n;
		
		//从低位到高位复制到数组
		for(q=base,i=0;i<max;i++,q/=10)
		{
			a[i]=q%10;
			//把base复制到数组a
		}
		
		//将数据拆分成单个位数据进行计算
		for(j=0;j<n-1;j++)
		{
			for(i=0;i<max;i++)
			{
				a[i]=a[i]*base+set;
				//计算进位 10的倍数为进位数据,余数为本位数据
				set=a[i]/10;
				a[i]=a[i]%10;
			}
		}
		
		//计算,结果保存在数组a中
		for(i=max-1;i>=0;i--)
		{
			//i是首个不为0的
			if(a[i]!=0)
			{
				break;
			}
		}
		if(record>i)//无整数部分
		{
			cout<<".";
			for(e=record-1;e>=0;e--)
			{
				cout<<a[e];
			}
		}
		else//有整数部分
		{
			for(;i>record-1;i--)
			{
				cout<<a[i];
			}
			if(i>=0)
			{
				cout<<".";
			}
			for(;i>=0;i--)
			{
				cout<<a[i];
			}
		}
		cout<<endl;
	}
	return 0;
}


你可能感兴趣的:(poj,编程竞赛)