【问题标题】:Why is one for-loop working as wished but the other not iterating?为什么一个 for 循环按预期工作,而另一个没有迭代?
【发布时间】:2021-05-07 18:53:16
【问题描述】:

这里有两个类似的问题(1.-直到 n 的奇数的总和;2.-系列 1/n 的总和)要使用 for 循环来解决。 我选择了显示的策略,而对于第一个问题,我的循环按预期工作,对于第二个问题,它不会迭代。 我看不出有什么区别,无法理解最后一种情况出了什么问题。

----1----- :

int main()
{
 // Example: Input=5, Output=1+3+5=9
int  i, lastNum ,sumUneven;
 printf("Until what n should the uneven numbers be added: ");
 scanf("%d", &lastNum);
 sumUneven=0;

  for (i=1; 2*i-1<=lastNum; i++) {
     sumUneven=sumUneven + (2*i-1);
  }
  
  printf("Sum of uneven numbers until %d: %d", lastNum, sumUneven);
}

----2------------:

int main()
{
    //My goal: Input=n; Output= 1+ 1/2 + 1/3....+1/n.
    
    int i, n, sum;
    
  printf("Until what n should this series be calculated: ");

 scanf("%d", &n);
 sum=0;

  for (i=1; i<=n; i++) {
     sum = sum + 1/i;
  }
  
  printf("Sum of the series until 1/%d: %d", n, sum);
}

【问题讨论】:

  • 肯定是在迭代,但是你在 C 语言中使用 integer division 并没有得到预期的结果。
  • 我建议在这里使用括号2*i-1&lt;=lastNum,即使它在逻辑上是正确的。

标签: c for-loop iteration


【解决方案1】:

表达式1/i 执行整数除法(截断任何小数部分),因为两个操作数的类型均为int。因此,如果 i 大于 1,则除法将导致 0。变量 sum 也是 int 类型,因此它不能保存小数。

按照1.0/i进行除法,这是浮点除法,因为一个参数的类型为double,并将sum的类型更改为double。也可以使用%f打印sum。

int main()
{
    //My goal: Input=n; Output= 1+ 1/2 + 1/3....+1/n.
    
    int i, n;
    double sum;
    
    printf("Until what n should this series be calculated: ");
    scanf("%d", &n);

    sum=0;
    for (i=1; i<=n; i++)
    {
        sum = sum + 1.0/i;
    }
    printf("Sum of the series until 1/%d: %f", n, sum);
}

【讨论】:

    【解决方案2】:

    您正在使用 int 来跟踪不起作用的浮点数。

    1/n 将是一个浮点数,一个简单的修复将是

    int main()
    {
        //My goal: Input=n; Output= 1+ 1/2 + 1/3....+1/n.
        
        int i, n;
    
       float sum;
        
      printf("Until what n should this series be calculated: ");
    
     scanf("%d", &n);
     sum=0;
    
      for (i=1; i<=n; i++) {
         sum = sum + 1/i;
      }
      
      printf("Sum of the series until 1/%d: %f", n, sum);
    }
    

    你也可以使用双重声明

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多