Heim  >  Fragen und Antworten  >  Hauptteil

javascript - 问个算法题,已知QQ活跃天数,如何求等级

QQ活跃天数计算公式: (等级 + 4) * 等级 = 活跃天数
那么问题来了,已知活跃天数的情况下,如何逆推等级呢?
例如:活跃天数是100,(8 + 4) 8 = 96,(9 + 4) 9 = 117,100高于96但是低于117,所以是8级。
如何用程序去逆推出来?(数学弱,求小喷!)

阿神阿神2750 Tage vor1274

Antworte allen(11)Ich werde antworten

  • 巴扎黑

    巴扎黑2017-04-11 11:17:30

    求一下方程解,去掉负数那个;方程自己笔算。。

    function aa(y){
        return  parseInt(Math.pow(y+4,1/2)-2)
     }
      console.log(aa(100))

    Antwort
    0
  • 怪我咯

    怪我咯2017-04-11 11:17:30

    a方+4a=b

    a方+4a+4=b+4

    a=根号(b+4)-2

    代码的话,参考crp205的回答。

    Antwort
    0
  • 高洛峰

    高洛峰2017-04-11 11:17:30

    一元二次方程

    Antwort
    0
  • 天蓬老师

    天蓬老师2017-04-11 11:17:30

    我觉得这种算法,不需要逆推。而是将等级对应的天数列出来。然后通过区间的形式直接获取等级。公式归公式,但是逆推的时候不好推!如下为等级对应的天数(100级以内)

    等级 天数
    1 5
    2 12
    3 21
    4 32
    5 45
    6 60
    7 77
    8 96
    9 117
    10 140
    11 165
    12 192
    13 221
    14 252
    15 285
    16 320
    17 357
    18 396
    19 437
    20 480
    21 525
    22 572
    23 621
    24 672
    25 725
    26 780
    27 837
    28 896
    29 957
    30 1020
    31 1085
    32 1152
    33 1221
    34 1292
    35 1365
    36 1440
    37 1517
    38 1596
    39 1677
    40 1760
    41 1845
    42 1932
    43 2021
    44 2112
    45 2205
    46 2300
    47 2397
    48 2496
    49 2597
    50 2700
    51 2805
    52 2912
    53 3021
    54 3132
    55 3245
    56 3360
    57 3477
    58 3596
    59 3717
    60 3840
    61 3965
    62 4092
    63 4221
    64 4352
    65 4485
    66 4620
    67 4757
    68 4896
    69 5037
    70 5180
    71 5325
    72 5472
    73 5621
    74 5772
    75 5925
    76 6080
    77 6237
    78 6396
    79 6557
    80 6720
    81 6885
    82 7052
    83 7221
    84 7392
    85 7565
    86 7740
    87 7917
    88 8096
    89 8277
    90 8460
    91 8645
    92 8832
    93 9021
    94 9212
    95 9405
    96 9600
    97 9797
    98 9996
    99 10197
    100 10400

    Antwort
    0
  • PHP中文网

    PHP中文网2017-04-11 11:17:30

    给个简单的版本。用的解一元二次方程的公式。

    public class Solution {
    
        public static int getLevel(int days) {
            int i = 16 + 4 * days;
            double d = Math.floor(Math.sqrt(i));
            return (-4 + (int) d) >> 1;
        }
    
    }

    Antwort
    0
  • 天蓬老师

    天蓬老师2017-04-11 11:17:30

    //公式法:x=-b/2/a+Math.pow(Math.pow(b,2)-4*a*c,0.5)/2/a;
    
    function getQQRank(day) {
        day = 0 - +day;
        let rank = Math.floor(-2 + Math.pow(16 - 4 * day, 0.5) / 2);
        return rank
    }
    
    console.log(getQQRank(96)) //8
    console.log(getQQRank(100)) //8
    console.log(getQQRank(117)) //9

    Antwort
    0
  • 阿神

    阿神2017-04-11 11:17:30

    这就是个拟合的问题嘛……

    取前10个数,二阶拟合:

    结果在左边那个框里,95%的置信区间。
    p3太小了,可以直接省掉。
    所以结果就是:
    f(x) = x^2 + 4 * x

    Antwort
    0
  • ringa_lee

    ringa_lee2017-04-11 11:17:30

    以下的方法通过new Input(),在括号中传入当前活跃天数实例化,然后通过该实例的level方法取得当前等级。比如var le=new Input(100)
    console.log(le.level())//打印输出8
    
    js初学者,有错误希望大家更正,勿喷。
     var iGetANumber=0;
        function Input(val){//对象构造函数,传入活跃天数
            this.val=val;
        }
        Input.prototype.level=function(){//对象取得等级方法
            return getLevel(this.val)
        }
        function getLevel(input){
            iGetANumber
            if(iGetANumber*iGetANumber>=input+4){
                var  j=iGetANumber;
                iGetANumber=0
                return j-3
            }else{
                iGetANumber++;
                return getLevel(input)
            }
        }
    

    Antwort
    0
  • 大家讲道理

    大家讲道理2017-04-11 11:17:30

    一元二次方程

    Antwort
    0
  • PHP中文网

    PHP中文网2017-04-11 11:17:30

    感觉到我Python被无视了,补一下:

    def QQ(x):
        for n in range(1,101):
            if n*n + n*4 < x:
                continue
            else:
                return n

    Antwort
    0
  • StornierenAntwort