素材牛VIP会员
问个算法题,已知QQ活跃天数,如何求等级
 邓***一  分类:Python  人气:1980  回帖:11  发布于6年前 收藏

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

讨论这个帖子(11)垃圾回帖将一律封号处理……

Lv3 码奴
威***军 职业无 6年前#1
//公式法: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
Lv6 码匠
捂***功 移动开发工程师 6年前#2

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

取前10个数,二阶拟合:

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

Lv5 码农
pa***in 技术总监 6年前#3

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

def QQ(x):
    for n in range(1,101):
        if n*n + n*4 < x:
            continue
        else:
            return n
Lv3 码奴
走***一 交互设计师 6年前#4

一元二次方程

Lv5 码农
雷***g 学生 6年前#5

不懂一元二次方程可以参考这里: $$(x+4)*x=100$$

Lv5 码农
阿***t JS工程师 6年前#6

a方+4a=b

a方+4a+4=b+4

a=根号(b+4)-2

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

Lv7 码师
飞***天 学生 6年前#7
以下的方法通过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)
        }
    }
Lv6 码匠
hj***jh 软件测试工程师 6年前#8

我觉得这种算法,不需要逆推。而是将等级对应的天数列出来。然后通过区间的形式直接获取等级。公式归公式,但是逆推的时候不好推!如下为等级对应的天数(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
Lv1 新人
冷***知 职业无 6年前#9

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

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;
    }

}
Lv6 码匠
Ho***95 UI设计师 6年前#10

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

function aa(y){
    return  parseInt(Math.pow(y+4,1/2)-2)
 }
  console.log(aa(100))
上一页12下一页
 文明上网,理性发言!   😉 阿里云幸运券,戳我领取