POJ 1001解题报告

 

刚开始做ACM,水平很烂,这道题也是看了网上的解题报告自己照猫画虎写出来的

原文见http://blog.csdn.net/night_blue/archive/2008/09/20/2956723.aspx

这里只是多加了点注释,希望对别的同学有所帮助,对自己也是个总结。

POJ的测试程序只要有一个不对便是Wrong Answer,所以细节都得注意到。需要注意的情况是结果为整数时不能输出小数点“.”,另外0.00 的 0 次方也是我之前没有注意到的。

总体而言,这道题是将字符串转化为整数,然后做大整数乘法。

大整数乘法每五位一组,最后是加入小数点。

#include <iostream>

#include <iomanip>

#include <sstream>

#include <string>

#include <vector>

#include <cmath>

using namespace std;

 

//这部分是将字符串转化为整数,同时记录小数点的位置

//整数的值记录在val中,小数点的位置为返回值

int stringToInt(const string &s,int &val)

{

bool flag=true;//判断小数点前后的标志

string pre,suf;//分别记录小数点之前和之后的部分

for(int ix=0;ix!=s.size();++ix)

{

if(s[ix]=='.')//如果碰到了小数点

{

flag=false;

continue;

}

if(flag)

pre.push_back(s[ix]);//小数点之前的部分

else

suf.push_back(s[ix]);//小数点之后的部分

}

//下面是除去前后的零

while(pre.size()&&pre.find("0")==0)

{

pre=pre.substr(1,pre.size()-1);

}

while(suf.size()&&suf.rfind("0")==suf.size()-1)

{

suf=suf.substr(0,suf.size()-1);

}

int len=suf.size();//记录小数点的位置

val=atoi(suf.c_str())+atoi(pre.c_str())*(int)pow(10.0,len);//将字符串转化为整数

return len;//返回小数点的位置

}

 

int main()

{

string s;

int n,d;

double dval;

vector<double> dvec;//虽然做的是大整数乘法,但用浮点数记录结果,因为两个五位的整数相乘结果可能会超过int范围

while(cin>>s>>n)

{

dvec.clear();

d=0;

int len=stringToInt(s,d);

dvec.push_back(d);

for(int ix=0;ix<n-1;++ix)//连乘求幂

{

int yushu=0;//进位

for(int index=0;index!=dvec.size();++index)//每一部分都处理

{

//先与整数相乘,再加上进位,然后记录小于100000的部分,其余高位作为进位

dvec[index]*=d;

dvec[index]+=yushu;

yushu=dvec[index]/100000;

dvec[index]-=(double)yushu*100000;//注意这里的转化,否则可能会超出int范围导致出错

}

if(yushu!=0)//如果最高位有进位,则增加一部分

dvec.push_back(yushu);

}

//注释部分是为了检验整数计算结果,便于调试

//for(int index=dvec.size()-1;index>=0;--index)

//{

//cout<<dvec[index]<<endl;

//}

//用字符串读写对结果进行处理,加入小数点

ostringstream os;

string tempstr;

os<<dvec[dvec.size()-1];//高位在后面,所以从后往前处理

string output;

output=os.str();

for(int index=dvec.size()-2;index>=0;--index)

{

os.str("");//注意与os.clear()的区别

os<<dvec[index];

tempstr=os.str();

//如果不到5位,则在前面补零

if(tempstr.size()<5)

tempstr.insert(0,5-tempstr.size(),'0');

output+=tempstr;

}

if(len==0)//整数的情况要

cout<<output<<endl;

else if(n*len>=output.size())

cout<<"."<<setw(n*len)<<setfill('0')<<output<<endl;

else

{

output.insert(output.size()-n*len,".");

cout<<output<<endl;

}

}

return EXIT_SUCCESS;

}

 

你可能感兴趣的:(String,测试,output)