心累,编了半天,运行超时。然后测试点六还过不去。
PAT甲级真的很磨人啊。
以下代码是第一遍终稿。没有考虑0的情况。然后判断逻辑复杂。需要改进。不需要用word重新装载删减后的字符串,然后根据有效数字位数来确定字符串。
#include<iostream>
#include<string>
using namespace std;
//有效数字是从第一个非零数到末尾为止
//别想的太麻烦,可以全当成字符串判定
int num;
string getid(string n,int &zhishu)
{
string word="";
int i=0;
while(n[i]=='0'&&n.length()>0)//判读条件注意
n.erase(n.begin());//去掉前面的前导零
if(n[i]=='.')//当字符串小于零
{
n.erase(n.begin());
while(n[i]=='0')
{
n.erase(n.begin());
zhishu--;//小数点后,前面0的个数
}
while(i<n.length())
{
word=word+n[i];
i++;
}
}
else
{
while(i<n.length()&&n[i]!='.')
{
word=word+n[i];
i++;
zhishu++;
}
i++;
while(i<n.length())
word=word+n[i];
}
if(word.length()>=num)
word=word.substr(0,num);
else
{
while(word.length()!=num)
word=word+'0';
}
return word;
}
int main()
{
cin>>num;
string n1,n2;
cin>>n1>>n2;
int zhishu1=0,zhishu2=0;
string a1=getid(n1,zhishu1);
string a2=getid(n2,zhishu2);
if(a1==a2&&zhishu1==zhishu2)
cout<<"YES"<<" "<<"0."<<a1<<"10^"<<zhishu1;
else
cout<<"NO"<<" "<<"0."<<a1<<"*10^"<<zhishu1<<" 0."<<a2<<"*10^"<<zhishu2;
return 0;
}
又改了一遍,发现出现段错误。经过测试用例中会出现
4 0000 0000.00 这种测试用例???
#include<iostream>
#include<string>
using namespace std;
//有效数字是从第一个非零数到末尾为止
//别想的太麻烦,可以全当成字符串判定
int num;
string getid(string n,int &zhishu)
{
string word="";
int i=0;
while(n[i]=='0'&&n.length()>0)//判读条件注意
n.erase(n.begin());//去掉前面的前导零
if(n[i]=='.')//当字符串小于零
{
n.erase(n.begin());
while(n[i]=='0')
{
n.erase(n.begin());
zhishu--;//小数点后,前面0的个数
}
}
else
{
while(i<n.length()&&n[i]!='.')
{
i++;
zhishu++;
}
n.erase(n.begin()+i);//'.'的迭代器,只有string和vector允许这么写
}
if(n.length()>=num)
word=n.substr(0,num);
else
{
while(n.length()!=num)
word=n+'0';
}
return word;
}
int main()
{
cin>>num;
string n1,n2;
cin>>n1>>n2;
int zhishu1=0,zhishu2=0;
string a1=getid(n1,zhishu1);
string a2=getid(n2,zhishu2);
if(a1==a2&&zhishu1==zhishu2)
cout<<"YES"<<" "<<"0."<<a1<<"*10^"<<zhishu1;
else
cout<<"NO"<<" "<<"0."<<a1<<"*10^"<<zhishu1<<" 0."<<a2<<"*10^"<<zhishu2;
return 0;
}
最后终于改正了错误。发现if()条件后加了;引发了段错误。
#include<iostream>
#include<string>
using namespace std;
int num;
string getid(string n,int &zhishu)
{
int i=0;
while(n.length()>0&&n[0]=='0')//判读条件注意
{
n.erase(n.begin());//去掉前面的前导零
}
if(n.length()>0&&n[0]=='.')//当字符串小于零
{
n.erase(n.begin());
while(n.length()>0&&n[0]=='0')//否则会出现段错误!因为查找了不存在的n[i]
//并且&&俩边的条件有先后顺序!!
{
n.erase(n.begin());
zhishu--;//小数点后,前面0的个数
}
}
else
{
while(i<n.length()&&n[i]!='.')
{
i++;
zhishu++;
}
if(i<n.length())
{
n.erase(n.begin()+i);//'.'的迭代器,只有string和vector允许这么写
}
}
if(n.length()==0)
zhishu=0;
/*if(n.length()>num)
word=n.substr(0,num);
else
{
while(n.length()!=num)
n=n+'0';
word=n;
}
*/
int x=0,y=0;
string word;
while(x<num)
{
if(y<n.length()) word +=n[y++];
else word+= '0';
x++;
}
return word;
}
int main()
{
cin>>num;
string n1,n2;
cin>>n1>>n2;
int zhishu1=0,zhishu2=0;
string a1=getid(n1,zhishu1);
string a2=getid(n2,zhishu2);
if(a1==a2&&zhishu1==zhishu2)
cout<<"YES"<<" "<<"0."<<a1<<"*10^"<<zhishu1<<endl;
else
cout<<"NO"<<" "<<"0."<<a1<<"*10^"<<zhishu1<<" 0."<<a2<<"*10^"<<zhishu2<<endl;
return 0;
}