关于printf与setprecision控制小数位数的差别,玄关
  • 板块学术版
  • 楼主mywzj_mo
  • 当前回复8
  • 已保存回复8
  • 发布时间2025/7/30 23:03
  • 上次更新2025/7/31 13:21:32
查看原帖
关于printf与setprecision控制小数位数的差别,玄关
753204
mywzj_mo楼主2025/7/30 23:03

我在做CF20D时,遇到一个有趣的问题。

以下代码会WA24:

#include<bits/stdc++.h>
using namespace std;
#define N 1003
#define eps 1e-12
int T,n,m,x,y;
double gs[N][N];
double grass(int n){
	for(int i=1;i<=n;++i){
		if(i<n)gs[i][i+1]/=gs[i][i];
		gs[i][n+1]/=gs[i][i];
		gs[i][i]/=gs[i][i];
		gs[i+1][i+1]-=gs[i][i+1]*gs[i+1][i];
		gs[i+1][n+1]-=gs[i][n+1]*gs[i+1][i];
		gs[i+1][i]-=gs[i][i]*gs[i+1][i];
	}
	for(int i=n-1;i>=1;--i)gs[i][n+1]-=gs[i][i+1]*gs[i+1][n+1];
}
int main(){
    cin>>n>>m;
    cin>>x>>y;
    n-=x;
    if(m==1){
    	printf("%.10f",n*2);
    	return 0;
	}
	while(n--){
		for(int i=1;i<=m;++i){
			if(i==1){
				gs[i][i]=2;
				gs[i][i+1]=-1;
				gs[i][m+1]+=3;
			}
			else if(i==m){
				gs[i][i]=2;
				gs[i][i-1]=-1;
				gs[i][m+1]+=3;
			}
			else{
				gs[i][i]=3;
				gs[i][i-1]=gs[i][i+1]=-1;
				gs[i][m+1]+=4;
			}
		}
		grass(m);
	}
	printf("%.10f",gs[y][m+1]);
}

而以下代码则会AC:

#include<bits/stdc++.h>
using namespace std;
#define N 1010
#define eps 1e-12
int T,n,m,x,y;
double gs[N][N];
void grass(int n){
	for(int i=1;i<=n;++i){
		if(i<n)gs[i][i+1]/=gs[i][i];
		gs[i][n+1]/=gs[i][i];
		gs[i][i]/=gs[i][i];
		gs[i+1][i+1]-=gs[i][i+1]*gs[i+1][i];
		gs[i+1][n+1]-=gs[i][n+1]*gs[i+1][i];
		gs[i+1][i]-=gs[i][i]*gs[i+1][i];
	}
	for(int i=n-1;i>=1;--i)gs[i][n+1]-=gs[i][i+1]*gs[i+1][n+1];
}
int main(){
    cin>>n>>m;
    cin>>x>>y;
    n-=x;
    if(m==1){
    	cout<<fixed<<setprecision(10)<<2*n;
    	return 0;
	}
	while(n--){
		for(int i=1;i<=m;++i){
			if(i==1){
				gs[i][i]=2;
				gs[i][i+1]=-1;
				gs[i][m+1]+=3;
			}
			else if(i==m){
				gs[i][i]=2;
				gs[i][i-1]=-1;
				gs[i][m+1]+=3;
			}
			else{
				gs[i][i]=3;
				gs[i][i-1]=gs[i][i+1]=-1;
				gs[i][m+1]+=4;
			}
		}
		grass(m);
	}
	cout<<fixed<<setprecision(10)<<gs[y][m+1];
}

可以看到,这两份代码只有输出方式的差别。为什么会出现一个WA,一个AC的情况呢?

求大神解答,玄关。

2025/7/30 23:03
加载中...