zoukankan      html  css  js  c++  java
  • [mock]10月11日

    第二次mock。
    出的题是,假设有一个地区不能使用7,都用之后的数字代替,比如8代表7,18代表16(中间有7和17).那么给出一个这个地区的数X,求普通地区的数Y。
    首先是找规律,发现其实就是找给出的数X之前带有7的个数diff,然后输出就是X-diff。
    之后就是怎么找带有7的数字的个数。
    想的过程中,隐隐约约觉得,比如求一个数1394,那么应该要用到10以内或100以内的带7的数字的个数,于是就想把它们存起来。
    F[1]表示1~10之间的带7的数字,是1,然后F[2]表示1~100之间的,是19。
    然后推出了递推公式,F[i+1]=F[i]*9 - 10 ^(i+2)
    然后拿个数字做试验,结果一开始拿了个错误的数,678,还自以为有大于等于7和小于7的,但其实这个地区的数字不能有7。
    那么就拿58举例子,算出来之后觉得有点小,然后意识到这只是diff。
    接着写程序。中间犯过的小错误不断。一是x = x / 10之后,把x改掉了,但最后仍然ans = x - diff,就错了。二是写了10 ^ i当做求幂值,其实要用pow。三是循环里没有i++。然后是很多边界的i+1之类的。
    但整体这次感觉反应还行。
    代码: 

    int convert(int x)
    {
        int F[50];
        F[0] = 0;
        for (int i = 1; i <= 50; i++) 
        {
            F[i] = F[i - 1] * 9 + pow(10, i - 1); // F[2] = F[1] * 9 + 10 ^ 1; F[1] = F[0] * 9 + pow(10, 1-1) = 1;
        }
        
        int original = x;
        // calc how many num with 7 < x
        int diff = 0;
        int i = 0;
        while (x != 0)
        {
            int k = x % 10;
            x = x / 10;
            if (k < 7)
            {
                diff += F[i] * k;
            }
            else // k > 7
            {
                diff += F[i] * (k - 1) + pow(10, i);  // k == 8
            }
            i++;
        }
        int ans = original - diff;
        return ans;
    }
    

      

  • 相关阅读:
    将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片
    <bean:wirte>的用法
    bean标签库Struts标签库
    <bean:write/>标签的format属性
    ByteArrayOutputStream和ByteArrayInputStream详解
    <bean:write>的用法
    FLASH寿命测试!
    波特率,kbps,Mbps含义
    printf()函数是格式化输出!
    Qt学习Qt中的C++
  • 原文地址:https://www.cnblogs.com/lautsie/p/3364320.html
Copyright © 2011-2022 走看看