解题思路:

本题输入的数的范围是正整数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++

程序测试:

微信图片_20190109182637.png

点赞(1)
 

0.0分

2 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 4 条评论

向志权 11月前 回复TA
#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
栗子 1年前 回复TA
@栗子 后面刷到了知识点,就是用while(scanf(“%d”,&a)!=EOF)的话,acm里的在线测试和提交都可以检测,但是如果我devilC++的话是通过Ctrl z结束吗?然后&quot和&amp是什么呀
叮当 1年前 回复TA
@栗子 while(scanf("%lld",&n)) 这个终止条件是直接回车,但是输入流的^Z(EOF),所以可能是它检测到你在该结束的时候(EOF)没有结束
栗子 1年前 回复TA
怎么样算一组一组测试?我的代码提交说输出超限,可是看题干的输入也没有终止条件呀
#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;
	
 }