首页 > 试题广场 >

数根

[编程题]数根
  • 热度指数:5416 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
数根可以通过把一个数的各个位上的数字加起来得到。如果得到的数是一位数,那么这个数就是数根;如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来。如此进行下去,直到得到是一位数为止。
比如,对于24 来说,把2 和4 相加得到6,由于6 是一位数,因此6 是24 的数根。
再比如39,把3 和9 加起来得到12,由于12 不是一位数,因此还得把1 和2 加起来,最后得到3,这是一个一位数,因此3 是39 的数根。
现在给你一个正整数,输出它的数根。

输入描述:
输入包含多组数据。

每组数据数据包含一个正整数n(1≤n≤10E1000)。


输出描述:
对应每一组数据,输出该正整数的数根。
示例1

输入

24
39

输出

6
3
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<functional>
#include <map>
#include <set>
#include <unordered_set>
#include <unordered_map>
#include <exception>

using namespace std;

int numberRoot(string num)
{
	int cur = 0;
	for (auto& c : num) cur += c - '0';
	num = to_string(cur);
	while (num.size() > 1)
	{
		cur = 0;
		for (auto& c : num) cur += c - '0';
		num = to_string(cur);
	}
	return cur;
}
int main(int argc, char** argv)
{
	string num;
	while (cin >> num)
	{
		cout << numberRoot(num) << endl;
	}
	return 0;
}

发表于 2017-07-08 17:16:54 回复(0)
#!/usr/bin/env python


def digit_root(num):
    return int(num - 9*math.floor((num-1)/9)) if num != 0 else 0

编辑于 2016-06-09 12:16:05 回复(0)
// write your code here cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Max 10001

int main()
{
    int len = 0;
    int sum = 0;
    int i = 0;
    int t = 0;
    int k = 0;
    char n[Max];
    while(scanf("%s",n)!=EOF)
    {
        len = strlen(n);
        sum = 0;
        for(i=0;i<len;i++)
            sum += (n[i]-'0');
        t = sum/10;
        while(t)
        {
            k = sum;
            sum = 0;
            int j=0;
            while(k)
            {
                j = k%10;
                k = k/10;
                sum += j;
            }
            t = sum/10;
        }
        printf("%d\n",sum);
    }
    return 0;
}
代码有点乱,但过了

发表于 2016-01-19 14:25:15 回复(0)
//输入n最大为1000位,所以第一轮求树根用字符,结果最多不过10000,
//接下来就可以按照int来计算树根了
#include <iostream>
#include <string>
using namespace std;
int get_root(int origin) {
	if (origin < 10) {
		return origin;
	}
	int sum = 0;
	while (origin > 0) {
		sum += origin % 10;
		origin /= 10;
	}
	if (sum >= 10) {
		sum = get_root(sum);
	}
	return sum;
}
int main()
{
	string origin;
	while (cin >> origin) {
		int sum = 0;
		for (auto t = origin.begin();t != origin.end();t++) {
			sum = sum + (*t) - '0';
		}
		sum = get_root(sum);
		cout << sum << endl;
	}
}


发表于 2015-10-04 20:37:28 回复(1)

python解法:写了个递归函数来计算树根


def calcNumRoot(num):
    if sum(map(int, num)) >= 10:
        return calcNumRoot(str(sum(map(int, num))))
    else:
        return sum(map(int, num))


while True:
    try:
        print(calcNumRoot(input()))
    except:
        break
发表于 2017-10-13 08:40:55 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner=new Scanner(System.in);
        while(scanner.hasNext()){
            String str=scanner.next();
            while(str.length()>1){
                int result=0;
                for(int i=0;i<str.length();i++) 
                    result+=str.charAt(i)-'0';
                str=String.valueOf(result);
            }
            System.out.println(str);
        }
    }
}

发表于 2018-09-18 00:30:32 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        while(input.hasNext()){
            String a=input.next();
            int num;
            do{
                num=0;
                for(int i=0;i<a.length();i++){
                    num+=a.charAt(i)-48;
                }
                a=num+"";
            }while(num>=10);
            System.out.println(num);
        }
        input.close();
    }
}
发表于 2018-04-10 10:12:18 回复(0)
出题人说输入正整数,但用例实际上输入的是string类型:
#include <iostream>
#include <string>
using namespace std;
int main(){
    string str;
    while(cin >> str){
        int num =0;
        //先将每一位进行相加得到总和,防止数字过大
        for(int i = 0; i < str.size(); ++i){
            num += str[i] - '0';
        }
        int sum = 0;
        while(num){
            sum += num % 10;
            num /= 10;
            if(num == 0 && sum / 10 != 0){
                num = sum;
                sum = 0;
            }
        }
        cout << sum << endl;
    }
    return 0;
}


发表于 2020-06-27 11:39:46 回复(1)
#include <bits/stdc++.h>
using namespace std;

int main()
{
    string s;
    while (cin >> s) {
        int sum = 0; 
        for (int i = 0; i < s.size(); ++i) {
            sum += s[i] - '0';
        }
        while (sum > 9) {
            int c = 0;
            while (sum > 0) {
                c += sum % 10;
                sum /= 10;
            }
            sum = c;
        }
        cout << sum << endl;
    }
    return 0;
}

发表于 2018-02-20 21:38:14 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    //实现方法:得到树根
    public static int func(String n){
        //拿到各个位上的数字
        char[] arr = n.toCharArray();
        //各个位上的数字相加
        int sum = 0;
        for(int i = 0 ; i < arr.length; i++){
            sum += arr[i] - '0';
        }

        if(sum <= 9){
            return sum;
        }else{
            String s = String.valueOf(sum);
            return func(s);
        }
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            //输入一个数(题目给的范围太大了,int和long都不能用了,所以这里考虑用String)
            String n = in.nextLine();
            //求出树根
            int ret = func(n);
            System.out.println(ret);
        }
    }
}

发表于 2023-12-01 23:18:18 回复(0)
之前用int存储,但是看漏了题中给出的数字可能给出的大小,一个int类型根本无法存储,
导致算着算着就中断了,转成字符串就好了

public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) {
            // 注意 while 处理多个 case
            String n = in.nextLine();
            int sum = 0;
            int len = n.length() - 1;
            int i = 0;
            while (len >= 0) {
                sum += Integer.parseInt(String.valueOf(n.charAt(len)));
                len--;
                if (len < 0) {
                    if (sum / 10 > 0) {
                        n = String.valueOf(sum);
                        len=n.length()-1;
                        sum = 0;
                    }
                }

            }
            System.out.println(sum);

        }
    

发表于 2023-08-07 12:54:25 回复(0)
// write your code here cpp
#include<iostream>
#include<string>
using namespace std;
//////////////////////递归

int sum(int i) {
    if (i < 10) return i;
    return sum(i % 10 + sum(i / 10));
}
//////////////////////////////////
int main() {
    string s;
    while (cin >> s) {
        int a = 0;
        for (int i = 0; i < s.size(); ++i) {
            a += s[i] - '0';
        }
        cout << sum(a) << endl;
    }
    return 0;
}
发表于 2023-06-05 16:32:49 回复(0)
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()) {
            String str = scanner.next();
            while (str.length() > 1) {
                int result = 0;
                for (int i = 0; i < str.length(); i++)
                    result += str.charAt(i) - '0';
                str = String.valueOf(result);
            }
            System.out.println(str);
        }
    }
}
发表于 2023-04-09 16:44:05 回复(0)
int main()
{
	string n;
	int m = 0;
	int p = 1;
	while (cin >> n)
	{
		p = 1;
		while (p == 1)
		{
			m = 0;
			int i = n.size()-1;
			while (i >= 0)
			{
				char c = n[i];
				m += c - '0';
				i--;
			}
			if (m < 10)
			{
				cout << m << endl;
				p = 0;
			}
			else
			{
				n = to_string(m);
			}
		}
	}
	return 0;
}
题目上说输入一个正整数,但long long接收不下 最后只能用string类型?? 真离谱
发表于 2022-10-16 21:50:02 回复(0)
#include<bits/stdc++.h>
using namespace std;

int f(int x)//计算一个整数的各位和,最终为个位数时递归终止返回
{
    if(x<10)
    {
        return x;
    }
    
    int tmp = 0;
    while(x)
    {
        tmp += x%10;
        x/=10;
    }
    return f(tmp);
}

int main()
{
    string s;//最多输入长度为102的数字组合,就算102个9相加int也能装下;//
    while(cin>>s)
    {
        int sum = 0;
        for(int i = 0;i<s.size();i++)//则相当于放入第一次输入的大整数通过string将各位累加放入了int sum
        {
            sum+=s[i] - '0';
        }
        cout<<f(sum)<<endl;
    }
    return 0; 
}

发表于 2022-06-28 19:00:21 回复(0)
public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()){ String str = sc.nextLine(); while(str.length() > 1){ int sum = 0; for (int i = 0; i < str.length(); i++) {
                sum += str.charAt(i) - '0';
            }
            str = String.valueOf(sum);
        } System.out.println(str);
    }
}
发表于 2022-05-24 11:59:58 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            String s = sc.nextLine();
            while(s.length() > 1){
                char[] ch = s.toCharArray();
                int num = 0;
                for(int i = 0;i < ch.length;i++){
                    num += ch[i] - '0';
                }
                s = String.valueOf(num);
            }
            System.out.println(s);
        }
    }
}

发表于 2022-04-27 09:59:35 回复(0)
// 这道题一定先用string保存数字的各个位数之和
// 否则long long也存不下,数据丢失导致不通过
// 有的答案写的是递归,也非常巧妙,我的就是两个循环解决问题

#include <iostream>
#include <string>
using namespace std;

long long root(long long n)
{
    if(n <= 0)
        return 0;
    else if(n <= 9)
        return n;
    long long sum = 0;
    while(n >= 10)
    {
        sum = 0;
        while(n)
        {
            sum += n % 10;
            n /= 10;
        }
        n = sum;
    }
    return sum;
}

int main()
{
    string str;
    while(cin >> str)
    {
        // 首先对初始数据进行处理
        int n = 0;
        for(int i = 0; i < str.size(); i++)
            n += (str[i] - '0');
        cout << root(n) << endl;
    }
        
    return 0;
}

发表于 2021-11-07 22:43:26 回复(0)
// write your code here cpp
#include <iostream>
#include <string>
using namespace std;
int sum(int num)
{
    int ret = 0;
    while(num)
    {
        ret += num%10;
        num /= 10;
    }
    return ret;
}
int main()
{
    string str;
    while(cin >> str )
    {
        int ret = 0;
        for(int i = 0; i < str.size(); ++i)
        {
            ret += str[i] - '0';
        }
        while(ret/10)
        {
            ret = sum(ret);
        }
        cout << ret << endl;
    }
    return 0;
}
发表于 2021-05-24 18:55:14 回复(0)
#include<iostream>
#include<string>
using namespace std;

//这的用string,给的数字太大了,说的是整数其实的用字符串
int main()
{
    string nums;
    while(cin >> nums)
    {
        long long sum = 0;
        for(size_t i = 0; i < nums.size(); ++i)
        {
            sum += nums[i] - '0';
        }
        int ret = 0;
        while(sum>9)
        {
            ret += sum%10;
            sum /= 10;
            if(sum < 10)
            {
                ret += sum;
                if(ret > 9)
                {
                    sum = ret;
                    ret = 0;
                }
                else
                    break;
            }
        }
        ret = ret == 0?sum:ret;
        cout << ret << endl;
    }
    return 0;
}

发表于 2020-06-30 20:03:04 回复(0)