代码风格是c++,但是很多处理方式是c的风格,因为c++提供了很多的方法,并且写起来,代码风格更舒服一些
//大致要求的就是输入一个n,一个随便神码数(当然可以是浮点数,也有长度限制,但是这里不把数作为真的“数”,而是作为字符输入然后处理
//这里的字符主要有两种,一个是含大于1的部分,还一个是纯粹的小于1部分,当然没有负数(是否可以作为开始用字符串处理的一个标志?)
//输出的时候是要求是0.xxxx*10^ 的形式,这里呢不特意的处理成0.xxx的数据输出,而是要处理成xxx的形式,在输出时不上 0. 和*10^ 的符号
#include <string>
#include <iostream>
using namespace std;//这里不是用gcc编译,是用g++
int n;//表示处理精度
string deal(string s,int& e)
{
unsigned int k = 0;//k可以作为记录下标的一个变量存在
while(s.length() > 0 && s[0] == '0')//去除前导0
{
s.erase(s.begin());
}
if (s[0] == '.') {
s.erase(s.begin());
while(s.length() > 0 && s[0]=='0'){
//去除小数点后的前导0
s.erase(s.begin());
e--;//每去掉一个0指数就减少
}
}
else//去掉前导0后不是小数点,那么则找到小数点
{
while(k < s.length() && s[k] != '.')
{
k++;
e++;
}
if(k < s.length())//如果这里还是小于,说明找到了,提前结束了
{
s.erase(s.begin() + k);//删除小数点
}
}
if(s.length() == 0)
{
//如果长度为0说明清空了,输入的就是0
e=0;
}
k = 0;
int num = 0;
string res;
while(num < n)//只要精度没有达到
{
if(k < s.length()) res += s[k];
else res += '0';
k++;
num++;
}
return res;
}
int main(int argc, char const *argv[])
{
string s1,s2,s3,s4;
int e1 = 0;
int e2 = 0;
cin>>n>>s1>>s2;
s3 = deal(s1,e1);
s4 = deal(s2,e2);
if(s3 == s4 && e1 == e2)
{
cout<<"YES 0."<<s3<<"*10^"<<e1<<endl;
}
else{
cout<<"NO 0."<<s3<<"*10^"<<e1<<" 0."<<s4<<"*10^"<<e2<<endl;
}
return 0;
}