zoukankan      html  css  js  c++  java
  • [天梯赛]L2-029 特立独行的幸福

    L2-029 特立独行的幸福

    Description

    对一个十进制数的各位数字做一次平方和,称作一次迭代。如果一个十进制数能通过若干次迭代得到 1,就称该数为幸福数。1 是一个幸福数。此外,例如 19 经过 1 次迭代得到 82,2 次迭代后得到 68,3 次迭代后得到 100,最后得到 1。则 19 就是幸福数。显然,在一个幸福数迭代到 1 的过程中经过的数字都是幸福数,它们的幸福是依附于初始数字的。例如 82、68、100 的幸福是依附于 19 的。而一个特立独行的幸福数,是在一个有限的区间内不依附于任何其它数字的;其独立性就是依附于它的的幸福数的个数。如果这个数还是个素数,则其独立性加倍。例如 19 在区间[1, 100] 内就是一个特立独行的幸福数,其独立性为 2。

    另一方面,如果一个大于1的数字经过数次迭代后进入了死循环,那这个数就不幸福。例如 29 迭代得到 85、89、145、42、20、4、16、37、58、89、…… 可见 89 到 58 形成了死循环,所以 29 就不幸福。

    本题就要求你编写程序,列出给定区间内的所有特立独行的幸福数和它的独立性。

    Input

    输入在第一行给出闭区间的两个端点:1<A<B104​​。

    output

    按递增顺序列出给定闭区间 [ 内的所有特立独行的幸福数和它的独立性。每对数字占一行,数字间以 1 个空格分隔。

    如果区间内没有幸福数,则在一行中输出 SAD

    Examples

    Input

    10 40

    Output

    19 8 23 6 28 3 31 4 32 3

    注意:

    样例中,10、13 也都是幸福数,但它们分别依附于其他数字(如 23、31 等等),所以不输出。其它数字虽然其实也依附于其它幸福数,但因为那些数字不在给定区间 [10, 40] 内,所以它们在给定区间内是特立独行的幸福数。

    正确解法:

    只要for一遍,就好了。

    num数组记录到1经历了多少次。把中间经历的数都标记为-1

    如果最后到1就退出。到4就把这个数标记为-1,意思是 不是,然后退出。

    最后找没有标记为-1的数,然后输出就好了。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <set>
    #include <map>
    #include <vector>
    using namespace std;
    typedef long long ll;
    const int inf=0x7fffffff;
    const int N=10000+100;
    int has[N],num[N];
    void solve(int x)
    {
        int c=x;
        for(; ;)
        {
            int tt=0;
            while(x!=0)
            {
                tt+=(x%10)*(x%10);
                x=x/10;
            }
            num[c]++;
            if(tt==1)
                break;
            if(tt==4)
            {
                has[c]=-1;
                break;
            }
            has[tt]=-1;
            x=tt;
        }
    }
    bool check(int x)
    {
        if(x<=1)    return 0;
        for(int i=2;i*i<=x;i++)
            if(x%i==0)
                return 0;
        return 1;
    }
    int main()
    {
        int a,b;
        int flag=0;
        scanf("%d %d",&a,&b);
        for(int i=a;i<=b;i++)
        {
            solve(i);
        }
        for(int i=a;i<=b;i++)
            if(has[i]!=-1)
             {
                 flag=1;
                 if(check(i)==0)
                    cout<<i<<" "<<num[i]<<endl;
                 else
                    cout<<i<<" "<<num[i]*2<<endl;
             }
        if(flag==0)
            cout<<"SAD"<<endl;
    
        return 0;
    }
    View Code
    No matter how you feel, get up , dress up , show up ,and never give up.
  • 相关阅读:
    线段树专辑—— pku 1436 Horizontally Visible Segments
    线段树专辑——pku 3667 Hotel
    线段树专辑——hdu 1540 Tunnel Warfare
    线段树专辑—— hdu 1828 Picture
    线段树专辑—— hdu 1542 Atlantis
    线段树专辑 —— pku 2482 Stars in Your Window
    线段树专辑 —— pku 3225 Help with Intervals
    线段树专辑—— hdu 1255 覆盖的面积
    线段树专辑—— hdu 3016 Man Down
    Ajax跨域访问
  • 原文地址:https://www.cnblogs.com/Kaike/p/10647996.html
Copyright © 2011-2022 走看看