【问题标题】:C - Strange behaviour of while and for loopsC - while 和 for 循环的奇怪行为
【发布时间】:2014-03-02 15:40:52
【问题描述】:

我正在尝试编写一些简单的代码来验证数组中每个数字的位数,但我遇到了一些奇怪的行为。

数组中的前 3 个数字在 while 循环中被评估为 false,这意味着 (120/1)%10 等于 0,这不应该是 true 或者这里有其他错误。

你有什么想法吗?该算法在数组中的第三个数字之后按预期工作。

提前感谢您的建议。

int main(){

    int nums[SIZE] = {120,210,3,4375,54443};
    int i;

    for (i = 0; i < SIZE; ++i){

        printf("Var i inside FOR: \t%d\n", i);
        printf("Var nums i inside FOR: \t%d\n", nums[i]);
        int wtest = 1;
        printf("Var wtest inside FOR: \t\t%d\n\n", wtest);

        while (((nums[i] / wtest)%10) != 0){
              wtest = wtest * 10;
              printf("Var wtest iside while: \t\t\t%d\n\n", wtest);                  
        }
    }  

    getchar();            
    return 0;

}

输出:

Var i inside FOR:   0
Var nums i inside FOR:  120
Var wtest inside FOR:       1

Var i inside FOR:   1
Var nums i inside FOR:  210
Var wtest inside FOR:       1

Var i inside FOR:   2
Var nums i inside FOR:  3
Var wtest inside FOR:       1

Var wtest iside while:          10

Var i inside FOR:   3
Var nums i inside FOR:  4375
Var wtest inside FOR:       1

Var wtest iside while:          10

Var wtest iside while:          100

Var wtest iside while:          1000

Var wtest iside while:          10000

Var i inside FOR:   4
Var nums i inside FOR:  54443
Var wtest inside FOR:       1

Var wtest iside while:          10

Var wtest iside while:          100

Var wtest iside while:          1000

Var wtest iside while:          10000

Var wtest iside while:          100000

【问题讨论】:

  • 为什么(120 / 1) % 10) == 0 在您看来不正确?
  • (120/1 )%10 似乎有什么问题?
  • 这对我来说是正确的,120 / 10 = 12 因此120 % 10 = 0
  • 看看% 操作员做了什么:en.wikipedia.org/wiki/Modular_arithmetic
  • 是的——你们是对的人。我大错特错而且过度扩张。谢谢你的cmets。我真的很感激。

标签: c for-loop while-loop


【解决方案1】:

您的代码逻辑错误。通过测试除以 10 的余数,您实际上可以检查相应位置的数字是否为零 - 120 和 210 的最后一个数字就是这种情况。最后一个数字是您首先检查的那个。

你应该只检查除法的结果是否为零:

int wtest = 1;

while (nums[i] / wtest != 0) {
      wtest = wtest * 10;
}

如果nums[i] 小于wtest,则除法只产生零,因此您可以将其重写为:

int wtest = 1;

while (nums[i] > wtest) {
      wtest = wtest * 10;
}

这当然不会给你数字计数,而是比你的数字大的十的最小幂。

【讨论】:

    【解决方案2】:

    int main(){

    int nums[SIZE] = {120,210,3,4375,54443};
    int i;
    
    for (i = 0; i < SIZE; ++i){
    
        printf("Var i inside FOR: \t%d\n", i);
        printf("Var nums i inside FOR: \t%d\n", nums[i]);
        int j = 0;
        int n = nums[i];
       do
          {
            n=n/10;
               j++;
          }while(n!=0);                
        }
    }  
    
    getchar();            
    return 0;
    

    }

    这里 do-while 循环会计算 number 中的位数,数字 0 将被计为 1 使用 do while 而不是仅使用 while 的原因。希望这对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-11
      • 1970-01-01
      相关资源
      最近更新 更多