poj1001Exponentiation解题报告
2012-08-14 14:38
323 查看
思路:
(1)将输入的字符串转化为整数,并记下小数点的位置;
(2)将转化所得整数再次转化为字符串,进行大数相乘;
(3)首先判断所得结果是否为零,若不为零,将小数点插入到结果字符串的合适位置,进行结果格式化;
(4)结果输出。
下面是自己摸索着写的代码,供大家参考
注释的一些语句是自己在调试过程中查看中间结果所用
提供一些测试用例:
100.00 1
.23459 1
1.0001 3
00.100 1
00.010 1
00.001 1
001.00 1
01.000 1
000.00 1
0.0000 1
00.000 1
(1)将输入的字符串转化为整数,并记下小数点的位置;
(2)将转化所得整数再次转化为字符串,进行大数相乘;
(3)首先判断所得结果是否为零,若不为零,将小数点插入到结果字符串的合适位置,进行结果格式化;
(4)结果输出。
下面是自己摸索着写的代码,供大家参考
#include<iostream> #include<string> #include<sstream> using namespace std; int loc; //记录小数点位置,作为全局变量 //将字符串转化为整数,并记录小数点位置,返回值为字符串的整数值 int StringToInt(const string str); //大数相乘,返回值为相乘结果 string Muling(string str1,string str2); int count(string str); int main() { //freopen("in.txt","r",stdin); string str; int n; while(cin>>str>>n) { /*cout<<"str="<<str<<endl; cout<<"n="<<n<<endl;*/ loc=0; int r=StringToInt(str); //cout<<r<<endl; //将r转化为string类型 string str1; stringstream ss; ss<<r; ss>>str1; string str2(str1); //cout<<"str1="<<str1<<endl; //cout<<"str2="<<str2<<endl; //多次相乘 for(int i=0;i<n-1;i++) { str1=Muling(str1,str2); } if(str1=="0") { cout<<0<<endl; } /*str1=Muling(str1,str2); cout<<str1<<endl;*/ //结果格式化 else { loc*=n; if(str1.length()<loc) { cout<<"."; for(int i=loc;i>str1.length();i--) { cout<<0; } for(int i=0;i<str1.length();++i) { cout<<str1[i]; } cout<<endl; } else { loc=str1.length()-loc; //将小数点插入str1的合适位置 string::iterator it=str1.begin()+loc; str1.insert(it,'.'); //对小数点后全为零的处理 for(string::iterator iter=str1.end()-1;iter!=str1.begin();iter--) { if('0'==*iter) { str1.erase(iter); } else { if('.'==*iter) { str1.erase(iter); } break; } } //输出结果 for(int i=0;i<str1.length();++i) { cout<<str1[i]; } cout<<endl; } } } return 0; } int StringToInt(string str) { int num=0; int len=str.length(); //获取字符串的长度 int i=1; for(string::iterator it=str.begin();it!=str.end();++it) { char ch=*it; //cout<<ch<<endl; if(ch=='.') { loc=len-i; //cout<<"loc="<<loc<<endl; } else { int temp=ch-'0'; num*=10; num+=temp; ++i; } } return num; } string Muling(string str1,string str2) { string result(str1.length()+str2.length(),'0'); for(int len2=str2.length()-1;len2>=0;len2--) { if(str2[len2]) { for(int len1=str1.length()-1,len=len2+str1.length();len1>=0;len1--,len--) { int temp=(str1[len1]-'0')*(str2[len2]-'0'); result[len-1]=char(result[len-1]+(result[len]-'0'+temp)/10); result[len]=char((result[len]-'0'+temp)%10+'0'); } } } if(count(result)==result.length()) return "0"; return result.substr(result.find_first_not_of('0')); } int count(string str) { int count=0; for(int i=0;i<str.length();++i) { if(str[i]=='0') count++; } return count; }
注释的一些语句是自己在调试过程中查看中间结果所用
提供一些测试用例:
100.00 1
.23459 1
1.0001 3
00.100 1
00.010 1
00.001 1
001.00 1
01.000 1
000.00 1
0.0000 1
00.000 1
相关文章推荐
- POJ-3278 Catch That Cow 解题报告
- POJ-1426 Find The Multiple 解题报告
- POJ 2739(连续素数和) 解题报告
- POJ 1838 解题报告
- POJ 2248解题报告
- POJ2513解题报告
- POJ-1988-Cube Stacking 解题报告
- POJ 1009 Edge Detection 解题报告 JAVA
- POJ3619解题报告
- 【第一次写解题报告,,激动】POJ 1125【弗洛伊德算法-floyd算法】
- POJ-3414 Pots 解题报告
- POJ3602解题报告
- Polya 定理 (附POJ 1286 Necklace of Beads 解题报告)
- POJ - 3087 Shuffle'm Up解题报告(模拟)
- POJ1094解题报告
- POJ 1077 解题报告
- POJ 2186 解题报告
- POJ-3070-Fibonacci 解题报告
- POJ 3414 解题报告!
- POJ 1042 解题报告