【PAT乙级2020冬季】7-3 舍入 (20 分)

,还未AC,只拿了15分

不同的编译器对浮点数的精度有不同的处理方法。常见的一种是“四舍五入”,即考察指定有效位的后一位数字,如果不小于 5,就令有效位最后一位进位,然后舍去后面的尾数;如果小于 5 就直接舍去尾数。另一种叫“截断”,即不管有效位后面是什么数字,一概直接舍去。还有一种是“四舍六入五成双”,即当有效位的后一位数字是 5 时,有 3 种情况要考虑:如果 5 后面还有其它非 0 尾数,则进位;如果没有,则当有效位最后一位是单数时进位,双数时舍去,即保持最后一位是双数。

本题就请你写程序按照要求处理给定浮点数的舍入问题。

输入格式:

输入第一行给出两个不超过 100 的正整数 N 和 D,分别是待处理数字的个数和要求保留的小数点后的有效位数。随后 N 行,每行给出一个待处理数字的信息,格式如下:

指令符 数字

其中指令符是表示舍入方法的一位数字,1 表示“四舍五入”,2 表示“截断”,3 表示“四舍六入五成双”;数字是一个总长度不超过 200 位的浮点数,且不以小数点开头或结尾,即 0.123 不会写成 .123123 也不会写成 123.。此外,输入保证没有不必要的正负号(例如 -0.0 或 +1)。

输出格式:

对每个待处理数字,在一行中输出根据指令符处理后的结果数字。

输入样例:

7 3
1 3.1415926
2 3.1415926
3 3.1415926
3 3.14150
3 3.14250
3 3.14251
1 3.14

输出样例:

3.142
3.141
3.142
3.142
3.142
3.143
3.140

分析: 

比较复杂啊这个题~,觉得肯定做不出来,只想拿到部分分数,也就是题目中的输入样例可以通过就行,因为我没有写从后往前每一位进位~

代码:

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int n,d;
	cin>>n>>d;
	for(int i=0;i<n;i++){
		int k,j=0; string s;
		cin>>k>>s;
		while(s[j]!='.'&&j<s.size()) j++;
		if(j==s.size()){
			cout<<s;
			if(d>0) printf(".");
			for(int j=0;j<d;j++)
				printf("0");
			printf("\n");	
		}
		else if(k==1){  //四舍五入	
			//j+1,j+2
			if(j+d+1>=s.size()){
				cout<<s;//d-(s.size()-j)
				for(int q=1;q<=d-(s.size()-j-1);q++)
					printf("0");
			}else{
				int jin=0;
				if((s[j+d+1]-'0')>=5){
					jin=s[j+d]+1;
					if(jin!=10) s[j+d]=s[j+d]+1;
					else{
						//依次进位 
					}	
				} 
				for(int q=0;q<j+d+1;q++)
					cout<<s[q];
			}
			cout<<endl;	
		}else if(k==2){  //截断
			cout<<s.substr(0,j+d+1)<<endl;	
		}else{  //四舍六入五成双
			if(s[j+d+1]-'0'<5) cout<<s.substr(0,j+d+1)<<endl;
			else if(s[j+d+1]-'0'==5){
				int flag=0;
				for(int k=j+d+2;k<s.size();k++){
					if(s[k]-'0'!=0){
						flag=1;break;//有效位的后一位数字是5,且5后有非零尾数 
					}
				}
				if(flag){
					s[j+d]=s[j+d]+1;
					cout<< s.substr(0,j+d+1)<<endl;
				}else{//有效位的后一位数字是5,且5后无非零尾数
					if(s[j+d]%2==0) cout<< s.substr(0,j+d+1)<<endl;
					else{
						s[j+d]=s[j+d]+1;
						cout<< s.substr(0,j+d+1)<<endl;
					}
				}	
			}else{
				s[j+d]=s[j+d]+1;
				cout<< s.substr(0,j+d+1)<<endl;
			}
		}
	}
	return 0;
}

复杂啊复杂,这其实是一道逻辑题~  (但我是个没有逻辑的人)

抽空把没写完的部分补上。

猜你喜欢

转载自blog.csdn.net/WKX_5/article/details/114477452