关于向上取整和向下取整知识整理
向下取整函数 f(x)=⌊x⌋ 是单调递增的 ,向上取整函数 f(x)=⌈x⌉也是单调递增的。
对任意整数n,
⌈2n⌉+⌊2n⌋=n
⌈bn⌉=⌊bn+b−1⌋
对任意 实数 x≥0和整数 a,b>0
⌈b⌈x/a⌉⌉=⌈abx⌉
⌈b⌈x/a⌉⌉=⌈abx⌉
⌈ba⌉≤ba+b−1
以上参考《算法导论》第三版
令 fn(x)=⌈xn⌉,x∈[1,n],那么 fn(x)的结果有 O(n)种,取法如下:
- 令 i=n
- 令 last=⌈⌈n/i⌉n⌉ ,那么 ⌈in⌉ 是一个解,且该解对应的最小整数 last满足 f(last)=⌈in⌉
- 令 i=last−1,如果 i>0返回第二步
代码表示:
int cdiv(int a,int b)// a/b的向上取整
{
return (a+b-1)/b;
}
void work(int n)
{
int tol=0;
for(int i=n,last;i>0;i=last-1,tol++)
{
cout<<"f(x):"<<cdiv(n,i)<<endl;//print the solutions
last=cdiv(n,cdiv(n,i));
}
cout<<"The number of solutions :"<<tol<<endl;
}
int main()
{
int n;
cin>>n;
work(n);
}
令 fn(x)=⌊xn⌋,x∈[1,n],那么 fn(x)的结果有 O(n)种,取法如下:
- 令 i=1
- 令 last=⌊⌊n/i⌋n⌋,那么 ⌊in⌋ 是一个解,且该解对应的最大整数 last满足 f(last)=⌊in⌋
- 令 i=last+1,如果 i<=n,则返回第二步
代码表示:
int fdiv(int a,int b)
{
return a/b;
}
void work(int n)
{
int tol=0;
for(int i=1,last;i<=n;i=last+1,tol++)
{
cout<<"f(x):"<<fdiv(n,i)<<endl;//print the solutions
last=fdiv(n,fdiv(n,i));
}
cout<<"The number of solutions :"<<tol<<endl;
}
int main()
{
int n;
cin>>n;
work(n);
}