POJ 1001

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <iomanip>

using namespace std;
string Multiply(string,string);
int Change(string&);

int main(){

	string a,c="1";
	int b;
	while(cin>>a>>b){
		c = "1";
		for(int i = 1;i <= b;i++)
			c = Multiply(a,c);
		cout<<c<<endl;

	}

}

string Multiply(string a, string b){
	int xa, xb;

	xa = Change(a);
	xb = Change(b);

	//cout<<"xa:"<<xa<<endl;
	//cout<<"xb:"<<xb<<endl;

	int *c = (int *)malloc(sizeof(int) * (a.length() + b.length()));

	for(int i = 0;i < a.length() + b.length();i++)
		c[i] = 0;



	for(int i = 0;i <= a.length() - 1;i++)
		for(int j = 0;j <= b.length() -1;j++)
			c[i + j + 1] += (a.at(i) - '0') * (b.at(j) - '0');

	for(int i = a.length() + b.length() - 1; i > 0; i--)
		if(c[i] >= 10){
			c[i-1] += c[i] / 10;
			c[i] = c[i] % 10;
		}
	
	int i = 0;
	while(c[i] == 0)
		i++;

	char * tmps = (char *)malloc(sizeof(char) * (a.length() + b.length() - 1));

	int k;
	for(k = 0;i <= a.length() + b.length() - 1;i++,k++)
		tmps[k] = c[i] + '0';

	tmps[k] = '\0';
	
	string s(tmps);

	if((xa+xb) != 0){
		if((xa + xb) <= k )						//加小数点
			s.insert(k-xa-xb,".");
		else{		
			for(int i = xa+xb; i>k; i--)
				s.insert(0,"0");
			s.insert(0,".");
		}
	}
	return s;
}






int Change(string &a){
	int i = 0;
	int jud = 1;
	int xa = 0;
	int isint = 1;

	for(i = 0;i < a.length();i++)
		if(a.at(i) == '.')
			isint = 0;

	i = 0;
	while(a.at(i) == '0')                         //去除前面的0
		i++;
	string tmp(a,i,a.length());
	a = tmp;
	
	if(isint == 0 ){
		for(i = a.length() - 1; i >= 0; i--)               //去除后面的0
			if(a.at(i) == '0' && jud == 1)
				a.erase(i);
			else 
				jud = 0;
	}
	if(a.at(a.length() - 1) == '.'){                     //小数点后面没有,去掉小数点
		a.erase(a.length() - 1);
		isint = 1;
	}
	if(a.empty())										//对0的特殊处理		
		a = "0";

	jud = 1;

	if(a.at(0) == '.'){
		string tmp(a,1,a.length());
		a = tmp;
		xa = a.length();
	}
	else if(isint == 0){
		for(i = 0;i < a.length() - 1;i++){
			if(a.at(i) == '.'){
				jud = 0;
				xa = a.length() - i - 1;
				a.at(i) = a.at(i+1);
			}
			if(jud == 0 )
				a.at(i) = a.at(i+1);
		}
		a.erase(i) ;
	}


	i = 0;
	while(a.at(i) == '0' && a.length() > 1)                         //去除前面的0
		i++;
	a.assign(a,i,a.length() - i);

	return xa;
}

	





一直想练习一下POJ,苦于没有时间,放假了终于可以练习一下了,从1000开始,选了1001,然后就跪了一天了。。。。。。

这个题要涉及到大数乘法,核心算法是multiply里面的部分:

for(int i = 0;i <= a.length() - 1;i++)
		for(int j = 0;j <= b.length() -1;j++)
			c[i + j + 1] += (a.at(i) - '0') * (b.at(j) - '0');

	for(int i = a.length() + b.length() - 1; i > 0; i--)
		if(c[i] >= 10){
			c[i-1] += c[i] / 10;
			c[i] = c[i] % 10;
		}
这个算法还是比较好理解,不过这个题的其他输入输出处理部分就太让人恶心了。

算法给的是大整数的乘法,而本题处理的是小数。思路就是:把小数转换成整数,记住小数的位数,相乘后再补上小数点。


1.首先做一次输入处理,要求把:

000.05 --> .05

0032 --> 32

5.00 -->  5

5.8900-->5.89

0.00 --> 0

也就是说:

1.去掉前面无意义的0

2.去掉后面无意义的0,如果需要,去掉小数点。

3.对于0要特别处理。


2.再做一次处理,主要是把小数变成整数,并且记住小数的个数:

.5 --> 5

3.534 --> 3534

3 -->3

3.利用算法计算。

4. 加小数点,先判定是否有小数点,再判定小数点的位数是不是比现在数字的位数大,找准位置放置小数点。




感想: 1.本题在没有分析透彻的情况下就随便下手,导致先前编的那个,体系上就有问题,补起来十分复杂,还是需要分析好题目,有了一定思路的情况下才可以动手。

2.对于小数和整数的处理,本题应该是有代表性的,今后做题也要注意本题里面的一些数字的特殊情况,前面0后面0什么的。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值