算法-靠谱的车(数位模拟)

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        int n=in.nextInt(),copy=n;
        // 取每一位上的数放入数组
        List<Integer> list=new ArrayList<>();
        while(n!=0){
            int res=n%10;
            list.add(0,res);
            n/=10;
        }
        // 转数组
        n=list.size();
        int[] arr=new int[n];
        for(int i=0;i<n;i++){
            arr[i]=list.get(i);
        }
        // 处理:ans表示多加了的数的和
        int index=n-1,ans=0;
        while(true){
            int cur=arr[index];
            if(cur>4){
                // //1.判断前面高位中是否有数字4
                int i=index-1;
                while(i>=0&&arr[i]!=4){
                    i--;
                }
                if(i>=0){//在i处是4,多加的数是10的x次方
                    int base=1;
                    for(int j=i;j<index;j++){
                        base*=10;
                    }
                    ans+=base;
                    //i处的位值减1:表示第i个位次处理了一次,将位值减1,下同
                    arr[i]--;
                }else{// 2.前面高位中没有4,多加的数为1
                    ans++;
                    //上一个非0更高位减1:如59变49
                    i=index-1;
                    while(i>=0&&arr[i]==0){
                        i--;
                    }
                    //找不到,说明处理结束,下同
                    if(i<0)break;
                    arr[i]--;
                    //从i到index的路程中的0位全部置为9:模仿借位
                    for(int j=i+1;j<index;j++){
                        arr[j]=9;
                    }
                }
            }else{
                //向最近一个高位借位(该位必须不为0)
                int i=index-1;
                while(i>=0&&arr[i]==0){
                    i--;
                }
                if(i<0)break;
                arr[i]--;
                // 中间的数全部置9(包括index)
                for(int j=i+1;j<=index;j++){
                    arr[j]=9;
                }  
            }
        }
        System.out.println(copy-ans);
    }
}

简要:每个数位从9到0均统计一遍,其中个位上只需统计1次。原数肯定不包含4,但在逐一借位时可能产生4,要单独处理.

如n=99

99: 多加了1, 高位降1,变为89,再判断

89: 多加了1, 高位降1,变为79

79: 多加了1, 高位降1,变为69

……

49: 从40-50都会被跳过,多加了10.

……

09:多加了1,高位无法再降,结束。

对于n=100,个位为0,显然没有跳过4,需要将其降到个位大于4的最大数:99,即借位。

当个位上的数小于4时,需要“借位”,即让上一个非0高位减1,个位的值变9.其实借位后个位值不一定取9,只要比4大就行,不影响结果,为了方便取成9。如105:可以变95或99

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暗=里

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值