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;
    }
  • 相关阅读:
    操作系统复习
    软件工程复习
    2020字节跳动校园招聘算法方向第二场考试题解(部分)
    【牛客】用两个栈来实现一个队列
    LeetCode 62. 不同路径
    LeetCode 79. 单词搜索
    LeetCode 113. 路径总和 II
    LeetCode 389. 找不同
    【牛客】矩阵交换
    【牛客】KiKi学习了结构体和指针
  • 原文地址:https://www.cnblogs.com/suishiguang/p/6443591.html
Copyright © 2011-2022 走看看