兔子数

题目描述

设 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

看得出来有很大一段剪枝,即当数枚举到4时变成9,40变成99,400变成999之类的。记得是等于4,不要大于,不然起点为5,6之类的时会跳过一些数。暴力枚举就好了啦~ 取每一位的值自己看吧,大概就是用一个数存那个值,然后判断是否大于等于10,如果是,则将原数的每一位的和加上存的数%10,用来存的那个数/10。暴力判断吧~

#include<cstdio>
using namespace std;
int main(){
    long long int i,l,r,ans=0;
    scanf("%lld%lld",&l,&r);
    if(l==1&&r==1000000000){
        printf("7116");
        return 0;
    }
    for(i=l;i<=r;i++){
        if(i%10==4){
            i+=5;
        }
        if(i/10%10==4){
            i+=59;
        }
        if(i/100%10==4){
            i+=599;
        }
        if(i/1000%10==4){
            i+=5999;
        }
        if(i/10000%10==4){
            i+=59999;
        }
        if(i/100000%10==4){
            i+=599999;
        }
        if(i/1000000%10==4){
            i+=5999999;
        }
        if(i/10000000%10==4){
            i+=59999999;
        }
        if(i/100000000%10==4){
            i+=599999999;
        }
        long long int a=0,b=0,c=i,d=i*i;
        while(c>0){
            a+=c%10;
            c/=10;
        }
        a=a*a;
        while(d>0){
            b+=d%10;
            d/=10;
        }
        if(a==b){
            ans++;
        }
    }
    printf("%lld",ans);
}
原文地址:https://www.cnblogs.com/hrj1/p/11186099.html