目录
1,题目描述
题目大意
2,思路
数据结构
算法
3,AC代码
4,解题过程
第一搏
第二搏
1,题目描述
Sample Input 1:
3 12300 12358.9
Sample Output 1:
YES 0.123*10^5
Sample Input 2:
3 120 128
Sample Output 2:
NO 0.120*10^3 0.128*10^3
题目大意
科学计算。判断精确到位数N后,两数是否相等。
2,思路
参考这位大神的代码!@日沉云起【pat甲级1060. Are They Equal (25) 】
代码简洁,清晰易懂,注释详细,妙不可言!膜了!
(这一题看上去很简单,实际上繁琐之极。。。抛出几个例子就知道了)
//test1
99 0.00 0.000
//result
YES 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000*10^0
//test2
3 0.00123 0.00345
//result
NO 0.123*10^-2 0.345*10^-2
//test3
6 123 234
//result
NO 0.123000*10^3 0.234000*10^3
但是,理清思路后就简单多了
数据结构
将结果分为两部分ans和exp:
- string ans:存放0.之后需要输出的部分,比如5 123 ,ans1= 12300(后两个0是为了补全5位);
- int exp:存放指数 还按上述例子,exp此时应为3;
算法
num为输入的数字(string类型)
- point标记小数点位置(初始时为num.size()),index标记第一个不为0的数字的位置(初始为-1)。根据point和index可以计算exp;
- 遍历一遍字符串,确定point和index的值,并将第一个不为0的数字以及后面的一共N个数字,存入ans中;
- 若ans.size() < N,ans+='0'(将ans中不满N个数字的部分,补0);【ans部分计算完成】
- 若index == -1,exp为0;
- 若point-index小于0,exp = point-index+1;否则exp = point-index;【exp部分计算完成】
3,AC代码
#include<iostream>
using namespace std;
int N; //保留的数字位数
void analyse(const string &num, string &ans, int &exp){
int point = num.size(); //小数点位置 初始为末位
int index = -1; //标记第一个不为0的位置
for(int i = 0; i < num.size(); i++){
if(num[i] == '.') //遇到小数点 重新标记小数点位置
point = i;
else if(index == -1 && num[i] != '0'){//找到第一个不为0的数
index = i;
ans += num[i];
}
else if(index != -1 && ans.size() < N)//将第一个非0的字符之后的N个数字保存起来
ans += num[i];
}
while(ans.size() < N) //当ans不够N位时 不断补0
ans += '0';
exp = point - index; //指数即小数点位置减去第一个不为0的数字的位置 eg.123.4 exp=3-0=3
exp = exp < 0 ? exp + 1 : exp; //若exp小于0 需要加1 eg.0.00123 exp=1-4+1=-2
if(index == -1) //未找到不为0的数 此时ans中均为0
exp = 0;
}
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
string a, b, a1, b1;
int expA, expB;
cin>>N>>a>>b;
analyse(a, a1, expA);
analyse(b, b1, expB);
if(a1 == b1 && expA == expB){
cout<<"YES 0."<<a1<<"*10^"<<expA;
}else{
cout<<"NO 0."<<a1<<"*10^"<<expA<<" 0."<<b1<<"*10^"<<expB;
}
return 0;
}
4,解题过程
第一搏
由于数据的结构处理没有想好,很多细节都很难完善。。。
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<math.h>
#include<queue>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
int N;
cin>>N;
char num1[101], num2[101];//以字符形式存储数字
int index1 = -1, index2 = -1;//标记小数点位置
fill(num1, num1 + 101, '0');
fill(num2, num2 + 101, '0');
char c;
scanf(" %c", &c);
//printf("%c", c);
int i;
for(i = 0; c != ' ' && i <= 100; i++){
if(c == '.') index1 = i--;//回退一位
else num1[i] = c;
scanf("%c", &c);
}
if(index1 == -1) index1 = i;
scanf("%c", &c);
for(i = 0; c != '\n' && i <= 100; i++){
if(c == '.') index2 = i--;//回退一位
else num2[i] = c;
scanf("%c", &c);
}
if(index2 == -1) index2 = i;
int flag = 1;
if(index1 != index2){
flag = 0;
}else{
for(int j = 0; j < N; j++){
if(num1[j] != num2[j]){
flag = 0;
break;
}
}
}
if(flag == 0){
printf("NO 0.");
for(int j = 0; j < N; j++)
printf("%c", num1[j]);
printf("*10^%d 0.", index1);
for(int j = 0; j < N; j++)
printf("%c", num2[j]);
printf("*10^%d", index2);
}else{
printf("YES 0.");
for(int j = 0; j < N; j++)
printf("%c", num1[j]);
printf("*10^%d", index1);
}
return 0;
}