一个正整数的数字根是通过计算该整数的各位的和产生的。如果一个整数的个位和是一位整数,那么这个数字就是该整数的数字根。如果该整数的各位和是两位或多位整数,那么,就需要重复计算各位的和,直到获得一位整数。
例如,考虑正整数 24。把 2 与 4 相加得到 6。由于 6 是一个一位整数,所以,6 就是24 的数字根。现在再来考虑正整数 39。3 与 9 相加等于 12。因为 12 不是一位整数,因而,需要重复处理。再把 1 加 2 得到 3,现在 3 已是一个一位整数了,那么 3 就是 39 的数字根。
编写一个程序,接受一个正整数,并求出他的数字根。
非常简单的题目。将接收到的正整数当作字符串,没一位都对应成0到9中的一位,加起来。如果加起来的和不是各位数,则重复这一过程。那么可以清除的得到递归或者循环的思路!
#include <sstream>
#include <string>
#include <map>
using namespace std;
// 字符到数字的映射 '0'->0,'1'->1...
map<char,int> m;
// 初始化映射
void init()
{
int i;
for(i=0;i<10;i++)
{
m['0'+i]=i;
}
}
// 将数字转换为字符串
string convertToString(const unsigned int &x)
{
ostringstream o;
if(o<<x)
return o.str();
return "";
}
// 求数字根
int root(const string &s)
{
int i,sum;
string ss=s;
while(ss.length()>1)
{
for(sum=0,i=0;i<ss .length();i++)
{
sum += m[ss[i]];
}
ss = convertToString(sum);
}
return sum;
}
int main()
{
init(); // 初始化映射容器
unsigned int n;
cin>>n;
cout<<root(convertToString(n))<<endl;
return 0;
}
如果仔细观察一下数字根的产生规则,可以发现更方便的方法!每次取出数字中的一位与剩下的相加,循环往复到之剩下一位数为止。比如12345,那么它的数字根可以这样产生,1234+5得到1239,123+9得到132,13+2得到15,1+5得到6。与一次性分解开来相加是一样的结果。而实现这样的加法只需用%运算即可。
using namespace std;
int main()
{
unsigned int sum;
cin>>sum;
while(sum>10)
sum=sum/10+sum%10;
cout< <sum<<endl;
return 0;
}
两个程序真实天壤之别阿!哈哈!

哇咔咔…我滴沙发哦.
虽然没学过数字跟…
但是我看懂鸟
[回复]
大道至简
[回复]
Kada 回复:
二月 23rd, 2010 at 6:09 下午
评论至简
[回复]
我对数学一直很不感冒 这下你又弄数学 有点怪怪!
[回复]
Kada 回复:
二月 23rd, 2010 at 6:08 下午
回大人,你要是看看内容就不会责备我了。
[回复]
说真的我看不懂。。。悲哀
[回复]
努力学习
[回复]
我喜欢数学,但是荒废了。路过
[回复]
一看到算法就觉得头疼。呵呵
[回复]
个人对这类算法的理解就是 其实程序应该就是你思考量越大,写起来越简单,反之,写起来复杂,就像写个程序接方程一样,你要是这届算到这个方程的解的算式,那是最简单!
[回复]
現在才知這叫字根。
[回复]
的确,如果能求出每个位置的数字,那么真是很简单了。
[回复]