poj 1001

没有做最后的整理了、、、、
#include "stdio.h"
#include "string.h"

struct Bignum{
	int s[3000];  //数组
	int len;  //长度
	int point;    //小数点位数
	Bignum()
	{
		len = 1;
		point = 0;
		memset(s, 0, sizeof(s));
	}

	Bignum operator = (const char* num)
	{
		len = strlen(num);
		int flag = 0;
		int j;
		point = 0;
		for(int i=0,j=len-1; j>=0; j--)
		{
			if(num[j] !=  '.')
			{
				s[i++] = num[j]-'0';
				if(flag==0)
				{
					point++;
				}
			} else {
				flag = 1;
			}
		}
		if(flag)
		{
			len--;
		}
		return *this;
	}

	Bignum operator * (const Bignum& b) const
	{
		Bignum c;
		c.point = point + b.point;
		int i,j;
		for(i=0; i<len; i++)
		{
			for(j=0; j<b.len; j++)
			{
				c.s[i+j] = c.s[i+j] + s[i]*b.s[j];
			}
		}
		int g;
		for(c.len=0,g=0; g!=0 || c.len<(len+b.len); c.len++)
		{
			c.s[c.len] = c.s[c.len] + g;
			g = c.s[c.len]/10;
			c.s[c.len] = c.s[c.len]%10;
		}
		c.clear();
		return c;
	}

	void clear()
	{
		/**
		* 把数字前面和后面的0去掉
		*/
		//printf("(1)len:%d\n(1)point:%d\n", len, point);
		int old_len=len, old_point=point, i;
		len = 0;
		//去掉小数点后面的零
		for(i=0; i<old_len && i<old_point; i++)
		{
			if(s[i]!=0) {
				break;
			}
			point--;
		} //for i
		for(; i<old_len; i++) {
			s[len++] = s[i];
		}  //for

		//printf("len:%d\npoint:%d\n", len, point);

		//去掉整数前面零
		for(; len>0; len--)
		{
			if(s[len-1]!=0)
			{
				break;
			}
		} //for
	}

	void print()
	{
		clear();
		if(point>=len)
		{
			printf(".");
			while(point>len) {
				printf("0");
				point--;
			}
		} //if
		for(int i=len-1; i>=0; i--)
		{
			printf("%d", s[i]);
			if(i==point && i!=0)
			{
				printf(".");
			}
		} //for
		printf("\n");
	}
};


int main()
{
	freopen("D:\\in.txt", "r", stdin);
	char a[100];
	int b;
	while(scanf("%s%d", a, &b)==2) {
		//printf("b:%d\n", b);
		Bignum c,d;
		c = a;
		d = a;
		c.clear();
		d.clear();
		//d.print();
	
		for(int i=1; i<b; i++)
		{
			d = d * c;
		}
		d.print();
	}
	return 0;
}



思路:

1、把数字存储在数字数组中。

2、主要是在小数点的处理上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值