c语言循环的问题,c primer plus第六版第六章第18题

题目大概是,某人刚开始有5个朋友,他的朋友数量以下面方式增长:第1周少1个朋友,剩下的朋友数量翻倍;第二周少2个朋友,剩下的朋友数量翻倍.......第N周少N个朋友,剩下的朋友数量翻倍。
编写一个程序显示这个人每周朋友的数量,直到朋友数量<=150.
这是我写的
#include
int main(void)
{
int fr[200], i=0;

while (fr[i] < 150) {
    fr[0] = 5;
    fr[i] = (fr[i] - i + 1) * 2;
    i++;
}
for (i = 0; fr[i] <150; i++)
    printf("at %dd week there are %3d friends\n", i, fr[150]);
getchar();
return 0;

}
然后调试
图片说明
就是这样,谢谢
(我在想能否用数组的方式实现)

#include
#include

int main(void)
{

int f = 5;
int i = 1;
while (1)
{
    f = (f - i) * 2;
    if (f >= 150)
        break;
    printf("%d ,%d\n", i, f);
    i++;
}

system("pause");
return 0;

}

 #include <stdio.h>
int main()
{
 int f=5;
 int i=1;
 while(f<=150){
     f-=1;
     f*=2;
     if(f<=150)
     printf("第d%d朋友数量朋友数量朋友数量%d\n",i,f);
     i++;
 }
   return 0;
}
#include \<iostream\>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
int main()
{
    int n=5;
    for(int i=1;;i++)
    {

        n -= i;
        n *= 2;
        if(n>150)break;
        cout<<"第"<<i<<"周朋友数为:"<<n<<endl;
    }
    return 0;
}

图片说明

  先说说你的程序。
  首先,如果你一定想用数组的话,需要把输出语句printf中的fr[150]改成fr[i]否则的话你后一个数字永远都是fr[150]的数据,也就是第150周的朋友数目。
  其次,while语句有些问题,当前判断条件是fr[i] < 150,但是此时的fr[i]是还没赋值的新的单位,所以这个判断一点用处都没有。建议把fr[0]的赋值放到外面,这样while语句判断的时候会判断此时是否超过了150,没超过的话进行下一天的朋友数计算。
  最后,i++要在朋友数目运算之前。因为你判断当第i周朋友数不足150,将计算i+1周的朋友数。而且语句应该是fr[i] = (fr[i] - i) * 2;第i周会少i个朋友,剩下的朋友数量翻倍。

 #include
int main(void)
{
    int fr[200], i=0;
    fr[0] = 5;
    while (fr[i] < 150) {
    fr[i] = (fr[i] - i) * 2;
    i++;
}
for (i = 0; fr[i] <150; i++)
    printf("at %dd week there are %3d friends\n", i, fr[i]);
getchar();
return 0;
}

  另外,其他人的回答中代码很优秀,你可以参考一下,不用数组占据大量空间,直接用单个数字在存储当前的朋友数目,计算出来后直接输出,之后这个数据就被修改继续下一轮的运算。