#5.数位和

对于一个整数,我们定义它的数位和为各个数位的和。比如456789的数位和为4+5+6+7+8+9也就是39;对于39,我们依然可以求数位和,为12;继续求,数位和为3,接下来无论再怎么求数位和,结果都是3,不会改变了。

输入一个正整数a,按照上述方式,我们对这个a不停地求数位和,直到结果不超过9为止。要求把所有的中间结果输出。

比如a=456789,那么它的数位和是39。继续对39求数位和,得到12,继续对12操作,得到3,就停止了。

输入格式:

一个正整数a。

输出格式:

若干行,为a不停地求数位和,直到不超过9为止的所有结果。

样例输入1

456789

样例输出1

39
12
3

样例输入2

86471648912748124790174817001304807

样例输出2

149
14
5

数据范围与限制:

时间限制:1s

空间限制:1GB

50%的数据,1≤a≤10^9。

80%的数据,1≤a≤10^18。

100%的数据,1≤a≤10^1000。


大致想法:高精度+数位和


思路:

首先是正常的输入,初始化(应该没啥问题)

看代码:

#include<bits/stdc++.h>
using namespace std;

int sum=0;
int a[1005];
char s[1005];
int la;

int main()
{
	scanf("%s",s+1);
	la=strlen(s+1);
	for (int i=1;i<=la;i++)
	{
		a[i]=s[la-i+1]-'0';
	}
…………………………………………………………………………
    return 0;
}

接着算出a的数位和,记为sum:

for (int i=1;i<=la;i++)
	{
		sum+=a[i];
	}

当sum<=9时,终止,然后输出

所以这里我们可以写一个while循环,然后要记得输出的时候换行

看代码:

while (sum>9)
	{	
		printf("%d\n",sum);
		int num;
		num=0;
	}

代码中定义了一个num,用来存放sum的数字和

故可再嵌一个while循环,算出sum的数字和,存入num,再赋给sum,即循环的第2遍输出:

while (sum!=0)
	{
		num+=sum%10;
		sum/=10;
	}
	sum=num;

输出最后一个<9的sum:

printf("%d\n",sum);

是不是很简单?(我觉得太水了,好像还是一道蓝桥杯的原题?(听同学说的))


完整代码如下:

#include<bits/stdc++.h>
using namespace std;

int sum=0;
int a[1005];
char s[1005];
int la;

int main()
{
	scanf("%s",s+1);
	la=strlen(s+1);
	for (int i=1;i<=la;i++)
	{
		a[i]=s[la-i+1]-'0';
	}
	for (int i=1;i<=la;i++)
	{
		sum+=a[i];
	}
	while (sum>9)
	{	
		printf("%d\n",sum);
		int num;
		num=0;
		while (sum!=0)
		{
			num+=sum%10;
			sum/=10;
		}
		sum=num;	
	}
	printf("%d\n",sum);
	return 0; 
} 

bye~

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值