zoukankan      html  css  js  c++  java
  • 205615872 能用来干么?

    今天有一个同事给我出一个考题它说

    小五 11:29:57
    不怕
    小五 11:32:30
    已知一个整形数组 int [] arr = new int[] { 1, 3,  9} ;
    小五 11:32:50
    这个数组内容,我们可以自己指定
    小五 11:33:04
    但是有个条件,数组的元素都是唯一的
    小五 11:33:24
    这是第一个约束条件:数组元素都是唯一。
    小五 11:34:02
    接着我们任意取出数组元素,比如取出1+3

    然后我们知道数组元素是唯一的话也可能会出现不同的解。 我就问要满足 哪种分解。 找出最多项的分解。或者最少项

    后面他可能就觉得不太对劲就给我这个网站

    http://sh.diyifangwu.com/ershoufang/pudong/

    看这个网站。

    点击不同的类别的子先项我们会发现他的连接都是数字。 它用数字来表示各种状态了。

    然后它的连接是组合起来的。
    http://sh.diyifangwu.com/ershoufang/pudong/1647360/ 比如这个数字它可以分解成 二室 和别墅
    http://sh.diyifangwu.com/ershoufang/pudong/16245504/ 这个又可以分解 50-70平方米

    然后哪个数字很明显的可以看到的是 等于哪单独三项之和。

    简单的说要做这个东西必须是这样的 【】【】【】【】有4个类每一个都需要去添哪个数字。并且我们知道如果这个空格间都是10进制的话我们就可以得出下面的特例了

    01 2 3 4 5 6 7 8 9

    10 20 30 40 50 60 70 80 90
    100 200 300 400 500 600 700 800

    1000 2000 3000 4000 5000 6000 7000 8000 9000


    如果最终结果是 8785 我们就可以知道 他是第四列的第8个 第三列的第7个 第二列的第8个 第一列的第 5 个

    用数学的表达式就是
    8785 / min(第四例)  就可以得到 8 对8785  对 min(第四例) 求模 可以得到 875 

    875/min(第三例) 875 对 min(第三例) 求模 可以得到 75

    后面就一直递归下去就知道结果了

    从上面我们还可以看到。 下一列的数必须是比上面的来得大。

    如果一列 要表示的状态要扩大的话。假设变成 20个

    0 1 2 3  4  5  6  7  8  9   A  B  C  D  E F G H I

    10  20 30 40 50 60 70 80 90 A0 B0 ...I0  转成 10 进制是 19 38 57 .... 342

    100 200 300 .....I00; 转成10进制就是 361 722 1083 。。。6498

    第二行就很关键了。

    它应该是 19 的 1次方 + 个位数

    哪这时候有一个数如果是 345 哪它应该是 除于 19 =18 就是第18位了 在求模一下等于3 就可以知道它是第三个了。

    如果数字是6500  除于361 等于 18 也是第18 个 在求模 递归 可以算到所有的

    我们来看一个我们在设计权限验证等也很经常用到的一种结构。 因为权限验证只需要两种状态。所以我们只需要二进制就可以表示它了。

    一个int 32是有32 位来可以来被使用

    每个权限位满足相加后可以分解必须做到的是跟上面一样

    0

    00 10

    000 100

    0000 1000

    00000 10000

    ....................

    可以做到32 位 注意这边的表示法是2进制 不是10进制

    这样假设有一个数是 8 我们直接分解成2进制 分别是1000 就表示千位的哪个数是正的。其这经 百位 10 位 个位的都是0.

     看完这些我们就可以知道上面的哪个网站也是这样搞的。为了简单分析。我们先找出它的最大公约数 (这个站比较贱啊)它的最大公约数是 6336

    这样我们得到第一排的数字了

    3 4 5 6 7                            这些数最大公约数 为 1

    192  256 320 384 448 512 (这些的最大公约数是 64 2的5 次方) 这样这一列就可以变成 3 4 5 6 7 8
    1728  2304 3328 3456 (这个数的最大公约数是 576  )  这样这一列又可以变成 3 4 5 6 7 8 这种形式了。

    22464 29952 37440 44928 (最大公约数是 7488 )这样一列也可以变成 3 4 5 6 7 8 9 的形式了。

    从这些看不太出来它是按哪一种进制进行的。

      我们可以想象一下它少掉一个 最大公约数是 32 的。

    他这个是按倍数扩大来使用的。也是有点意思。比如有一个值是205615872 除于 7488 除6336 得到 4.多。 就表示它是 4了。他的值为 “189775872” 然后就可以把这个值减掉了 得到 15840000。再去除 576  、得出4.多 也是第二个。。一直进行下去就行了。

    它这样设计也是可以的。 只要第二位的数值本身不重复 并满足于本身可以被整除掉就ok了。

    实际上可以归纳于 特殊进制的变化。 个位跟10位可能是64 位的。 10位跟百位是 576 位的。这边没有严格去推算。 只是大约是这种形态。 不像正常形态 每个进位是一样的。


  • 相关阅读:
    javascript小白学习指南1---0
    C++学习笔记11-面向对象2
    cocos2d-x 3.0正式版 vs2013配置
    awk命令拷屏
    java实现第四届蓝桥杯空白格式化
    java实现第四届蓝桥杯空白格式化
    java实现第四届蓝桥杯空白格式化
    java实现第四届蓝桥杯空白格式化
    java实现第四届蓝桥杯空白格式化
    java实现第四届蓝桥杯危险系数
  • 原文地址:https://www.cnblogs.com/lovebanyi/p/2053513.html
Copyright © 2011-2022 走看看