PAT A1060

题目大意:

       给出两个数字,把它们写成保留N位小数的科学计数法,判断两者是否相等。如果相等,则输出YES,同时写出科学计数法表示的形式;如果不相等,则输出NO,同时写出两个数字的科学计数法表示形式。

例如 12300和12358.9保留3位有效数字的科学计数法为0.123*10^5,输出YES;

而120和128保留3位有效数字的科学计数法分别为0.120*10^3和0.128*10^3,输出NO。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;

int n_bit; //保留有效数字的位数
int e_number; //科学计数法指数
string str1, str2; //输入的两个字符串

struct Number{ //定义科学计数法结构体
	string signNumber; //有效数字
	int eNumber; //指数
	Number(){ //初始化
		signNumber = '0';
		eNumber = 0;
	}
};

void dealString(string str, Number &number){ 
	//处理有效数字,使得符合位数要求
	int len = str.length();
	if(len < n_bit){
		for(int i = 0; i < n_bit - len; i++){
			str = str + '0';
		}
	}else{
		str.erase(n_bit,len);
	}
	str = "0." + str;
	number.signNumber = str;
}

void dealLitter(string str, Number &number){
	//处理比1小的
	e_number = 1;
	string::iterator it = str.begin();
	while(*it == '.' || *it == '0'){
		str.erase(it);
		e_number--; 
	}
	if(str.length() == 0){
		e_number = 0;
	}
	number.eNumber = e_number;
	dealString(str, number);
}

void dealBigger(string str, Number &number){
	//处理比1大的
	e_number = 0;
	string::iterator it = str.begin();
	for(; it != str.end(); it++){
		if(*it == '.'){
			str.erase(it);
			break;
		}
		e_number++;
	}

	number.eNumber = e_number;
	dealString(str, number);

}


void isBiggerThanOne(string str, Number &number){
	//判断输入的数比1大还是小
	string::iterator it = str.begin();
		while(*it == '0'){
			str.erase(it); //删掉小数点前的前导0
		}
		if(str.length() == 0){
			number.eNumber = 0;
			dealString(str, number);
		}else{ 
			if(*it == '.'){ //假如是小于1,则删掉前导0,小数点,第一个非0前的所有0

				dealLitter(str, number);

			}else{ //假如是大于1,则删掉前导0
				
				dealBigger(str, number);
			}
		}
}

void Print(int flag, Number num1, Number num2){
	//格式化输出
	if(flag == 1){
		printf("YES ");
		cout<<num1.signNumber;
		cout<<"*10^";
		cout<<num1.eNumber<<endl;
	}else{
		printf("NO ");
		cout<<num1.signNumber;
		cout<<"*10^";
		cout<<num1.eNumber<<" ";

		cout<<num2.signNumber;
		cout<<"*10^";
		cout<<num2.eNumber<<endl;
	}
}

void strCompare(Number num1, Number num2){
	//判断两个字符串是否相等
	if(num1.signNumber == num2.signNumber){
		if(num1.eNumber == num2.eNumber){
			Print(1,num1,num2);
		}else{
			Print(0,num1,num2);
		}
	}else{
		Print(0,num1,num2);
	}
}


int main(){
	scanf("%d", &n_bit);
	Number num1, num2;
	cin>>str1>>str2;
	isBiggerThanOne(str1, num1);
	isBiggerThanOne(str2, num2);
	strCompare(num1,num2);	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/i_CodeBoy/article/details/86769070
今日推荐