每日刷题(二十一)
蓝桥杯第八届C语言B组省赛习题
习题C:承压计算
这个题目还是很有意思的,这里有两点需要考虑,
第一,因为题目说每块原料的重量都平均落在下方的两个金属块上,而看到这个三角形结构,我们可以很快想到杨辉三角,也就是说我们可以把这个题当做二维数组来处理,按照题目意思得出一个公式a[i + 1][j] = a[i][j] / 2,a[i + 1][j + 1] = a[i][j] / 2.那么顺着这样的思路往下走,塔尖的7会分别给左右下面两个金属块3.5单位的重量,一层一层往下,3.5又会被细分为很小,而所得到的数字是远远超出C所能表示的精度的,那么我们就得换一种思维,我们先把它放大,统一把所有的值都乘以2^29次方,因为一共有29层,要让第三十层的电子秤接收重量,就得一直除以,做29次,一开始我写的代码是这样的
#include<stdio.h>
int main()
{
double a[30][30] = {0.0};
int i, j;
for(i = 0; i < 29; i++)
for(j = 0; j <= i; j++)
scanf("%lf",&a[i][j]);
printf("Now\n");
for(i = 0; i < 30; i++)
for(j = 0; j <= i; j++)
printf("%lf ",a[i][j]);
for(i = 0; i < 29; i++)
for(j = 0; j <= i; j++)
{
a[i + 1][j] += a[i][j] / 2;
a[i + 1][j + 1] += a[i][j] / 2;
}
printf("\n");
for(i = 0; i < 30; i++)
printf("%lf\n",a[29][i]);
return 0;
}
部分运行结果如下
可见最小的数是3点多,可是题目说读数最小的电子秤的示数为:2086458231,可见我之前考虑的是对的,我们需要把数字放大一下
我把他们总体都放大了2^29。
第二个要考虑的是输出结果的格式,这里我觉得数字会很大,所以我选择用long long定义了数组,输出以lld输出的
完整C代码如下
#include<stdio.h>
int main()
{
int i, j;
long long min = 3333333333ULL, max = 0ULL;
long long a[30][30] = {0};
long long k = 1;
for(i = 0; i < 29; i++)
{
k *= 2;
}
printf("%lld\n",k);
for(i = 0; i < 29; i++)
for(j = 0; j <= i; j++)
{
scanf("%lld",&a[i][j]);
a[i][j] *= k;
}
for(i = 0; i < 29; i++)
{
for(j = 0; j <= i; j++)
printf("%lld ", a[i][j]);
printf("\n");
}
// for(i = 0; i < 29; i++)
// printf("%d\n",a[i][i]);
printf("Now\n");
for(i = 0; i < 29; i++)
{
for(j = 0; j <= i; j++)
{
a[i + 1][j] += a[i][j] / 2.0;
a[i + 1][j + 1] += a[i][j] / 2.0;
}
}
for(j = 0; j < 30; j++)
{
if(a[29][j] < min)
min = a[29][j];
if(a[29][j] > max)
max = a[29][j];
}
printf("min : %lld max : %lld\n",min, max);
return 0;
}
部分运行结果如下
最小值对应题目所给的2086458231,那么最大值便是72665192664
直接提交72665192664即可,不要输出这么多数据,我这里是带大家分析
还有一个值得注意的地方,如果你的编译器出现了这个信息
这可能表明你的编译器版本不够新,面对long long这种类型的常量,需要在后面加上ULL,如图