1060 Are They Equal (25分)

题目

思路

本题作于刚刚学完c++STL库中的string容器,充分应用了string里的函数

1.首先对输入的两个字符串进行预处理:将字符前面的0全部删除;
2.构造一个函数返回该字符变成科学计数法时的指数,若为0则返回0;
3.函数返回后先将存在.的字符串中的.删除,然后将重复步骤1:将字符前的所有0删除,最后为防止字符长度不够n在字符串末尾统一添加n个0组成的字符串;
4.输出结果。
(关键在于返回指数的函数如何构造)

最初版代码(AC)

#include<iostream>
#include<string>
using namespace std;
int find_l(string str){
 if(str.substr(0,1)=="\0") return 0;
 if(str.substr(0,1)=="."){
  int i=0;
  while(str.substr(i,1)=="0"||str.substr(i,1)==".") i++;
  if(str.substr(i,1)=="\0") return 0;
  else return (-i+1);
 }
 // 
 if(str.find(".")!=string::npos) return str.find(".");
 return str.length();
}
int main(){
 char sup[1000];
 bool equal=true;
 int n;int l1,l2;
 cin>>n;
 //补足字符串 
 for(int i=0;i<n;i++){
  sup[i]='0';
 }
 sup[n]='\0';
 //
 string a,b;
 cin>>a>>b;
   for(int i=0;a.substr(0,1)=="0";i++){
      a.erase(a.begin());
  }
  for(int i=0;b.substr(0,1)=="0";i++){
      b.erase(b.begin());
  }
 //
 if((l1=find_l(a))!=(l2=find_l(b)))   equal=false;
 //
 if(a.find(".")!=string::npos) a.erase(a.find("."),1);//无“.”数组是否能保留原数组不动? 
 if(b.find(".")!=string::npos) b.erase(b.find("."),1);
 //
    for(int i=0;a.substr(0,1)=="0";i++){
     a.erase(a.begin());
 }
 for(int i=0;b.substr(0,1)=="0";i++){
     b.erase(b.begin());
 }
 //
 a+=sup;
 b+=sup;
 //
 if(a.substr(0,n)!=b.substr(0,n)) equal=false;
 //output
 if(equal) printf("YES 0.%s*10^%d",(a.substr(0,n)).c_str(),l1);
 else printf("NO 0.%s*10^%d 0.%s*10^%d",(a.substr(0,n)).c_str(),l1,(b.substr(0,n)).c_str(),l2);
    //
 return 0;
}

算法笔记代码

#include<iostream>
#include<string>
using namespace std;
int n;
string deal(string s,int& e){
 int k=0;
 while(s.length() >0 &&s[0]=='0'){
  s.erase(s.begin());
 }
 if(s[0]=='.'){
  s.erase(s.begin());
  while(s.length() >0&&s[0]=='0'){
   s.erase(s.begin());
   e--;
  }
 }
    else{
     while(k<s.length()&&s[k]!='.'){
      k++;
      e++;
  }
  if(k<s.length()){
  s.erase(s.begin()+k); 
  }
 }
 if(s.length()==0) e=0;
 int num=0;
 k=0;
 string res;
 while(num<n){
  if(k<s.length()) res+=s[k++];
  else res+='0';
  num++;
    }
 return res; 
}
int main(){
 string s1,s2,s3,s4;
 cin>>n>>s1>>s2;
 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;
 }
 return 0;
}

改进后最终代码

关键

1.分清字符串去掉前导零后共分为以下几种情况
1).000
2) .001
3)121.1
4)121

#include<iostream>
#include<string>
using namespace std;
int n;
string deal(string s,int &e){
 while(s[0]=='0'){
  s.erase(s.begin());
 }//删除前导零; 
 if(s[0]=='.'){
  s.erase(s.begin());
  while(s[0]=='0'){
   s.erase(s.begin());
   e--;
  }  
 } 
 else{
  int pos=s.find(".");
  if(pos!=string::npos){
   s.erase(pos,1);
   e=pos;
  }
  else e=s.length();
 }
 if(s[0]=='\0') e=0;
 //添加末尾零;
    string res;
    for(int i=0;i<n;i++){
     if(i<s.length()) res+=s[i];
     else res+='0';
 }
 return res;
}
int main(){
 string s1,s2;
 cin>>n>>s1>>s2;
 int e1,e2=0;
 s1=deal(s1,e1);
 s2=deal(s2,e2);
 if(s1==s2&&e1==e2) cout<<"YES 0."<<s1<<"*10^"<<e1;
 else cout<<"NO 0."<<s1<<"*10^"<<e1<<" 0."<<s2<<"*10^"<<e2;
 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值