对于一个整数,我们定义它的数位和为各个数位的和。比如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~