求有操作的各位数和

du463 / 2023-08-15 / 原文

如何求一个数的位数最大和

题目思路

给定一个数,从他最小位到最高位进行操作,对于每一位上的数字,可以选择让他加1,减1,或者是保持不变,求位数最大和(对于整体其实减去了一个10的多少次方)

思路

要使得每一位的总和最大,我们可以对每一位进行一个判断
我们只需要对0和9这两个数字进行判断即可,如果当前位不是0或者9,我们只需要加1保证他的最大值
如果当前位是9,我们就保持不变即可,因为9本身就是个位数中最大的数字
如果当前位数是0,我们就要-1,因此我们需要从前面一位去借一个1,例如100-1=99,90-1=89使得前面的数字也因此受到改变。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve(){
    int n;
    cin>>n;
    int ans=0;
    if(n==0){
        ans=1;
    }
    else{
        while(n){
            if(n%10==0){
                n-=1;

            }
            else if(n%10!=9){
                n+=1;
            }
            ans+=(n%10);
            n/=10;
        }
    }
    cout<<ans<<endl;
    
}
int main(){
    int t;
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}