我事后想了一下,double被卡精度应该是过程中加到了一个比较大的数,double用了很多位去表示整数部分。办法就是利用一个long long去模拟,由于没有负数还可以是unsigned的,等于完整利用上了64位精度。具体操作就是在每次加上去前 *N,N是一个合适的较大值,最后再除掉,这样模拟了一个固定阶数的小数。代码放在下面,没有仔细调输出,并且也不能保证能ac,毕竟我没办法再测试了。另一种思路就是每次都将整数部分提取出来放到一个int里,这样double可以完整保留小数部分的精度。 #include<bits/stdc++.h> using namespace std; unsigned long long N=10000000000; unsigned long long M=N/10000; int main() {     int n=10000;     unsigned long long sum=0; if(n==1){ printf("1.0000\n"); return 0; }     for(int i=1; i<=n-1; i++){         int j=n-i;         if(abs(i-j)<2){             sum = sum + N*max(i,j);         }else{             sum = sum + N*min(i,j);             int k=abs(i-j);             unsigned long long temp=0;             for(int t=1; t<=k-1; t++){                 temp = temp + N*max(t, k-t);             }             sum = sum + temp/(k-1);         }     }     unsigned long long res = sum/(n-1); double ret = res/N + res%N/M; if(res%N/M==0) printf("%.4lf\n", ret);     else printf("%d.%d\n", res/N, res%N/M); }