输入一个数,输出它的树根。
比如:输入12,就是要输出它各个位上的和,如果是个位数,就输出,否则就继续算他的个位上的和,此题就会输出3。
输入:39
输出:3
代码:
#include<iostream>
#include<string>
//数根
using namespace std;
//把一个string类型的数字串的各个位数字加起来
int cal_sum(string s) {
int sum= 0;
while (s.size() > 0) {
sum += (int)(s.back() - '0');//从字符串的最后一个字符开始累和,然后删除它,再继续向前计算。
s.pop_back();
}
return sum;
}
//把数字转成字符串类型
string inttostr(int m) {
string s;
while (m > 0) {
s.push_back((char)(m % 10 + '0'));//这里其实是反向存储了字符,不过对于此题没有影响,我们只是想获取它各个位上面的数值而已。
m /= 10;
}
return s;
}
//计算数根
int cal_answer(string s) {
string s1;
int m = 0;
if (s.size() == 1) {
return (int)(s[0] - '0');
}
else {
m = cal_sum(s);
while (m > 9) {
s1 = inttostr(m);
m = cal_sum(s1);
}
return m;
}
return m;
}
int main() {
string s;
cin >> s;
cout << cal_answer(s) << endl;
return 0;
}
用链表实现的代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
typedef struct linknode{
int data;
linknode *next;
}node,*lnode;
int num_sqrt(int n){
int sum=0;
int s,y;
s=n;
sum+=s%10;
s=s/10;
while(s!=0){
sum+=s%10;
s=s/10;
}
if(sum>9){
return(num_sqrt(sum));
}
else{
return sum;
}
}
int main(){
lnode head,p,q;
head=p=(lnode)malloc(sizeof(node));
int number;
scanf("%d",&number);
while(number!=0){
q=(lnode)malloc(sizeof(node));
q->data=number;
p->next=q;
p=q;
scanf("%d",&number);
}
p->next=NULL;
lnode r=head->next;
while(r!=NULL){
int answer=num_sqrt(r->data);
printf("%d\n",answer);
r=r->next;
}
return 0;
}