注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Minary_Acdream

http://f10.moe/

 
 
 

日志

 
 

[hdu]1013 Digital Roots  

2012-08-12 09:46:55|  分类: HDU |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


Digital Roots

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 30250    Accepted Submission(s): 9283


Problem Description
The digital root of a positive integer is found by summing the digits of the integer. If the resulting value is a single digit then that digit is the digital root. If the resulting value contains two or more digits, those digits are summed and the process is repeated. This is continued as long as necessary to obtain a single digit.

For example, consider the positive integer 24. Adding the 2 and the 4 yields a value of 6. Since 6 is a single digit, 6 is the digital root of 24. Now consider the positive integer 39. Adding the 3 and the 9 yields 12. Since 12 is not a single digit, the process must be repeated. Adding the 1 and the 2 yeilds 3, a single digit and also the digital root of 39.
 

Input
The input file will contain a list of positive integers, one per line. The end of the input will be indicated by an integer value of zero.
 

Output
For each integer in the input, output its digital root on a separate line of the output.
 

Sample Input
24 39 0
 

Sample Output
6 3
 

Source

这题也算是水题,需要注意的是这题是一个大数问题,所以用字符串读入,代码如下。


#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<cmath>
using namespace std;
int main()
{
int i,n;
string s;
while (cin>>s,s != "0")
{
n = 0;
for (i=0;i < s.length(); i++)
{
n += s[i] - 48;
}
int temp;
while(n / 10 != 0)
{
temp = 0;
while(n)
{
temp += n % 10;
n = n / 10;
}
n = temp;
}
printf("%d\n",n);
}
return 0;

}







但是。其实这题还可以用合九法来做。
先来解释一下什么是合九法。
 如果把一个大数的各位数字相加得到一个和,再把这个和的各位数字相加又得一个和,再继续作数字和,直到最后的数字和是个位数为止,这最后的数称为最初那个数的“数字根”。这个数字根等于原数除以9的余数,因此这个计算过程常常称为“合九法”。

所以还可以把代码写成这样:
(这时要注意像9,18,99,加起来为9的数字,因为它求余为0,但实际应该为9)


#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<cmath>
using namespace std;

int main()
{
int i,n;
string s;
while (cin>>s,s != "0")
{
n=0;
for (i=0;i < s.length(); i++)
{
n += s[i] - 48;
n = n % 9;
}
if(n == 0) printf("9\n");
else printf("%d\n",n);
}
return 0;
}


拜访了其他博客后发现,其实还可以再把代码精简
由于直接n%9会出现问题,我们可以先把n-1,求余后再+1。


#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
#include<cmath>
using namespace std;

int main()
{
int i,n;
string s;
while (cin>>s,s != "0")
{
n=0;
for (i=0;i < s.length(); i++)
{
n += s[i] - 48;
}
printf("%d\n",(n - 1) % 9 + 1);
}
return 0;
}



  评论这张
 
阅读(293)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018