精度处理:保留后8位小数,所以一开始要乘1e8然后再除1e8.
第一次代码
#include <iostream>
#include"cstdio"
#include"cstring"
using namespace std;
double a[105][105];
int main()
{
int i,j,n,t,x=1,o=0;
scanf("%d",&t);
while(t--){if(o==0) o=1;
else printf("\n\n");
memset(a,0,sizeof a);
scanf("%lf",&a[1][1]);
a[1][1]*=1000000000.0;
scanf("%d",&n);
printf("Case %d:\n",x++);
for(i=2;i<=n;i++){
for(j=1;j<=i;j++){
a[i][j]=(long long)((a[i-1][j]+a[i-1][j-1])*1.0/2);
}
}
for(i=1;i<=n;i++){
for(j=1;j<i;j++){
printf("%.8lf ",a[i][j]*1.0/1e8);
}
if(i==n) printf("%.8lf\n",a[i][j]*1.0/1e8);
else printf("%.8lf\n\n",a[i][j]*1.0/1e8);
}
}
}
虽然有了对精度的保留,但是在数字大的时候,double会算错,所以double只能对小数运算。
第二次ac代码
#include <iostream>
#include"cstdio"
#include"cstring"
using namespace std;
int main()
{
long long x;
double a[14][14],xxx;
int i,j,n,t,xx=1,o=0;
scanf("%d",&t);
while(t--){
if(o==0) o=1;
else printf("\n\n");
memset(a,0,sizeof a);
scanf("%lf",&xxx);
a[1][1]=xxx*1.0;
printf("Case %d:\n",xx++);
printf("%.8lf\n",a[1][1]);
scanf("%d",&n);
if(n>1) printf("\n");
for(i=2;i<=n;i++){
for(j=1;j<=i;j++){
a[i][j]=(a[i-1][j]+a[i-1][j-1])/2;
x=a[i][j]*1e8;
printf("%.8lf%c",x*1.0/1e8,i!=j?' ':'\n');
}
if(i!=n) printf("\n");
}
}
return 0;
}
直接对double里面的运算,输出的时候多加了一个*1e8 这样就完美了。