原题链接:Tom数
解题思路:
本题输入的数的范围是正整数1到pow(2,32),如此大的数,一般的数据类型(int long float double)还存不下。
所以用string字符串类型来保存输入的数。(C语言可以使用char *)
Tom数就是自身各位数字之和。
求字符串的各位数字之和可以倒序加,把最后一位字符转换成数字,一位一位的向前推进,结果放在sum变量中,不用考虑进位,非常简单。
注意事项:
注意OJ系统的数据测试是一组一组的测试,不是说让你把所有的数据全部输入,再把数据全部输出。
参考代码:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string a;
int aa,sum;
while(cin>>a)
{
sum=0;
int lena=a.size(); //字符串的长度
while(lena>0)
{
aa=a[lena-1]-'0'; //转换成数字
sum+=aa; //累加
lena--; //向前推进
}
cout<<sum<<endl;
}
return 0;
}测试环境:
Windows 10 China Huawei Source Insight 4.0
Linux Debain Ubuntu/Kali g++
程序测试:

0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
#include<stdio.h> int main() { int i; int sum=0; int n,n1=0,n2=0,n3=0,n4=0,n5=0,n6=0,n7=0,n8=0,n9=0; scanf("%d",&n); while(n%10!=0) { n=n-1; n1++; } while(n%100!=0) { n=n-10; n2++; } while(n%1000!=0) { n=n-100; n3++; } while(n%10000!=0) { n=n-1000; n4++; } while(n%100000!=0) { n=n-10000; n5++; } while(n%1000000!=0) { n=n-100000; n6++; } while(n%10000000!=0) { n=n-1000000; n7++; } while(n%100000000!=0) { n=n-10000000; n8++; } while(n%1000000000!=0) { n=n-100000000; n9++; } sum=n1+n2+n3+n4+n5+n6+n7+n8+n9; printf("%d",sum); ret@栗子 while(scanf("%lld",&n)) 这个终止条件是直接回车,但是输入流的^Z(EOF),所以可能是它检测到你在该结束的时候(EOF)没有结束怎么样算一组一组测试?我的代码提交说输出超限,可是看题干的输入也没有终止条件呀 #include<stdio.h> int main() { long long n,sum; while(scanf("%lld",&n)) {sum=0; while(n!=0) { sum=sum+n%10; n=n/10; } printf("%lld\n",sum); } return 0; }