数根可以通过把一个数的各个位上的数字加起来得到。如果得到的数是一位数,那么这个数就是数根;如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来。如此进行下去,直到得到是一位数为止。
比如,对于24 来说,把2 和4 相加得到6,由于6 是一位数,因此6 是24 的数根。
再比如39,把3 和9 加起来得到12,由于12 不是一位数,因此还得把1 和2 加起来,最后得到3,这是一个一位数,因此3 是39 的数根。
现在给你一个正整数,输出它的数根。
输入包含多组数据。
每组数据数据包含一个正整数n(1≤n≤10E1000)。
对应每一组数据,输出该正整数的数根。
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;
}
// 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;
}
//输入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;
}
}
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);
}
}
}
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();
}
}
#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;
} #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;
}
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);
}
}
} 之前用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);
}
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类型?? 真离谱
#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;
} 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); } }
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);
}
}
} // 这道题一定先用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;
} // 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;
}
#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;
}