zoukankan      html  css  js  c++  java
  • 鸽子数(快乐数)

    Problem Description

    通常来说,题面短的题目一般都比较难,所以我要把题面写得很长很长。
    通常来说,题面短的题目一般都比较难,所以我要把题面写得很长很长。
    通常来说,题面短的题目一般都比较难,所以我要把题面写得很长很长。
    鸽子数字由以下过程定义:从任何正整数开始,将数字替换为其各个数位的平方和,并重复该过程,直到该数字等于1。如果不能,则这个数字不是鸽子数。
    例如7是鸽子数,因为7->49->97->130->10->1。(7*7=49,4*4+9*9=97,9*9+7*7=130....如此类推)
    显然1是第一个鸽子数。
    有Q个询问,每个询问给出一个数k,你需要输出第k个鸽子数。

    Input

    第一行一个Q,代表询问的个数(Q<=100000)
    接下来Q行,每行一个数字k(k<150000)

    Output

    每行输出一个数,代表第k个鸽子数

    Sample Input

    
     

    2 1 2

    Sample Output

    
     

    1 7

    ps:开始死循环没找不是鸽子数在哪里断开。后来发现许多不是鸽子数最后都会到4. 

    2->4->16->37->58->89->145->42->20->4

    5->25->29->85->89->....->4

    6->36->45->41->17->50->25->...->4

    由此得出ac代码。

    鸽子数也叫快乐数。

    如果以4的话会超时。次数大于20次就可以了。

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    #define N 150010
    
    using namespace std;
    typedef long long ll;
    ll ans[N],x=1,y;
    
    void fun(){
        int i;
        for(i=1;x<150000;i++){
            ll a=i;
            ll k=0;
            int cnt=0;
            while(1){
                if(cnt>=20) break;
                while(a){
                   ll b=a%10;
                   k=k+b*b;
                   a/=10;
                }
                if(k==1){
                    ans[x++]=i;
                    break;
                }
                a=k;
                cnt++;
                k=0;
            }
        }
    }
    int main()
    {
        fun();
        int q,i;
        cin>>q;
        for(i=0;i<q;i++){
            int k;
            scanf("%d",&k);
            printf("%lld
    ",ans[k]);
        }
        return 0;
    }
    
  • 相关阅读:
    输入框只能输入数字
    浅谈语义化【转】
    用正则过滤敏感词
    js中操作数组的一些方法【转】
    js正则表达式校验非负整数:^d+$ 或 ^[1-9]d*|0$ 【转载】
    cookie
    JSON1:使用TSQL查询和更新 JSON数据
    基于jQuery实现的Tabs选项卡自定义插件
    基于jQuery实现的Accordion手风琴自定义插件
    点击div全选中div里面的文字
  • 原文地址:https://www.cnblogs.com/skyleafcoder/p/12319521.html
Copyright © 2011-2022 走看看