【问题标题】:Output variables becomes 0. Possible logic error输出变量变为 0。可能的逻辑错误
【发布时间】:2014-09-28 00:35:27
【问题描述】:

我声明然后将“n”分配给变量“m”和“num”。当他们到达程序结束时,他们最终为零。

该程序用于查找 n 的 Phi Totient 函数。这一切都完美无缺,直到最后一个 while 循环。

int factorization(int n)
{
 int i, j=0, a[14], index=0, m, num;

    m=n;
    num=n;

    for(i=2; i<sqrt(n)+1; i++)
    {
        if(n%i == 0)
        {
           n=n/i;
            if(a[0]!=i && a[1]!=i && a[2]!=i && a[3]!=i && a[4]!=i && a[5]!=i && a[6]!=i && a[! =i && a[8]!=i && a[9]!=i && a[10]!=i && a[11]!=i && a[12]!=i && a[13]!=i && a[14]!=i)
            {
            a[index]=i;
            index++;
            }
           i=1;
        }
    }
    a[index]=n;

    for (i=index+1; i<=14; i++)
    {
        a[i]=0;
    }
    for (i=0; i<=10; i++)
    {
        printf("%d\n",a[i]);
    }

    while(a[j] != 0 && a[j] != 1)
    {
    m=m*((a[j]-1)/a[j]);
    j++;
    }
    printf("Phi of %d = %d", num, m);

    return 0;
}

【问题讨论】:

    标签: c while-loop logic output


    【解决方案1】:

    m 改为 double 并循环到

    while (a[j] != 0 && a[j] != 1)
    {
        m = m * ( ((double)a[j] - 1.0) / (double)a[j] );
        j++;
    }
    

    如果 m 是整数,则除法时

    ((a[j]-1)/a[j]) 
    

    小于1则向下舍入为零,乘法变为

    m = m * 0
    

    【讨论】:

      【解决方案2】:
      int i, j=0, a[14], index=0, m, num;
      

      a数组未初始化但数组元素被读入:

      if(a[0]!=i && a[1]!=i && a[2]!=i && a[3]!=i && a[4]!=i && a[5]!=i && a[6]!=i && a[! =i && a[8]!=i && a[9]!=i && a[10]!=i && a[11]!=i && a[12]!=i && a[13]!=i && a[14]!=i)
      

      此外,在上述行中,您正在测试a[14]!=i,但a 的最后一个元素是a[13]a[14] 不在数组中。

      相同:

      for (i=index+1; i<=14; i++)
      {
          a[i]=0;
      }
      

      您正在访问数组外的元素 (a[14])。

      【讨论】:

      • 这为我修复了变量“num”,但没有修复变量“m”。我还初始化了数组“a”的所有元素。
      • 似乎我的“m”变量以某种方式变为 0,只是计算并变为 0...
      猜你喜欢
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-30
      相关资源
      最近更新 更多