计算数根

输入一个数,输出它的树根。
比如:输入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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值