QQ活跃天数计算公式: (等级 + 4) * 等级 = 活跃天数
那么问题来了,已知活跃天数的情况下,如何逆推等级呢?
例如:活跃天数是100,(8 + 4) 8 = 96,(9 + 4) 9 = 117,100高于96但是低于117,所以是8级。
如何用程序去逆推出来?(数学弱,求小喷!)
巴扎黑2017-04-11 11:17:30
求一下方程解,去掉负数那个;方程自己笔算。。
function aa(y){
return parseInt(Math.pow(y+4,1/2)-2)
}
console.log(aa(100))
天蓬老师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 |
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;
}
}
天蓬老师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
阿神2017-04-11 11:17:30
这就是个拟合
的问题嘛……
取前10个数,二阶拟合:
结果在左边那个框里,95%的置信区间。
p3太小了,可以直接省掉。
所以结果就是:f(x) = x^2 + 4 * x
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)
}
}
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