问题
https://vjudge.net/problem/UVA-11986
分析
一开始的代码是这样的
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long LL;
const int maxn=100000+5;
int kase=0,T;
LL n;
int main(void){
scanf("%d",&T);
while(kase<T){
int ans=0;
scanf("%lld",&n);
if(n<3) ans=n;
else ans=ceil(log2(n+1));
printf("Case %d: %d\n",++kase,ans);
}
return 0;
}
但是有错误,log有精度误差,例如ceil(log(562949953421312+1))=50, 2 4 9 = 562949953421312 2^49=562949953421312 249=562949953421312,但是算出来却是49,所以要使用 long double
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <map>
#include <string>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long LL;
const int maxn=100000+5;
int kase=0,T;
LL n;
int main(void){
scanf("%d",&T);
while(kase<T){
int ans=0;
scanf("%lld",&n);
if(n<3) ans=n;
else ans=ceil(log2((long double)(n+1)));
printf("Case %d: %d\n",++kase,ans);
}
return 0;
}