• 【思维/构造】D


    D - Decrease the Sum of Digits

    只要发现进位可以直接抹掉后面的位数就行了,剩下的就是在第几位进位的问题。写得繁琐了一点。

    int main()
    {
        //ios::sync_with_stdio(false);
        //while (scanf("%d%d",&n,&m)!=EOF){
        int t; cin >> t; while (t--) {
            LL n; int s;
            cin >> n >> s;
            string str = to_string(n);
            int len = str.length();
            int cnt = 0;
            for (int i = 0; i < len; i++) {
                cnt += str[i] - '0';
            }
            if (cnt <= s) {
                cout << 0 << endl;
                continue;
            }
            cnt = 0;
            //第一位数>=s,必须进位
            if (str[0] - '0' >= s) {
                //从后往前找到第一个需要借位做减法的位置
                int mark = -1;
                for (int k = len - 1; k > 0; k--) {
                    if (str[k] - '0' != 0) {
                        mark = k;
                        break;
                    }
                }
                //不需要借位做减法
                if (mark == -1) {
                    cout << 10 - (str[0] - '0');
                    for (int k = 1; k < len; k++) cout << 0;
                    cout << endl;
                    continue;
                }
                else {
                    //记录当前位是否会减出前导零
                    int first = 1;
                    for (int k = 0; k < len; k++) {
                        if (k < mark) {
                            //9-str[k]会减出前导零,跳过
                            if (first && str[k] == '9') continue;
                            else {
                                cout << 9 - (str[k] - '0');
                                first = 0;
                            }
                        }
                        else if (k == mark) cout << 10 - (str[k] - '0');
                        else if (k > mark) cout << 0;
                    }
                    cout << endl;
                    continue;
                }
            }
            else {
                for (int i = 0; i < len; i++) {
                    cnt += str[i] - '0';
                    //累加到第i位之后超出s,在第i位往前进一位
                    //如235 5,加到第1位(从0起计)后=5,则应进位成300,答案即300-235
                    if (cnt >= s) {
                        int mark = -1;
                        for (int k = len - 1; k > i; k--) {
                            if (str[k] != '0') {
                                mark = k;
                                break;
                            }
                        }
                        if (mark == -1) {
                            cout << 10 - (str[i] - '0');
                            for (int k = i + 1; k < len; k++) cout << 0;
                            cout << endl;
                            break;
                        }
                        else {
                            int first = 1;
                            for (int k = i; k < len; k++) {
                                if (k < mark) {
                                    if (first && str[k] == '9') continue;
                                    else {
                                        cout << 9 - (str[k] - '0');
                                        first = 0;
                                    }
                                }
                                else if (k == mark) cout << 10 - (str[k] - '0');
                                else if (k > mark) cout << 0;
                            }
                            cout << endl;
                            break;
                        }
                    }
                }
            }
        }
        return 0;
    }
    
    
  • 相关阅读:
    sql 行转列
    wm_concat函数 用法
    PL/SQL如何调试Oracle存储过程
    Oracle&SQLServer中实现跨库查询
    Oracle 中 decode 函数用法
    Oracle中给用户赋予debug权限
    Oracle中的NVL函数
    oracle 触发器 pragma autonomous_transaction
    ORACLE中%TYPE和%ROWTYPE的使用
    A complete example using RAISE_APPLICATION_ERROR : raise_application_error
  • 原文地址:https://www.cnblogs.com/streamazure/p/13631068.html
Copyright © 2020-2023  润新知