题目描述:我们称一个十进制正整数是幸运数当且仅当它只由数字4和7构成。现在给出一个正整数n,你需要计算由多少个不大于n的幸运数,由于答案可能非常大,你只需要输出答案除以1000000007后的余数。

输入:第一行包含一个整数n,1<=n<=10^100000

输出:输出对应的答案

测试样例:

125

6

21857711

254

朴素思路:逐个穷举

结果:超时,因为数目过大

思路受某位不知道姓名的大神指点,在此表示十分感谢O(∩_∩)O谢谢,思路说明:

符号说明:下面符号中,7xx表示x为4、或7,即744,777,747,774,共有2^2中可能性满足题意。

思路:由于数字仅由7、4组成,所以把满足要求的数字看做由7、4组成的“二进制”数字(7->1,4->0),这样当输入数字长度为n时,最少有种情况。

例如:441,,444,777,123,731,491,594,982,长度均为3,则最少的数目为6,分别是4,7,44,47,74,77。所以,需从最高位开始向右扫描,诸位判断情况:

case1:当前位置>7,说明此位置为7或4均可满足题意(例如982,那么7xx,4xx型均满足答案;),所以答案增加2^(n-i),i为当前位置下标(例如491,i=1时,9>7,那么47x,44x均满足要求,所以答案增加2^(3-1)=4种), 并且不用再向后判断。(因为从上例子可知后续结果已被包括,因为491>4xx)

case2: 当前位置==7,说明此位置为4可满足题意(例如777,那么4xx一定满足答案;731,那么4xx一定满足答案)但对于7xx是否满足,仍需继续扫描下一位判断;如果是最后一位为7,则最后一位7或4均满足答案,答案+2(如777,i=0,4xx满足;i=1,*4x满足;i=3,因为是最后一位,所以可以判断777,774满足条件,答案+2)

case3: 7>当前位置>4,说明此位置为4可满足题意(例如594,那么4xx一定满足,且594>4xx所以后续不用在判断,已经包含).

case4: 当前位置==4,类似于==7的情况,只不过不继续向后扫描,无法准确判断(由于441等情况的存在),但是当可以扫描至最后一位且最后一位为4时(例如444),则证明44...4情况可以存在,答案+1(例如444,在xx的情况下答案再加上444这一种情况)

case5:非4非7,不满足要求,停止扫描,把之前最扫描结果返回即可(如441,只有xx满足;123,只有xx满足;)

程序说明:因为10^100000 大概等于 4^160000(可取对数大概估算一下),所以预分配160000内存

import java.util.Scanner;public class LuckNum_4And7 {public static void main(String[] args){//输入n<=10^100000 约等于 4^160000 ,可以取对数算一下int[] Bit = new int[160000];int[] Sum = new int[160000];Bit[0] = 1 ;//2^0 = 1Sum[0] = 0 ;//Sum[0] = Bit[0]for(int i = 1;i<100010;i++){//初始化,把2的幂以及求和预先算一下,方便使用Bit[i] = Bit[i-1]*2%(1000000007);Sum[i] =( Sum[i-1] +Bit[i])%(1000000007);}Scanner sc = new Scanner(System.in);while(sc.hasNext()){String N = sc.nextLine();int lenth = N.length();int ans = Sum[lenth-1];//最短长度,例如:143,长度为三位,所以两位的长度一定满足for(int i=0;i<lenth;i++){//从最高位开始判断,判断712,741,474,444,447,132等几种情况if(N.charAt(i)>'7'){//当前位置大于头,以三位为例,如712,那么4xx的情况(x=4、7)均满足,那么两位xx的情况ans已求得,第三位又添加7、4两种情况ans += Sum[lenth-i];break;//之后全部满足,所以不用再往后按位检查}else if(N.charAt(i)<'7'&&N.charAt(i)>'4'){//当前位==7,那么当前位为4的情况一定可以通过,当前为7的可能性还须继续向下判断,所以结果累加上4xx的情况ans =(ans+Bit[lenth-i-1])%(1000000007);;break;//因为是4xx,之后全部满足,所以不用再往后按位检查}else if(N.charAt(i)=='7'){ans =(ans+ Bit[lenth-i-1])%(1000000007);;//因为为最后一位时,加的是bit[0]=1,但最后一位为7时 应包含两种情况xx7和xx4,所以再加1//if(i==lenth-1) ans++;}else if(N.charAt(i)=='4'){if(i==lenth-1) ans=(ans+1)%(1000000007);;}else{break;//此路不通}}System.out.println(ans);}}
}

幸运数47:给定正整数n,求不大于n的仅由4和7组成的数字的个数相关推荐

  1. 给一个不多于5位的正整数 12345①求出他是几位数 ②分别打印出每一位数字 ③按逆序打印出各位数字

    #include <stdio.h>//包含标准输入输出函数 #include <stdlib.h>//包含malloc动态地址分配 #include <string.h ...

  2. 没事刷刷LetCode——整除幸运数

    整除幸运数 题目描述 假定幸运数是只包含4或7的正整数,如7.47.判断一个正整数是否能被一个幸运数整除.是则输出YES,否则输出N0.不考虑负数,0或者其他特殊情况.不考虑流出或者超出整型范围的情况 ...

  3. c++ 【1101】给定正整数a,b,ca,b,c。求不定方程 ax+by=cax+by=c 关于未知数xx和yy的所有非负整数解组数。

    [题目描述] 给定正整数a,b,ca,b,c.求不定方程 ax+by=cax+by=c 关于未知数xx和yy的所有非负整数解组数. [输入] 一行,包含三个正整数a,b,ca,b,c,两个整数之间用单 ...

  4. 习题4-7 最大公约数和最小公倍数 求两个给定正整数的最大公约数和最小公倍数

    习题4-7 最大公约数和最小公倍数 (15分) 本题要求两个给定正整数的最大公约数和最小公倍数. 输入格式: 输入在一行中给出两个正整数M和N(≤1000). 输出格式: 在一行中顺序输出M和N的最大 ...

  5. 求一个正整数是由哪几个连数(连续的正整数)相加

    题目描述:随便给出一个正整数, 求出这个数是由哪几个正整数相加,要求相加的这几个数是连续的. 如: 7+8=15,4+5+6=15,1+2+3+4+5=15 Test.java: package co ...

  6. c语言中用递归求平方根,下列给定程序中,函数fun()的功能是:应用递归算法求某数a的平方根。求平方根的迭代公式如下: 例如 - 赏学吧...

    下列给定程序中,函数fun()的功能是:应用递归算法求某数a的平方根.求平方根的迭代公式如下: 例如,2的平方根为1.414214. 请改正程序中的错误,使它能得出正确的结果. 注意:不要改动main ...

  7. 求给定正整数m以内的素数之和

    编写程序求给定正整数m以内的素数之和. #include <stdio.h> #include <math.h> // 此函数用于判断是否为素数 int is_prime_nu ...

  8. 输入一个正整数,求该数的阶乘。询问用户是否愿意继续。(使用嵌套循环实现) 【提示】: 1.N 的阶乘公式为:n! = 1 × 2 × … × (n - 1) × n 2.

    #include <iostream> #include <cmath>using namespace std; int main() {int i = 1;//用于外部循环i ...

  9. 求小于或等于给定正整数k的所有素数

    编写函数int fun(int k, int a[])实现求小于或等于给定正整数k的所有素数并放在数组a中,该函数返回所求出素数的个数. #include <stdio.h> #inclu ...

最新文章

  1. 聊聊storm的stream的分流与合并
  2. 【组队学习】【35期】李宏毅机器学习(含深度学习)
  3. linux环境下运行open error,错误:运行OpenCL代码时clGetPlatformIDs -1001(Linux)
  4. 004 关于Java如何扫描指定package下所有的类
  5. 巨头拼杀下的IM市场,网易云信如何站上终极对决?
  6. kafka 集群启动失败:FATAL [KafkaServer id=0] Fatal error during KafkaServer startup.
  7. 【转帖】Reporting Service rdl报表,在aspx页面显示一张完整的RDL报表
  8. java xml文件无法打开,java – 无法打开beans.xml(配置文件)因为不存在
  9. ffdshow 源代码分析 7: libavcodec视频解码器类(TvideoCodecLibavcodec)
  10. 【渝粤教育】21秋期末考试基础会计10258k2
  11. Openstack api 学习文档 restclient使用文档
  12. Oracle long 类型转 varchar2
  13. python设置excel边框_用Python操作Excel电子表格?单元格边框如何设置?样式有哪些?...
  14. 一种分数微分基方法用于多尺度纹理增强(Fractional Differential Mask: A Fractional Differential-Based Approach for Multi)
  15. 织梦搜索页是那个php,修改织梦DEDECMS搜索页支持dede标签调用的方法
  16. Caused by: java.io.IOException: The temporary upload location [......] is not valid
  17. 8.10-8.13 shell的cut,sort_wc_uniq,tee_tr_split,特殊符号
  18. 泪目!上海00后小伙AI「复活」奶奶,100%还原音容笑貌,却引发巨大争议
  19. 2.基础语法:手指抽筋模拟器
  20. 一个博弈游戏,据说智商130才看的懂

热门文章

  1. 爬虫加tkinter做的中英互译小软件
  2. 使用zlib库进行数据压缩、解压缩
  3. matlab 音频fft,在wav文件和FFT的matlab中的Audioread
  4. 每年存1.4万,40年后你有多少钱,算完惊呆了!
  5. java时间字符串转时间戳
  6. EMNLP 2021信息抽取论文合集
  7. 层次聚类算法之single-linkage和complete-linkage(C语言实现)
  8. MySQL-修改数据库密码
  9. Python中的三目运算符(三元表达式)
  10. 拉格朗日对偶函数拉格朗日对偶问题