c语言 计蒜客原题:雇佣兵
我感觉我做的没什么问题,但是计蒜客现实没有得到全部的分,希望大家帮我分析一下哪里没有考虑全面。
下面是我的的程序,我的想法已经标注过了
#include<stdio.h>
int main()
{
int m,n,x,reduce;
scanf("%d %d %d",&m,&n,&x);
for(int i=1;i<=x;i++)
{
if(x*n>=m)//能补满就补充能量
{
if(m%n==0)
reduce=m/n;//求用来恢复能量消耗的能量元素
else reduce=m/n+1;//求用来恢复能量消耗的能量元素
x=x-reduce;//求剩余的能量元素
n=n+m/n;//求战斗后的战斗力
}
else if(x*n<m)
break;
}
printf("%d",n);
return 0;
}
【以下回答由 GPT 生成】
问题分析:
m
和n
进行更新,导致计算出的结果可能不正确。reduce
变量的计算方式不正确,在if (m % n == 0)
分支中,应该用m / n
来计算,而不是m % n
。循环中的判断条件存在问题,在else if (x * n < m)
分支中,只判断了x * n < m
,而没有考虑其他情况的处理。
为什么在DevC++上调试结果是正确的?
下面是修复后的代码实现:
#include <stdio.h>
int main()
{
int m, n, x, reduce;
scanf("%d %d %d", &m, &n, &x);
for (int i = 1; i <= x; i++)
{
if (x * n >= m) // 能补满能量就补充能量
{
if (m % n == 0)
reduce = m / n; // 求用来恢复能量消耗的能量元素
else
reduce = m / n + 1; // 求用来恢复能量消耗的能量元素
x = x - reduce; // 求剩余的能量元素
n = n + reduce; // 求战斗后的战斗力
m = m - reduce * n; // 更新剩余的能量值
}
else
break;
}
printf("%d", n);
return 0;
}
修复后的代码更新了几个地方: - 在能补满能量的情况下,更新了剩余的能量元素x
,战斗力n
和剩余的能量值m
。 - 在循环的结束条件中,只要不能补满能量,就会跳出循环。
这样修复后的代码应该能解决原先的问题,确保计算结果的正确性。
【相关推荐】
第19行,输出里参数前面不需'&'符,修改如下,供参考:
#include<stdio.h>
int main()
{
int m, n, x, reduce;
scanf("%d %d %d", &m, &n, &x);
for (int i = 1; i <= x; i++)
{
if (x * n >= m)//能补满就补充能量
{
if (m % n == 0)
reduce = m / n;//求用来恢复能量消耗的能量元素
else reduce = m / n + 1;//求用来恢复能量消耗的能量元素
x = x - reduce;//求剩余的能量元素
n = n + m / n;//求战斗后的战斗力
}
else if (x * n < m)
break;
}
printf("%d", n); //printf("%d", &n); 修改
return 0;
}