PAT A1060
最近刚开始刷PAT甲级的题目,对C++的STL使用不够熟悉,就看《算法笔记》上的相关内容开始学习,
正巧里面穿插了一道PAT的题目,主要与string的使用有关,我就试着做了一下。
写完之后我上传PAT进行测试,发现几个点都是运行时错误,
但是我在这之前已经对书上的几个测试点和网上相关博客提供的测试点进行了测试
答案都是正确的,所以就很郁闷
后面就开始魔改了,浪费了我好多时间,
最后才发现是unsigned int的一个问题,当时为了 匹配 string::npos的类型,
定义了unsigned的类型,但是后面在进行阶数的赋值中,还是不匹配的
但是我还是不太清楚为什么这样会出错,按理说应该达到一定量级,这个问题才会显现出来,
这里N最大100,觉得不会出现这样的问题的。。。orz
有点坑
附上源代码,供大家参考
#include
#include
using namespace std;
int N;
string deal(string s, int& e)
{
string sout;
int flag = 0;
string::iterator it = s.begin();
while(*it == '0' || *it=='.'){
if(*it=='.')
{
flag = 1;
it++;
continue;
}
//s.erase(it);
if(flag) e--;
it++;
}
if(it==s.end()) //s is 0
{
//cout<<"end"<
e = 0;
string st(N, '0');
sout = st;
return sout;
}
s.erase(s.begin(), it);
int f = s.find("."); //这里如果使用 unsigned int, PAT就会报运行时错误 好坑。。。
if(f != string::npos) //小数点之前有f个数
{
e = f;
s.erase(f,1);
}
else if(flag==0)
{
e = s.length();
}
int len = s.length();
if(N<=len)
{
sout = s.substr(0, N);
}
else
{
string st(N-len, '0');
sout = s+st;
}
return sout;
}
int main(int argc, char const *argv[])
{
string s1, s2;
string s3, s4;
cin>> N>> s1>> s2;
//while(N!=0){
int e1 = 0, e2 = 0;
s3 = deal(s1, e1);
s4 = deal(s2, e2);
if(s3==s4 && e1==e2)
{
cout<<"YES 0."<< s3 <<"*10^" << e1;
}
else{
cout<<"NO 0."<< s3 << "*10^" << e1 << " 0." << s4 << "*10^" << e2;
}
//cin>> N>> s1>> s2;
//}
return 0;
}
成功运行:
orz第一次写博客,刚开始文字老在一个框框里面,原来是因为我前面用了tab键,以为是缩进,其实不是,。。。。。顺便也记一下吧,太小白了。。。