CCF 1035. 数根

1035. 数根 (Standard IO)

时间限制: 1000 ms  空间限制: 262144 KB  具体限制  

题目描述

数根是这样定义的:对于一个正整数n,将它的各个数位上的数字相加得到一个新数,如果这个数是一位数,我们就称之为n的数根,否则重复处理直到它成为一个一位数。
例如,n=34,3+4=7,7是一位数,所以7是34的数根。
再如,n=345,3+4+5=12,1+2=3,3是一位数,所以3是345的数根。
对于输入数字n,编程计算它的数根。
 

输入

输入正整数n。

输出

输出n的数根。

样例输入

345

样例输出

3

数据范围限制

1<=n<2^31

-------------------------------------------------------------------------

问题分析

这是一个层层递进的问题,所以使用了递归的方法,设定一个递归边界 if(strlen(b) == 1),就是当字符串的长度为1时,结束。

程序中使用了sprintf函数,把int转换成char数组来运算,因为如果直接用int去计算各个位上的和的话,需要用到 / 和 % ,会比较麻烦,转换成字符运算的话,相对比较简单。

程序代码

#include <iostream>
#include <cstring>
#include <stdlib.h>
using namespace std;
int getShuGeng(char* b);

char a[20];
int k;

int main()
{
	int n;
	cin >> n;
	sprintf(a,"%d",n); //一开始使用itoa(n,a,10);在dev是没有问题的,但是放到oj就报错
	getShuGeng(a);
	cout << k;
  return 0;
}

int getShuGeng(char* b)
{
	k = b[0]- '0';
	if(strlen(b) == 1)
		return b[0];
	for(int i=1;i<strlen(b);i++)
	{
		k += b[i] - '0';
	}
	sprintf(b,"%d",k);
	getShuGeng(b);
}

 

### 回答1: 好的,这是一个简单的编程问题,可以使用循环和取模运算来解决。以下是一个示例代码: ``` #include <stdio.h> int main() { int num, sum = 0; printf("请输入一个正整数:"); scanf("%d", &num); while (num > 0) { sum += num % 10; num /= 10; } printf("各个数位上的数字之和为:%d\n", sum); return 0; } ``` 如果输入12345,输出将是15。希望这可以帮到你! ### 回答2: 算法可以按照以下步骤进行: 1. 首先,将输入的正整数转换为字符串类型,以便逐个获取其每个数字。 2. 定义一个变量sum来累加每个数字的值,初始值设为0。 3. 使用循环遍历字符串中的每个字符,将字符转换为数字并累加到变量sum中。 4. 循环结束后,输出sum的值作为结果。 以下是具体实现的代码: ```python num_str = input("请输入一个正整数:") num_sum = 0 for digit in num_str: num_sum += int(digit) print("数位之和为:", num_sum) ``` 使用该代码,输入样式为12345,输出样式为15,结果与要求相符。 这个算法的时间复杂度为O(n),其中n为输入正整数的位数。 ### 回答3: 题目要求输入一个正整数,求其各个数位上的数字之和。 解题思路如下: 1. 首先,将输入的正整数转换成字符串,便于按位计算。 2. 初始化一个变量sum为0,用于累加各个数位上的数字。 3. 遍历字符串中的每一位数字,将其转换成整数后累加到sum上。 4. 遍历完毕后,输出sum作为结果。 例如,输入12345,按照上述步骤进行计算: 1. 将12345转换成字符串"12345"。 2. 初始化sum为0。 3. 遍历字符串中的每一位数字,依次累加到sum上:1+2+3+4+5=15。 4. 输出15。 因此,输入12345的结果为15。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NOI进阶之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值