| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
1001实在整不出来啦 救命啊~~~~~~~~~~~~~~~~ 所有能搜到的数据都过 就是WA 大家帮看下什么毛病#include<iostream>
#include<stdlib.h>
#include<string>
#include<stdio.h>
#include<sstream>
#include<math.h>
#include<queue>
#include<ctime>
using namespace std;
string multiply(string a, int b, int c);
string add(string a, string b);
string multiplys(string a, string b);
class Inputs
{
int power;
string number;
int point;
public:
Inputs(string number, int power);
int getpower();
string getnumber();
int getpoint();
};
Inputs::Inputs(string num, int pow)
{
int i = 0;
int flag = 0;
int count0 = 0;
while(1)
{
if(num[num.size()-1-i] == '.')
break;
if((num.size()-1-i) == 0)
{
i = 0;
break;
}
i++;
}
point = i;
power = pow;
i = 0;
while(1)
{
if(num[num.size()-1-i] == '0')
count0++;
else break;
i++;
}
if( point > count0)
{
for(i = 0; i < (num.size()-count0); i++)
{
if(flag == 0)
{
if(num[i] != '.' && num[i] != '0')
{
number = number + num[i];
flag = 1;
}
}
else if(num[i] != '.')
number = number + num[i];
}
point = point - count0;
}
else
{
for(i = 0; i < num.size()-point; i++)
{
if(flag == 0)
{
if(num[i] != '.' && num[i] != '0')
{
number = number + num[i];
flag = 1;
}
}
else if(num[i] != '.')
number = number + num[i];
}
point = 0;
}
}
int Inputs::getpower()
{
return power;
}
string Inputs::getnumber()
{
return number;
}
int Inputs::getpoint()
{
return point;
}
string getAnswer(Inputs input);
int main()
{
string s1,result;
int s2;
//stringstream ss;
while(cin >> s1 >> s2)
{
result = "";
Inputs input(s1,s2);
result = getAnswer(input);
cout << result << endl;
}
return 0;
}
string getAnswer(Inputs input)
{
string tmp,result;
int count,point;
count = input.getpower();
tmp = input.getnumber();
if(tmp != "" && count != 0)
{
for(int i = 0; i< (count-1); i++)
tmp = multiplys(tmp,input.getnumber());
point = input.getpoint();
count = count * point;
if(tmp.size()>count)
{
for(int i = 0; i< (tmp.size()-count); i++)
result = result + tmp[i];
if(count != 0)
result = result + '.';
for(int i = (tmp.size()-count); i<tmp.size(); i++)
result = result + tmp[i];
}
else
{
result = '.';
for(int i = 0; i < (count - tmp.size()); i++)
result = result + '0';
result = result + tmp;
//if(result[0] == '.' && result[1] == '\0');
//result = "";
}
}
else if(count == 0)
result = "1";
else result = "0";
//cout << "input.number is " << input.getnumber() << endl;
return result;
}
string multiplys(string a, string b)
{
string s3,result="";
stringstream ss;
queue<string> results;
for(int i=0;i<b.size();i++)
{
int tmp;
ss.clear();
ss << b[i];
ss >> tmp;
/*if(!ss.eof())
{
//perror("sstream");
exit(EXIT_FAILURE);
}*/
results.push(multiply(a,tmp,(b.size()-i-1)));
}
while(!results.empty())
{
s3 = results.front();
result = add(result,s3);
//cout << "the queue head is " << result << endl;
results.pop();
}
//cout << "the multiplicates add the multiplier is " << add(s1,s2) << endl;
return result;
}
string add(string a, string b) //this function is used to add b to a; the lenth of a and b may be different
{
string result="";
string strtmp="";
stringstream ss,ss1,ss2;
int carry = 0;
int atmp,btmp,tmp;
int flag = a.size()>b.size()?a.size():b.size();
for(int i = 0; i< flag; i++)
{
if((a.size()-1-i)>=0)
{
ss1.clear();
ss1 << a[a.size()-1-i];
ss1 >> atmp;
}
else atmp = 0;
if((b.size()-1-i)>=0)
{
ss2.clear();
ss2 << b[b.size()-1-i];
ss2 >> btmp;
}
else btmp = 0;
tmp = (atmp+btmp+carry)%10;
carry = floor((atmp+btmp+carry)/10);
ss.clear();
ss << tmp;
ss >> strtmp;
result = strtmp + result;
}
if(carry!=0)
{
ss.clear();
ss << carry;
ss >> strtmp;
result = strtmp + result;
}
return result;
}
string multiply(string a,int b,int c) //a is the multiplicated b is the multiplier c is the offset
{
string result="";
string strtmp="";
int carry=0;
int tmp;
stringstream ss,ss1;
for(int i=(a.size()-1); i >= 0;i--)
{
ss1.clear();
ss1 << a[i];
ss1 >> tmp;
ss.clear();
ss << (tmp*b+carry)%10;
ss >> strtmp;
carry = floor((tmp*b+carry)/10);
//cout << "carry =" << carry << endl;
result = strtmp + result;
}
if(carry!=0)
{
ss.clear();
ss << carry;
ss >> strtmp;
result = strtmp + result;
}
for(int i = 0; i<c;i++)
{
result=result+"0";
}
return result;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator