#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什么的。