一.数学函数——代码简化机
注:本章内容系自主研发,可能由于姿势不够,不知道这也许是传统算法,如有雷同,请在评论区告诉我。
1.获取整数位数
一般方式:循环
int d(int x) {
int sum = 0;
while(x) {
++sum;
x /= 10;
}
return sum;
}
数学函数:log10
讲解
每个整数都可以表示成科学记数法的形式,如
x
=
a
×
1
0
n
(
∣
a
∣
<
10
)
x=a\times 10^n(|a|<10)
x=a×10n(∣a∣<10)
令
D
=
x
的
位
数
,
令D=x的位数,
令D=x的位数,
∴
n
=
D
−
1
,
\therefore n=D-1 ,
∴n=D−1,
所以呢?
∴
n
=
l
o
g
10
(
x
)
\therefore n=log10(x)
∴n=log10(x)
∴ D = n + 1 = l o g 10 ( x ) + 1 \therefore D=n+1=log10(x)+1 ∴D=n+1=log10(x)+1
代码
int ldf_digits(int x) {
return log10(x) + 1;
}
2.开n次方(如:立方)
一般方式:二分迭代
double f(double x) {
return x * x * x;
}
double newton_sqrt(double n) {
double l = 0, r = n, mid;
while(l <= r)
{
mid = (l + r) / 2;
double x = f(mid);
if(fabs(x - n) < EPSLON) return mid;
else if (x - n > 0) r = mid;
else l = mid;
}
return -1;
}
数学函数:pow
讲解
纯数学公式
∵
a
m
n
=
a
m
n
\because a^{\frac{m}{n}}=\sqrt[n]{a^m}
∵anm=nam
∴ a n = a 1 n \therefore \sqrt[n]{a}=a^{\frac{1}{n}} ∴na=an1
而开立方就是把 n = 3 n=3 n=3代入上式。
代码
double ldf_sqrt(double n) {
return pow(n, 1.0/3.0);
}
停,别复制!
当n是负数时,函数会返回NAN。
我们不妨加上两行类似快读/快写的语句:
double ldf_sqrt(double n) {
int f = 1;
if(n < 0) f = -1;
return f * pow(n, 1.0/3.0);
}
优化:
求 a n ( n > 0 , n ∤ 2 ) \sqrt[n]{a}\quad(n>0, n\not| 2) na(n>0,n∣2) :
double sqrt(double a, int n) {
short f = 1;
if(a < 0) f = -1, a = -a;
return f * pow(a, 1.0 / n);
}