hnust 1048: Gardon的幸运数字
题目描述
有的人喜欢收集邮票,有的人喜欢收集CD,有的人喜欢收集书……
Gardon也有收集癖,然而他收集的是数字,而且是那些在他看来非常幸运的数字。Gardon觉得,如果一个数字模它的各个数位上的数字之和为0的话,那它就是一个幸运数字。比如说数字18就是一个幸运数字。因为它各个数位上的数字之和为1+8=9,18模9等于0。
Gardon是个怕麻烦的人,他不想自己去计算一个数字是不是幸运数字。所以作为Gardon的好朋友,你必须写个程序帮助他。
输入
有多组测试数据,每组数据输入一个整数n(1<=n<=1000000000)。
输出
如果数字n是幸运数字,输出”yes”,否则输出”no”。
样例输入 Copy
11
18
样例输出 Copy
no
yes
解题过程
根据题目提供的数据确定数据范围为超长整形
判断各位数字之和及其模
对代码的详细解析:
这段C语言代码是一个用于检查一个数是否为 Armstrong 数(也称为水仙花数)的程序。下面是对代码的详细解析:
-
头文件:
- 包含
<stdio.h>
、<stdlib.h>
和<cstring>
头文件,分别提供输入输出、动态内存分配和内存操作的功能。
- 包含
-
Handle_2 函数:
- 检查输入数据是否符合类型
-
无限循环读取输入:
- 使用
while(~scanf("%I64d",&M))
循环读取长整型变量M
,直到输入结束(scanf
返回值为0)。
- 使用
-
初始化变量:
- 定义
int k=0
用于存储M
的各位数字之和。 - 定义
long long S=M
用于存储M
的副本,以便进行操作。
- 定义
-
计算各位数字之和:
- 使用
while(S)
循环,通过取模和整除操作计算S
的各位数字之和,直到S
为0。
- 使用
潜在问题:
%I64d
是 Microsoft 特定的格式说明符,可能在非 Microsoft 编译器上不起作用。
改进建议:
- 考虑使用更通用的格式说明符
%lld
替代%I64d
。 - 可以添加对输入数据有效性的检查,确保读取的是整数。
- 为了代码的健壮性,可以检查
scanf
的返回值,确保每次读取都成功。
AC代码
#include <cstdio>
#include <cstdlib>
#include <cstring>
void Handle_2(void)
{
long long S,M;
while(~scanf("%I64d",&M))
{
int k=0;S=M;
while(S)
{
k+=S%10;
S/=10;
}
printf("%s\n",!(M%k)?"yes":"no");
}
}
int main()
{
Handle_2();
return 0;
}