求数字根小算法

  一个正整数的数字根是通过计算该整数的各位的和产生的。如果一个整数的个位和是一位整数,那么这个数字就是该整数的数字根。如果该整数的各位和是两位或多位整数,那么,就需要重复计算各位的和,直到获得一位整数。

  例如,考虑正整数 24。把 2 与 4 相加得到 6。由于 6 是一个一位整数,所以,6 就是24 的数字根。现在再来考虑正整数 39。3 与 9 相加等于 12。因为 12 不是一位整数,因而,需要重复处理。再把 1 加 2 得到 3,现在 3 已是一个一位整数了,那么 3 就是 39 的数字根。

  编写一个程序,接受一个正整数,并求出他的数字根。

  非常简单的题目。将接收到的正整数当作字符串,没一位都对应成0到9中的一位,加起来。如果加起来的和不是各位数,则重复这一过程。那么可以清除的得到递归或者循环的思路!

#include <iostream>
#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。与一次性分解开来相加是一样的结果。而实现这样的加法只需用%运算即可。

#include <iostream>
using namespace std;

int main()
{
    unsigned int sum;
    cin>>sum;

    while(sum>10)
        sum=sum/10+sum%10;
    cout< <sum<<endl;
   
    return 0;
}

  两个程序真实天壤之别阿!哈哈!




Related posts

, ,
Address: http://blog.okkey.net/1097.html,转载请注明出处。
Trackback

12 comments untill now

  1. 哇咔咔…我滴沙发哦.
    虽然没学过数字跟…
    但是我看懂鸟

    [回复]

  2. 大道至简

    [回复]

    Kada 回复:

    评论至简

    [回复]

  3. 我对数学一直很不感冒 这下你又弄数学 有点怪怪!

    [回复]

    Kada 回复:

    回大人,你要是看看内容就不会责备我了。

    [回复]

  4. 说真的我看不懂。。。悲哀

    [回复]

  5. 努力学习

    [回复]

  6. 我喜欢数学,但是荒废了。路过

    [回复]

  7. 一看到算法就觉得头疼。呵呵

    [回复]

  8. 个人对这类算法的理解就是 其实程序应该就是你思考量越大,写起来越简单,反之,写起来复杂,就像写个程序接方程一样,你要是这届算到这个方程的解的算式,那是最简单!

    [回复]

  9. 現在才知這叫字根。

    [回复]

  10. 的确,如果能求出每个位置的数字,那么真是很简单了。

    [回复]

Add your comment now