PAT A1060 Are They Equal 我的思路不太好,25分得了19分。其实还是有很大纰漏的!

//ac,还是晴神宝典好啊! 
//注意参数结果带回,因此要用int& e,表示int型的指针 
//#include<stdio.h>
#include<iostream>//一定注意,要用cin必须用iostream! 
#include<string>
using namespace std;
int n;//有效数位 

//通过写函数来处理科学计数法
string deal(string s,int& e){
	int k=0;//s的下标
	while(s.length()>0&&s[0]=='0'){
		s.erase(s.begin());//一直去,去掉所有前导0。而我是通过寻找小数点的方式 
	}
	if(s[0]=='.'){//去掉所有前导0后是小数点,说明s是小于1的小数 
		s.erase(s.begin());//去掉小数点
		while(s.length()>0&&s[0]=='0'){
			s.erase(s.begin());//去掉小数点后非零位前的所有零
			e--;//每去掉小数点后面1个0,指数e-1 
		} 
	}
	else{//去掉前导0后不是小数点0,则找到后面的小数点删除。哦!我懂了,是从小数点的角度出发,去一个小数点,说明指数达到某个值
		while(k<s.length()&&s[k]!='.'){//寻找小数点。关系到指数的值 
			k++;
			e++;//只要不碰到小数点就让指数e++ 
		}
		if(k<s.length()){//while结束后如果k<length,说明中间碰到了小数点 
			s.erase(s.begin()+k);//把小数点删除 
		} 
	}
	if(s.length()==0){//如果去掉前导后这个数长度变为0,说明这个数位0 
		e=0;
	}
	int num=0;
	k=0;
	string res;
	while(num<n){//只要精度还没有到n 
		if(k<s.length()) res+=s[k++];//只要还有数字,就加到res末尾。这个我就 没有想到,我想的就是硬输出
		else res+='0';//否则res末尾+0
		num++; 
	}
	return res; 
} 

int main(){
	string s1,s2,s3,s4;
	//scanf("%d",&n);
	cin>>n>>s1>>s2;
	int e1=0,e2=0;
	s3=deal(s1,e1);
	s4=deal(s2,e2);
	if(s3==s4&&e1==e2){//主体相同且指数相同则YES 
		 cout<<"YES 0."<<s3<<"*10^"<<e1<<endl; 
	}
	else{
		cout<<"NO 0."<<s3<<"*10^"<<e1<<" 0."<<s4<<"*10^"<<e2<<endl;
	}
	return 0;
}


看看我自己的得了19分的代码,确实太粗糙了,考虑问题不全面,另外思路比较死板。不灵活

//哈哈,第一次做大概半个多小时,反正肯定不到一个小时,这题总共25分,得了19分,七个测试点,对了4个。还是有希望的!加油! 
//我知道的,有一个错的点是,如果n>数字本身的数位,我的程序就不能处理 
//同一个程序,你一秒钟前是返回1,说不定你等一下,再调试就正常了,不要焦躁 
#include<iostream>//如果要用cin,必须要用iostream 
#include<string>
//#include<algorithm>
using namespace std;
int main(){
	int n;
	int ans=1;//假设都是相等的 
	string s1,s2;  
	scanf("%d",&n);//保留几位有效数字 
	cin>>s1;
	cin>>s2;
	int pos1=0,pos2=0;
	int flag1=0,flag2=0;
	int left1,left2;
	for(int i=0;i<s1.length();i++){
		if(s1[i]=='.'){
			pos1=i;
			//break;
		}
		if(s1[i]!=0&&flag1==0){
			left1=i;
			flag1=1;
		}
	}
	if(pos1==0) pos1=s1.length();
	for(int i=0;i<s2.length();i++){
		
		if(s2[i]=='.'){
			pos2=i;
			//break;
		}
		if(s2[i]!=0&&flag2==0){
			left2=i;
			flag2=1;
		}
	}
	if(pos2==0) {pos2=s2.length();}//如果是整数,就把小数点放在最后一个位置 
	int count=0;
	for(int i=left1,j=left2;count<n;){//i<left+n&&j<left+n
		if(s1[i]=='.')i++;
		if(s2[j]=='.')j++;
		if(s1[i]!=s2[j]) {
			ans=0;
			break;
		}
		i++;j++;
		count++;
	}
	 
	if(ans==1){
		//计算一个的就行了
		printf("YES ");
		int zhishu=pos1-left1;
		if(zhishu<0) zhishu=zhishu+1; 
		printf("0.");
		count=0;
		for(int i=left1;count<n;i++){//i<left+n
			if(s1[i]!='.'){
				printf("%c",s1[i]);
				count++;
			}
		}
		printf("*10^%d\n",zhishu);
	}
	else{//前n个非0的数不一样的 
		printf("NO ");
		int zs1=pos1-left1,zs2=pos2-left2;
		if(zs1<0) zs1+=1;
		if(zs2<0) zs2+=1;
		printf("0.");
		count=0;
		for(int i=left1;count<n;i++){
			//这里很有问题,要记得把'.'去掉!
			if(s1[i]!='.'){
				printf("%c",s1[i]);
				count++;
			} 
		}
		printf("*10^%d ",zs1); 
		
		printf("0.");
		count=0;
		for(int i=left2;count<n;i++){
			//这里很有问题,要记得把'.'去掉!
			if(s2[i]!='.'){
				printf("%c",s2[i]);
				count++;
			} 
		}
		printf("*10^%d\n",zs2); 
	} 
	return 0;
} 



你可能感兴趣的:(C++,算法,pat)