//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;
}
本文分享了一种处理科学计数法的有效方法,通过去除前导零和小数点后的零,实现数值的有效位数控制,并通过计算指数部分来保持数值的准确性。此方法适用于需要精确控制有效位数的场景。
471

被折叠的 条评论
为什么被折叠?



