zoukankan      html  css  js  c++  java
  • 洛谷 P1362 兔子数

    题目描述

    设 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

    一看这道题 我就觉得是 道 数论题  然后 打表找规律  规律没找出来 然后想分块打表  最后写炸了

    居然是数论题~~~~~~~~~

    // 感谢来自二区 乡勇 的 题解
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int l,r,ans;
    int s[20010],n;
    void find(int x,int y,int z){
        long long a=x;
        a=a*a;
        int b=0;
        if(x>=l&&x<=r){
            while(a){b+=a%10;a/=10;}
            if(y*y==b) s[++n]=x;
        }
        if(z>r) return;
        for(int i=0;i<4;i++)
          find(x*10+i,y+i,z*10);
    }
    int main(){
        scanf("%d%d",&l,&r);
        find(0,0,1);
        sort(s+1,s+n+1);
        for(int i=1;i<=n;i++)
          if(s[i]!=s[i-1]) ans++;
        
        printf("%d
    ",ans);
        return 0;
    }
  • 相关阅读:
    [转]手工实现RTTI
    小楫轻舟
    百年孤独
    The power of now
    [转帖]Android平台下OpenGL初步
    设计模式六大原则(5):迪米特法则
    设计模式六大原则(4):接口隔离原则
    设计模式六大原则(3):依赖倒置原则
    设计模式六大原则(1):单一职责原则
    设计模式六大原则(2):里氏替换原则
  • 原文地址:https://www.cnblogs.com/suishiguang/p/6443591.html
Copyright © 2011-2022 走看看