链接
整数分类
题目
Description | ||
按照下面方法对整数x进行分类:如果x是一个个位数,则x属于x类;否则将x的各位上的数码累加,得到一个新的x,依次迭代,可以得到x的所属类。比如说24,2+4=6,则24的类别数是6;39,3+9=12,1+2=3,则39的类别数是3。 输入每行输入一个非负整数n,n≤10500,n为0时结束。 输出每行输出对应整数的分类数。 | ||
Sample Input | ||
24 39 0 | ||
Sample Output | ||
6 3 | ||
Source | ||
ericxie |
代码
#include<iostream>
using namespace std;
int main()
{
char s[510];
while(~scanf("%s",s))
{
if(s[0]=='0'&&s[1]=='\0') break;
bool flag=false;
if(s[1]=='\0'&&s[0]!='0')
{
flag=true;
printf("%d\n",s[0]-'0');
}
int i=0,q=0;
while(s[i]!='\0')
{
q+=(s[i]-'0');
i++;
}
int sum=0;
while(q>0)
{
sum+=(q%10);
q/=10;
while(sum>9&&q==0)
{
q=sum;
sum=0;
}
}
if(flag==false) printf("%d\n",sum);
}
return 0;
}
总结
1.难点是代码里面有一个迭代,我们处理一次可能无法得到答案,所以我们需要迭代处理
while(q>0)
{
sum+=(q%10);
q/=10;
while(sum>9&&q==0)
{
q=sum;
sum=0;
}
}
q是待处理的数据,sum是我们最后的答案,第二个while改成if可能更好理解,意思是交换两个数据,迭代处理
一个数字,我们要求最后一位数字,取模运算(对10取模),去除最后一位数字,除法运算 (除以10)
2.'\0'和0的意思是一样的,表示数组元素是空,‘0’,0,‘\0’,第一个的ASCII码是48,后面两个的ASCII码是0
3.特判
if(s[1]==0&&s[0]!='0')
{
flag=true;
printf("%d\n",s[0]-'0');
}
第二个数组元素是空的,只要第一个数组元素不是'0',就说明输入的数字是个位数,所以可以直接输出答案,注意字符转换成数字需要减去一个48(‘0’)
4.long long:-9223372036854775808~9223372036854775807;(即-2^63~2^63-1) ,19位,简单记为9e18,
int:-2147483648~2147483647;(即-2^31~2^31-1),10位,简单记为2e9
题目要求是500个0,501位,所以我们需要用数组来存储数字,因为超出了我们能存储的数据范围
和高精度加减乘除法类似:高精度加法
5.用一个循环把存在数组里面的元素加起来变成一个整数
int i=0,q=0;
while(s[i]!='\0')
{
q+=(s[i]-'0');
i++;
}
6.某一个板块没想清楚,很可能就卡在那里了,所以还是慢慢来,把所有细节想清楚,积累做法