3449. 数字根

摘要
Title: 3449. 数字根
Tag: 数字根、数论
Memory Limit: 64 MB
Time Limit: 1000 ms

Powered by:NEFU AB-IN

Link

3449. 数字根

  • 题意

    一个正整数的数字根是通过对该整数的各位数字求和得到的。
    如果得到的结果是一个一位数字,则该这个数字就是所求的正整数的数字根。
    如果得到的结果不止一位,则不断地对得到的中间结果进行各位数字求和,直到得到的最终结果为一位数字为止。
    最终的得到的一位数字就是该正整数的数字根。
    例如,对于整数 24,将 2 和 4 相加得到 6,而 6 是一位数字,所以 6 是 24 的数字根。
    再考虑整数 39,将 3 和 9 相加得到 12,由于 12 不是一位数字,所以要继续对其进行各位数字求和,将 1 和 2 相加得到 3,3 是一位数字,所以 3 是 39 的数字根。

  • 思路

    两个性质

    9 的倍数的性质:9 的倍数各个数位上的数字之和是 9 的倍数
    任何一个整数模 9 同余于它的各数位上数字之和

    那么一直模9即可

  • 代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <cstdio>
    #include <iostream>
    #include <string>
    using namespace std;

    int main(){
    string s;
    while(cin >> s, s != "0"){
    int ans = 0;
    for(int i = 0; i < s.size(); i++)
    ans += s[i] - '0';
    ans %= 9;
    if(ans) printf("%d\n", ans);
    else printf("9\n"); //如果是0特判,结果其实是9
    }
    return 0;
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    /*
    * @Author: NEFU AB-IN
    * @Date: 2022-08-17 15:42:33
    * @FilePath: \Acwing\3449\3449.cpp
    * @LastEditTime: 2022-08-17 15:47:47
    */
    #include <bits/stdc++.h>
    using namespace std;
    #define N n + 100
    #define int long long
    #define SZ(X) ((int)(X).size())
    #define IOS \
    ios::sync_with_stdio(false); \
    cin.tie(nullptr); \
    cout.tie(nullptr)
    #define DEBUG(X) cout << #X << ": " << X << '\n'
    typedef pair<int, int> PII;

    signed main()
    {
    IOS;
    string n;
    while (cin >> n, n != "0")
    {
    while (SZ(n) > 1)
    {
    int ans = 0;
    for (auto i : n)
    {
    ans += i - '0';
    }
    n = to_string(ans);
    }
    cout << n << '\n';
    }
    return 0;
    }
使用搜索:谷歌必应百度