码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷 P1362 兔子数

时间:2017-02-26 10:56:42      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:blog   输入输出格式   space   lib   div   scan   code   pid   ble   

题目描述

设 S(N ) 表示 N 的各位数字之和,如 S(484) = 4+8+4 = 16, S(22) = 2+2 = 4。如果一个正整数满足 S(x*x) = S(x) *S(x),我们称之为 Rabbit N umber。比方说,22 就是一个 Rabbit N umber,因为 S(484) = S(22) *S(22)。

现在,给出一个区间 [L, R],求在该区间内的 Rabbit N umber 的个数。

输入输出格式

输入格式:

 

输入仅一行,为空格隔开的两个数 L 和 R。

 

输出格式:

 

输出仅一行一个整数,表示所求 Rabbit N umber 的个数。

 

输入输出样例

输入样例#1:
样例1:22 22

样例2:484 484

样例3:1 58

样例4:58 484

样例5:1000000000 1000000000
输出样例#1:
样例1:1

样例2:0

样例3:12

样例4:24

样例5:1

说明

1 <= L <= R <= 10^9

 屠龙宝刀点击就送

经过2.9G打表发现 

rabbit number的各位数字一定<=3

#include <cstdlib>
#include <cstdio>
#include <stack>
#include <cmath>

typedef long long LL;
using namespace std;

int maxn,L,R,l,d[200],i,ans;
LL geth(LL f)
{
    LL h=0;
    while(f)
    {
        h+=f%10;
        f/=10;
    }
    return h;
}
LL powe(LL a,LL b)
{
    LL base=a,r=1;
    while(b)
    {
        if(b&1)
        r*=base;
        base*=base;
        b>>=1;
    }
    return r;
}
void get(LL &x)
{
    x=0;
    for(i=1;i<=l;++i)
    x=x*10+d[l-i+1];
}
void wamn()
{
    LL n;
    get(n);
    if(n>R)
    {
        printf("%d",ans);
        exit(0);
    }
    LL m=powe(n,2);
    LL x=geth(n),y=geth(m);
    if(x*x==y) ans++;
    d[1]++;
    int k=1;
    while(d[k]>3)
    {
        d[k+1]+=1;
        d[k]=0;
        l=max(l,k+1);
        k++;
    }
    wamn();
}
int main()
{
    scanf("%d%d",&L,&R);
    stack<int>q;
    while(L)
    {
        d[++l]=L%10;
        L/=10;
    }
    wamn();
}

 

洛谷 P1362 兔子数

标签:blog   输入输出格式   space   lib   div   scan   code   pid   ble   

原文地址:http://www.cnblogs.com/ruojisun/p/6443574.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!