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

分析:
分析个锤子!这题就够离谱的,下意思觉得不难,但是真的巨复杂。
在这里插入图片描述
代码(13分):

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

int main(){
    int n,d,t;
    cin>>n>>d;
    char a[205];
    while(n--){
        scanf("%d ",&t);
        cin.getline(a,205);
        int low=0;
        if(a[0]=='-'||a[0]=='+'){
            char m=a[0];
            low++;
        }

        int len=strlen(a),dot;
        for(int i=low;i<len;i++){
            if(a[i]=='.'){
                dot=i;
                break;
            }
        }
        for(int i=len;i<=dot+d+1;i++)
            a[i]='0';
        if(t==1){
            int add,temp;
            if(a[dot+d+1]>='5'){
                add=1;
                for(int i=dot+d;i>dot;i--){
                    temp=a[i]-'0'+add;
                    a[i]=temp%10+'0';
                    add=temp/10;
                }
                if(add){
                    for(int i=dot-1;i>=low;i--){
                        temp=a[i]-'0'+add;
                        a[i]=temp%10+'0';
                        add=temp/10;
                    }
                    if(add)
                        cout<<1;
                }
            }
            for(int i=low;i<=dot+d;i++){
                cout<<a[i];
            }
        }
        else if(t==2){
            for(int i=low;i<=dot+d;i++){
                cout<<a[i];
            }
        }
        else if(t==3){

            int add,temp;
            if(a[dot+d+1]<='4'||a[dot+d+1]=='5'&&a[dot+d+2]=='0'&&(a[dot+d]-'0')%2==0){
                 for(int i=low;i<=dot+d;i++){
                    cout<<a[i];
                 }
            }

            else if(a[dot+d+1]>='6'||a[dot+d+1]=='5'&&a[dot+d+2]!='0'||a[dot+d+1]=='5'&&a[dot+d+2]=='0'&&(a[dot+d]-'0')%2==1){
                add=1;
                for(int i=dot+d;i>dot;i--){
                    temp=a[i]-'0'+add;
                    a[i]=temp%10+'0';
                    add=temp/10;
                }
                if(add){
                    for(int i=dot-1;i>=low;i--){
                        temp=a[i]-'0'+add;
                        a[i]=temp%10+'0';
                        add=temp/10;
                    }
                    if(add)
                        cout<<1;
                }
                for(int i=low;i<=dot+d;i++)
                    cout<<a[i];
            }
        }

//        for(int i=0;i<=dot+d;i++){
//            cout<<a[i];
//        }
        if(n>0)
            cout<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值