这个是题目
#include
int main()
{
int n,i,y,sum=0;
scanf("%d",&y);
for(i=1;sum<=y;i++)
{
sum+=i;
}
printf("Result: n=%d, sum=%d",i-2,sum-i+1);
return 0;
}
请问输出那里为什么是i-2和sum-i+1啊?谢谢
i-2的原因:当循环到某个i值时,执行了sum+=i,然后i+1,继续循环,检查发现sum<=y条件不成立,结束循环。那么显然在加上前一个i值时,sum值已经大于y了,所以这里前一个i值就是i-1。另外,当最后一次循环发现sum<=y不成立,结束循环时,i++还会执行一次,导致i又增加了1,所以最终满足条件的i值就是for循环结束后的i值减去2
sum-i+1的原因:sum-i+1就是sum - (i-1),同上面i-2的原因,循环结束后,sum值是大于y的,所以必须减去最后一次累加的值。由于for循环结束后,i++还会加1,所以实际是多加了i-1,因此sum要减去这个i-1才是实际的累加和,因此是sum-i+1
举个最简单的例子,假设Y输入的值是1,执行过程如下:
(1) i = 1 , sum=0, sum <=Y成立,执行 sum += i; sum=1,然后执行 i++,i变成2
(2) i = 2 , sum=1, sum <=Y成立,执行 sum += i; sum=3,然后执行 i++,i变成3
(3) i = 3 , sum=3, sum <=Y不成立,结束循环
从上面的步骤不难看出,在步骤(2)中,i=2,并且sum<=Y成立,但是这时候,sum实际只累加到1,还没有加2,但是sum<=Y成立,sum += i 依然执行,并且之后又执行了一次 i++; 所以,i 实际比要求的数多加了2,而sum比要求的数多加了(i-1),所以,最后n=i-2,而sum需要减去(i-1),即为:sum-(i-1),也就是sum - i + 1
因为最后一次循环,超过了Y,所以输出的时候,需要退回去1步。
1、开始的时候sum = 0,进入for 循环,i = 1,然后进行判断 sum <=y, 则进行i++,直到sum不满足条件时,此时sum > y,此时的i,后面有又进行了一次i++,因为在i-2的时候就已经达到了n的符合条件。
假设y = 10
i =1 sum=0<=10,sum = sum +i = 1,i=i+1=2
i=2 sum=1<=10,sum = sum +i = 3,i=3
i=3 sum=3<=10,sum = sum +i = 6,i=4
i=4 sum=6<=10,sum = sum +i =10,i=5
i=5 sum=10<=10,sum = sum +i = 15,i=6
i=6 sum=15>10 不满足条件 此时最大的 i = i-2=4
2、当sum不满足条件时 一定是经过了满足条件的i 值 相当于多加了一个 i -1 的值 所以要减去 最后的结果就是 sum - i +1