问题 C: 幸运数字II(4,7)

问题 C: 幸运数字II

时间限制: 1 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

数字4和7是幸运数字,而其他的都不是幸运数字。一个整数是幸运数字,当且仅当它的十进制表示只包含幸运数字。
现在让你给出第K大的幸运数字。

输入

第一行一个整数K(1<=K<=1,000,000,000)

输出

第K大的幸运数字。

样例输入
Copy

1

样例输出 Copy

4

首先把4和7化为0和1,分别对应起来看,题目就成了求第n位的二进制数。但是这个和普通的二进制数有点不一样,

各种进位的方法都不能用的进制转换的方法来套用。
所以首先打个草稿找规律 ( 真TM郁闷,每次比赛时无论怎么都找不到规律... )
/*0           -            -   2的1次-2
//1           4            0
//2           7            1   2的2次-2
//3          44           00
//4          47           01   2的2次-2+2的一次
//5          74           10
//6          77           11   2的3次-2
//7         444          000
//8         447          001 二进制1
//9         474          010 二进制2
//10        477          011 二进制3 2的3次-2+2的两次
//11        744          100 二进制4
//12        747          101 二进制5
//13        774          110 二进制6
//14        777          111   2的4次-2
//15       4444         0000
  ***      ****         ****
*/
可以看到很明显的几点:
1、当数字有1位时,出现了2次,
      当数字有2位时,出现了4次,
      当数字有n位时,出现了2^n次。
      所以根据这个规律可以根据十进制n来求出二进制有几位。
        for (int i=2;;i++)
            if( n <= pow(2,i)-2 )
              {length=i-1;break;}
      这样就求出了二进制的length。
2、在长度为length的区间内,前面一半的数字都是以4打头,后面都是以7打头,
如果去掉头位并且在10位数中减去相应的次数,就可以变成一个length-1的十进制数。例:
输入十进制数13  求出length=3
13   2^3-2+2^2和 2^4-2之间   二进制为774
减去2^3  得到十进制为5        二进制为74
减去2^2      得到十进制为1                 二进制位4
 
可以看到,当前最高位一步一步被取下来了。所以是一个很容易实现的循环

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<map>
#include <math.h>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
const int INF=0x3f3f3f3f;
const int maxn=5e5;
ll n;
int p;
void inint(){
    cin>>n;
}
int main(){
    inint();
    for(int i=2;i<=1e9;i++){
        ll o=pow(2,i)-2;
        if(n<=o){
            p=i-1;
            break;
        }
    }
    cout<<p<<endl;
    while(p--){
        int q=pow(2,p+1)-2+pow(2,p);
        if(n>q){
            printf("7");
            n-=pow(2,p+1);
        }
        else{
            printf("4");
            n-=pow(2,p);
        }
    }
} 

ac代码2;

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<map>
#include <math.h>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();}
    while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
    return x*f;
}
const int INF=0x3f3f3f3f;
const int maxn=5e5;
ll n;
int z;
char b[maxn];
map<int,int>mp;
void inint(){
    cin>>n;
}
int main(){
    inint();
    int l;
    for(int i=2;i<=1e9;i++){
        ll o=pow(2,i)-2;
        if(n<=o){
            z=i-1;
            l=n-(pow(2,i-1)-2)-1;
            break;
        }
    }
    if(l==0){
        for(int i=1;i<=z;i++){
            printf("4");
        }
    }
    else{
        int p=l;
        int zz=1;
        while(p){
            b[zz++]=p%2;
            p/=2;
        }
        int o=1;
        for(int i=z;i>=1;i--){
            if(b[i]==1){
                mp[o]=1;
            }
            o++;
        }
        for(int i=1;i<=z;i++){
            if(mp[i]==1){
                printf("7");
            }
            else{
                printf("4");
            }
        }
    }
}
 

原文地址:https://www.cnblogs.com/lipu123/p/12694695.html

时间: 2024-11-04 14:24:21

问题 C: 幸运数字II(4,7)的相关文章

bzoj4568 [Scoi2016]幸运数字

Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一些旅行者希望游览 A 国.旅行者计划乘飞机降落在 x 号城市,沿着 x 号城市到 y 号城市之间那条唯一的路径游览,最终从 y 城市起飞离开 A 国.在经过每一座城市时,游览者就会有机会与这座城市的幸运数字拍照,从而将这份幸运保存到自己身上.然而,幸运是不能简单叠加的,这一点游览者也十分清楚.他们迷

bzoj 4568: [Scoi2016]幸运数字

4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 848  Solved: 336[Submit][Status][Discuss] Description A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个 幸运数字,以纪念碑的形式矗立在这座城市的正中心,作为城市的象征.一些旅行者希望游览 A 国.旅行者计划 乘飞机降落在 x 号城市,沿着 x 号

【bzoj1853】 Scoi2010—幸运数字

http://www.lydsy.com/JudgeOnline/problem.php?id=1853 (题目链接) 今天考试考了容斥,结果空知道结论却不会写= = 题意:求区间中不含6,8两个数字及由6,8组成的数字的倍数的的数有几个 Solution  容斥原理.  先把所有的幸运数字都蒯到一个数组里,将两两之间可以整除的数只留下一个小的.  接下来如果暴力组合统计答案的话肯定会TLE,因为就算去掉了可以被整除的数以后还是有1000多个幸运数组.我们考虑dfs,x记录当前已经枚举到了第几个

2014.11.12模拟赛【美妙的数字】| vijos1904学姐的幸运数字

美妙的数字(number.c/.cpp/.pas) 题目描述 黄巨大认为非负整数是美妙的,并且它的数值越小就越美妙.当然0是最美妙的啦. 现在他得到一串非负整数,对于每个数都可以选择先对它做二进制非运算(模二意义下0.1互换,注意前导0也要交换),然后在任意相邻的两个数之间插入二进制与.二进制或,或者二进制异或.现在他想知道这样计算完产生的最美妙的数字是多少. 一共T组数据.对于每组数据,第一行一个n,表示这组数据中一串数有多少个.下面n个非负整数,表示这串数. 样例输入 2 2 3 6 3 1

关于4和7的幸运数字生成方法

所谓的4和7幸运数字指:4.7.44.47.74.77.444-- 第一个幸运数字为4,第七个幸运数字为444 以下采用了两种方法求第n位的幸运数字: 方法一:二进制思想 function luckyNumber(num) { //以4为0,7为1,利用二进制思想,思路参考来自http://blog.csdn.net/f2006116/article/details/52443975 //等比数列求和,要求解2^(n+1)-2<num的n值 var n = Math.floor((Math.lo

[bzoj1853][Scoi2010][幸运数字] (容斥原理)

Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是太少了,比如在[1,100]的区间内就只有6个(6,8,66,68,86,88),于是他又定义了一种“近似幸运号码”.lxhgww规定,凡是“幸运号码”的倍数都是“近似幸运号码”,当然,任何的“幸运号码”也都是“近似幸运号码”,比如12,16,666都是“近似幸运号码”. 现

[SCOI2010]幸运数字

题目背景 四川NOI省选2010 题目描述 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是太少了,比如在[1,100]的区间内就只有6个(6,8,66,68,86,88),于是他又定义了一种“近似幸运号码”.lxhgww规定,凡是“幸运号码”的倍数都是“近似幸运号码”,当然,任何的“幸运号码”也都是“近似幸运号码”,比如12,16,666都是“

1853: [Scoi2010]幸运数字[容斥原理]

1853: [Scoi2010]幸运数字 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 2405  Solved: 887[Submit][Status][Discuss] Description 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是太少了,比如在[1,100]的区间内就只有6个(6,8,

【bzoj1853】[Scoi2010]幸运数字 容斥原理+搜索

题目描述 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运号码”是十进制表示中只包含数字6和8的那些号码,比如68,666,888都是“幸运号码”!但是这种“幸运号码”总是太少了,比如在[1,100]的区间内就只有6个(6,8,66,68,86,88),于是他又定义了一种“近似幸运号码”.lxhgww规定,凡是“幸运号码”的倍数都是“近似幸运号码”,当然,任何的“幸运号码”也都是“近似幸运号码”,比如12,16,666都是“近似幸运号码”. 现在lxhgww