#include<stdio.h> int main() { int N; scanf("%d",&N); N=N*0.7; printf("%d",N); return 0; }

为什么输入100输出69?
还有题目是:从 A 开始,他把自己的 RP 平均分三份,自己的留下一份,其余 的两份分别分给 B 和 C。如果不能平均分 3 份,很不幸,那么多余 的 RP 就会凭空消失啦。 然后 B 和 C 也依次这么做了。我们的问题是,最后三个人分别有 多少的 RP 值。
输出三个整数,用空格间隔,表示经过三轮游戏后,A、B、C 分 别的 RP 值。
#include<stdio.h>
int main()
{
int x,y,z,n=1;
scanf("%d %d %d",&x,&y,&z);
while(n<=3)
{
x=x/3;
y=(x+y)/3;
z=(x+y+z)/3;
x=x+y+z;
n++;
}
printf("%d %d %d",x,y,z);
return 0;
}
为什么结果不对,就算是一人算一轮
#include<stdio.h>
int main()
{
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
x=x/3;
y=(x+y)/3;
z=(x+y+z)/3;
x=x+y+z;
printf("%d %d %d",x,y,z);
return 0;
}
答案也不对
题目补充:YP 的队伍的三个同学原本就具有一些 RP,其中 A 的 RP 值为 x , B 的 RP 值为 y , C 的 RP 值为 z。
第一题:
#include<stdio.h>
int main()
{
int N;
scanf("%d",&N);
N=N*0.7;
printf("%d",N);
return 0;
}
为什么输入100输出69?

    while (n <= 3) {
      // x 分人品
      x = x / 3;
      y = y + x;
      z = z + x;

      // y 分人品
      y = y / 3;
      x = x + y;
      z = z + y;

      // z 分人品
      z = z / 3;
      x = x + z;
      y = y + z;
      
      n++;
    }

追问

可以说明一下为什么我的算法错了吗,意思应该是一样的,还有你知道第一题是为什么吗?谢谢

追答

假设刚开始 A、B、C 三人的人品分别为 x0,y0,z0。
按正确算法分一轮:
x=x0/3
y=y0+x0/3
z=z0+x0/3

y=(y0+x0/3)/3
x=x0/3+(y0+x0/3)/3
z=z0+x0/3+(y0+x0/3)/3

z=(z0+x0/3+(y0+x0/3)/3)/3
x=x0/3+(y0+x0/3)/3+(z0+x0/3+(y0+x0/3)/3)/3
y=(y0+x0/3)/3+(z0+x0/3+(y0+x0/3)/3)/3
即:
x=16*x0/27+2*y0/9+z0/3
y=7*x0/27+4*y0/9+z0/3
z=4*x0/27+y0/9+z0/3

你的算法算一轮:
x=x0/3
y=(x0/3+y0)/3
z=(x0/3+(x0/3+y0)/3+z0)/3
x=x0/3+(x0/3+y0)/3+(x0/3+(x0/3+y0)/3+z0)/3

x=16*x0/27+4*y0/9+z0/3
y=x0/9+y0/3
z=4*x0/27+y0/9+z0/3
两种算法的结果显然是不一样的。
当总结一个算法比较困难时,按照题目中描述的步骤一步一步计算是比较简单的。

题目一原因:
浮点型不是精确的数值,当计算 N*0.7 时,计算出的结果是浮点型,浮点型直接类型转换成整型时会丢失精度,然后产生这种奇怪的结果,所以在写程序的时候要尽量避免这种转换。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-09-24
把每一步的各个变量的值,打印出来,看看是如何变化的