POJ1001解题报告

乍一看就是大数乘法问题,只需要维护3个整型数组分别为乘数,被乘数,积。要通过可不是那么容易。需要考虑的问题有:

1.大数的幂每次需要记录前一次运算的结果并将结果保存乘数里面,但积数组需要清0。

2.笔者的解题思路是先计算整数的大数乘幂,但在此之前记录小数点的位置,最后输出的时候准确定位小数点即可(这点非常麻烦)。

3.题目要求清除前后导0,所以对于10.000 1     10.000 2这样的数据需要注意。

4.对于纯小数的幂注意输出格式。

5.任何数的1次方为其本身,题目没有考虑数的0次方为1。

代码如下:

<pre name="code" class="cpp">/*
arthur:	Near_zh
data:	2014/7/30
note:	poj-1001
*/
#include <iostream>
#include <string>
using namespace std;
int result[99999], a[99999], b[99999];
int main()
{
	string str;
	int n;

	int i=0;
	int j;
	int lena;
	int lenb;
	int dot;//小数点
	int num;
	int count;
	while(cin>>str>>n)
	{	
		if(n>1)
		{
			lenb=lena=5;
			memset(result, 0, sizeof(result));
			memset(a,0,sizeof(a));
			memset(b,0,sizeof(b));
			num=n;
			n--;
		
			count=0;
		
			for(i=lena,j=1;i>=0;i--)//将字符型数转换成数字,低位存在数组的低位 
			{	
				count++;
				if(str[i]=='.')
				{
					dot=i;
					continue;
				}
				a[j]=str[i]-'0';
				b[j]=a[j];
				j++;
			}
			while(n--)
			{
				for(i=1;i<=lena;i++)
					for(j=1;j<=lenb;j++)
					{
						result[i+j-1]+=b[j]*a[i];
						if (result[i+j-1]>9)   
						{  
							result[i+j] += result[i+j-1] / 10;  
							result[i+j-1] %= 10;  
						}  
					}
					if (result[lena+lenb-1]>9)   
					{  
						result[lena+lenb] += result[lena+lenb-1] / 10;  
						result[lena+lenb-1] %= 10;  
					}  

				lena = lena + lenb;  
				for (i=1; i<=lena; i++) 
					a[i] = result[i];  
				if(n!=0)
				{
					for(i=1;i<=lena;i++)
						result[i]=0;//对结果初始化
				}				
			}
			for(i=lena;i>=0;i--)
			{
				if(result[i]!=0)
					break;
			}
			for(j=1;j<=lena-dot*num+1;j++)
			{
				if(result[j]!=0)
					break;
			}
		
			int flag1=i;
			int flag2=j;
			dot=5-dot;
			dot=dot*num;
			if (flag1<dot) flag1 = dot;
			if (flag2>dot) flag2 = dot + 1;
			for(i=flag1;i>=flag2;i--)
			{
				if(i==dot)
					cout<<".";
				cout<<result[i];
			}
			
		}
			else
			{
				for(i=str.size()-1;i>=0;i--)
				{
					if(str[i]!='0')
						break;
				}
				int k=i;
				for(i=0;i<=k;i++)
				{
					if(str[i]=='.')
						continue;
					cout<<str[i];
				}
			}
			cout<<endl;
	}
	return 0;
}

 

    原文作者:大整数乘法问题
    原文地址: https://blog.csdn.net/zhangxiao93/article/details/38317647
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞