PAT 甲级 1023 Have Fun with Numbers【模拟】

首先20位说明long long也不行,所以要模拟乘以二的操作。

具体讲一下乘2模拟:
1.将每一位数乘以2的结果对10取余,存到对应位上
2.得出进位数组,即每一位乘2后是不是需要进位
3.对每个需要进的位,他的前一位应该要+1
如下图所示(自己手写的一个):
在这里插入图片描述

int cnt[11];
char str[25];
int up[25];//模拟进位的数组

bool check(){

    int len = strlen(str);

    for(int i=0;i<len;i++)
        cnt[str[i]-'0'] ++ ;

    //模拟乘2
    for(int i=len-1;i>=0;i--){
        int temp = (str[i] - '0')*2;
        str[i] = temp%10 + '0';
        if(temp>=10) up[i] = 1;
    }
    for(int i=len-1;i>=0;i--){
        if(up[i]){
            if(i==0){
                for(int t=len-1;t>=0;t--)
                    str[t+1] = str[t];
                str[0] = '1';
            }else str[i-1] += 1;
        }
     }
    //模拟结束

    len = strlen(str);
    for(int i=0;i<len;i++){
        cnt[str[i]-'0'] -- ;
        if(cnt[str[i]-'0']<0) return false;
    }
    return true;
}

int main(){

    scanf("%s",str);

    if(check()) printf("Yes\n%s",str);
    else printf("No\n%s",str);

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值