zoukankan      html  css  js  c++  java
  • 牛客网 猜数游戏

    写在之前:刚开始写博客,可能会大量借鉴别人的思路,会在后面注明出处。希望写多了会有所突破~~

    本题来源于IT校招全国统一模拟笔试(秋招三模)编程题

    题目:

    牛牛和羊羊在玩一个有趣的猜数游戏。在这个游戏中,牛牛玩家选择一个正整数,羊羊根据已给的提示猜这个数字。第i个提示是"Y"或者"N",表示牛牛选择的数是否是i的倍数。例如,如果提示是"YYNYY",它表示这个数使1,2,4,5的倍数,但不是3的倍数。注意到一些提示会出现错误。例如: 提示"NYYY"是错误的,因为所有的整数都是1的倍数,所以起始元素肯定不会是"N"。此外,例如"YNNY"的提示也是错误的,因为结果不可能是4的倍数但不是2的倍数。现在给出一个整数n,表示已给的提示的长度。请计算出长度为n的合法的提示的个数。例如 n = 5:合法的提示有:YNNNN YNNNY YNYNN YNYNY YYNNN YYNNYYYNYN YYNYY YYYNN YYYNY YYYYN YYYYY所以输出12
    输入描述:
    输入包括一个整数n(1 ≤ n ≤ 10^6),表示已给提示的长度。
    输出描述:
    输出一个整数,表示合法的提示个数。因为答案可能会很大,所以输出对于1000000007的模
    输入例子1:
    5
    输出例子1:
    12

    题意:

    给定一个整数,表示字符串的长度。字符串包含只Y,N,第i个位置上(位置从1开始算起)为Y代表能被数字 i 整除,N代表不能。如果存在满足每个字符上的条件的数字,则称这个字符串是合法的。求合法字符串的个数。

    分析:

    首先了解以下概念,来源于百度百科

    质因数(素因数或质因子)在数论里是指能整除给定正整数质数

    质数(prime number)又称素数,有无限个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,这样的数称为质数。

    例子

    • 1没有质因子。
    • 5只有1个质因子,5本身。(5是质数。)
    • 6的质因子是2和3。(6 = 2 × 3)
    • 2、4、8、16等只有1个质因子:2(2是质数,4 =2²,8 = 2³,如此类推。)
    • 10有2个质因子:2和5。(10 = 2 × 5)

    除1以外,每个位置上的数有以下几种情况:

    1、如果质因子超过一个,则该位置上的字符是被唯一确定的。(这种情况下的数字都可以由几个素数或素数的K次幂而得)

                    例如数字6:如果2,3为NY、YN、NN,则位置6上的字符为N;如果2,3为YY,则位置6上的字符为Y

                    例如数字12:如果3,4为NY、YN、NN,则位置12上的字符为N,如果3,4为YY,则位置12上的字符为Y

    2、只包含一个质因数的数字。可以按质因子分类,因为包含不同质因子的数不会相互影响,这样可以使用乘法原理计数。因为其它数字都可以由范围内的素数及其K次幂的位置的情况这些组合而来,所以我们只需要考虑范围内的素数及其K次幂的位置的情况。

                   例如:n = 64 考虑2的次幂:

                             如果64是Y,那么32 16 8 4 2都要是Y;

              如果64是N,32是Y,16 8 4 2都要是Y;

           如果64 32是N,16是Y,8 4 2都要是Y;

           ...

           依次类推一共有7种情况(因为64 = 2^6,所以每个素数的情况数为指数加1)

                             即:对于只包含一个质因子的数p(对于2来说,就是2,4,8,16,32,64)在n(即题目中给的字符串长度 )范围内的p的幂次加1即为它的变化的情况数。

       将每个质数的情况数相乘即得合法字符串的个数。

    代码:

     1 import java.util.Scanner;
     2 
     3 public class GuessNumber {
     4 
     5     final static int MOD = (int) 1e9+7; //1e6代表10的6次方,e和E都可以
     6 
     7     public static void main(String[] args) {
     8 
     9         Scanner sc = new Scanner(System.in);
    10         int n = sc.nextInt();
    11 
    12         long ans = 1; //此处不能声明为int,因为如果为int的话,计算ans*(count+1)是按照int类型来运算的,此时溢出的话,结果已经出错,除非在计算时将数字强行转化为long,之后再转换为int。
    13         boolean[] visited = new boolean[n+1];
    14         for (int i=2; i<=n; i++){
    15             int count = 0;
    16             if (visited[i])
    17                 continue;
    18             for (int j=i+i; j<=n; j+=i){
    19                 visited[j] = true;
    20             }
    21             long temp = i; //此处不能声明为int,后面有temp*i可能会溢出
    22             while (temp<=n){
    23                 count++;
    24                 temp = temp*i;
    25             }
    26 
    27             ans = ans*(count+1)%MOD;
    28         }
    29         System.out.println(ans);
    30     }
    31 }

    注意:

    java中所有数字都是带符号的,没有unsigned。

    int在java中是固定的32bits,表示的范围为-2^31到2^31-1(补码的表示范围),即为-2147483648到2147483647

    关于溢出:

    1 long microsPerDay = 24 * 60 * 60 * 1000 * 1000;// 正确结果应为:86400000000
    2  System.out.println(microsPerDay);// 实际上为:500654080
    3  // 问题在于计算过程中溢出了。这个计算式完全是以int运算来执行的,并且只有在运算完成之后,其结果才被提升为long,而此时已经太迟:计算已经溢出。 
    4  // 解决方法使计算表达式的第一个因子明确为long型,这样可以强制表达式中所有的后续计算都用long运算来完成,这样结果就不会溢出:

              

    参考:

    http://www.jianshu.com/p/aa813b40f7ae

    https://www.nowcoder.com/discuss/30055?type=0&order=0&pos=21&page=3

    http://blog.csdn.net/define_danmu_primer/article/details/76162519

    http://www.cnblogs.com/-lpf/p/5996682.html

  • 相关阅读:
    lr 增强窗格中,如何生成调试信息?
    lr 自带的例子,如何进行关联,通过代码的函数进行实现
    lr11 录制脚本时候,无法自动启动ie,查了网上很多方法都未解决?
    loadrunner11 录制脚步不成功,在录制概要出现“No Events were detected”,浮动窗口总是显示“0 Events”,解决办法
    loadrunner11 安装及破解教程来自百度文库
    安装loadrunner11 ,出现如下错误如何解决?
    回收站数据删除了,如何进行恢复?
    网管工作方面——————打印机删除了然后开机重启他依然存在,如何解决
    Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126
    Sorry, the page you are looking for is currently unavailable. Please try again later. Nginx
  • 原文地址:https://www.cnblogs.com/WanJiaJia/p/7255504.html
Copyright © 2011-2022 走看看