思路简单但有几个细节要注意一下。
法1.
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
int main(){
ll t,kas=0,n;
scanf("%d",&t);
while(t--){
scanf("%lld",&n);
ll m=(ll)sqrt(n+0.5),ans=0;
for(int i=1;i<=m;i++){//这里最好别写i*i<=n会加长运行时间
ans+=(n/i);
ans+=(n/i-n/(i+1))*i;
}
if(n/m == m) ans -= m;//整除会多加
printf("Case %lld: %lld\n",++kas,ans);
}
}
法2.
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
int main(){
ll t,kas=0,n;
scanf("%d",&t);
while(t--){
scanf("%lld",&n);
ll m=(ll)sqrt(n+0.5),ans=0;
for(int i=1;i<=m;i++)
ans+=n/i;
ans*=2;
ans-=m*m;
printf("Case %lld: %lld\n",++kas,ans);
}
}