数根可以通过把一个数的各个位上的数字加起来得到。如果得到的数是一位数,那么这个数就是数根;如果结果是两位数或者包括更多位的数字,那么再把这些数字加起来。如此进行下去,直到得到是一位数为止。
比如,对于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; }