为什么这个循环有效?

时间:2014-03-04 16:49:17

标签: c loops

我希望有人可以解释为什么这个程序有效。我是C的初学者。 程序以相反的方式返回用户输入的数字(例如1234 = 4321)。如果反向初始化为零,那么为什么第7行有意义呢?抱歉标题,不知道怎么问。

int n, reverse=0, rem;
printf("Enter an integer: ");
scanf("%d", &n);
while(n!=0)
{
 rem=n%10;
 reverse=reverse*10+rem;
 n/=10;
}

7 个答案:

答案 0 :(得分:3)

代码利用了使用整数运算符%/和*的方法:

  • 获取数字的最右边十进制数字:1234 % 10 == 4
  • 删除数字的最右边十进制数字:1234 / 10 == 123
  • 在数字的右侧添加一个数字:123 * 10 + 4 == 1234

使用它们重复取消n数字并将其推送到reverse

123 0
12  3
1   32
0   321

手动逐步完成代码,这应该是有意义的。取初始值n ==“123”。

Is n zero? No, so go into the loop.
rem = n%10 == 123 % 10 == 3
reverse = reverse * 10 + rem == 0 * 10 + 3 == 3
n = n/10 == 123/10 == 12

Is n zero? No, so loop around.
rem = n%10 == 12 % 10 = 2
reverse = reverse * 10 + rem == 3 * 10 + 2 == 32
n = n/10 == 12/10 = 1

Is n zero? No, so loop around..
rem = n%10 == 1 % 10 = 1
reverse = reverse * 10 + rem == 32 * 10 + 1 == 321
n = n/10 == 1/10 = 0

Is n zero? Yes, so leave the loop.
reverse == 321

或者,再次输入零:

Is n zero? Yes, so leave the loop.
reverse == 0

这个程序毫无意义,但值得注意的是,相同的原理在其他基础上工作,如16(十六进制)和2(二进制) - 如果你最终做某些类型的编程,那将是有用的。

答案 1 :(得分:1)

让我们一步一步来。

  1. rem=n%10;将余下的rem除以10.对于1234,这意味着1234 % 10为4。
  2. reverse=reverse*10+rem;将其值乘以10(如果您愿意,将值移到左侧),然后添加rem。因为,在循环的第一个回合中,它的值为10,我们只需添加4,结果为4。
  3. n/=10;整数除以10.这意味着1234 / 10 = 123(任何小数都会丢失)。
  4. 循环新转!现在,第一行是rem= 123 % 10;或3。
  5. reverse=reverse*10+rem;现在是reverse=4*10+3;或43(请注意此处模式的开头?)
  6. n/=10;所以现在n = 12;
  7. n = 12重复步骤4到6,直至n = 0。我会把它作为练习留给读者。

答案 2 :(得分:0)

如果reverse为零,则“reverse * 10 + rem”的值只是“rem”。

答案 3 :(得分:0)

余数n%10始终是n的最后一位十进制数,而在行n/=10上使用整数除法(与n = n/10相同)最后一位小数数字被有效地删除。因此,rem将从最低有效数字开始依次成为n的每个十进制数字。通过始终将数字添加(+rem)到末尾来构造反向,同时将先前添加的数字向左移动一个位置(reverse*10)。前导零(例如reverse的初始值)无效(0*10 == 0)。

至于为什么reverse被初始化:未初始化变量的初始值在C中是未定义的,因此任何东西都可能由第一个reverse*10产生。此外,如果用户输入0作为数字,则循环条件为false且循环体永远不会运行,但0的反向则正确(0)。

答案 4 :(得分:0)

int n, reverse=0, rem;
printf("Enter an integer: ");
scanf("%d", &n); //read in a number
while(n!=0) //while that number has digits to process
{
 rem=n%10; //find out what's in the 1s place
 reverse=(reverse * 10) + //move our current answer up a position
          rem;            //and then add in the last digit. 
                          // if it's 0 that's the digit we want
                          //so leaving it as is will be fine.
 n/=10;  //chop one digit off. Since integer division
         //truncates this will drop the last digit rather
         //than leave a fraction and always rounds toward 0
}

答案 5 :(得分:0)

迭代每个循环作为变量值将如图所示

rem = 4
reverse = 0 + 4 = 4
n = 123

rem = 3
reverse = 40 + 3 = 43
n = 12

rem = 2
reverse = 430 + 2 = 432
n = 1

rem = 1
reverse = 4320 + 1 = 4321 
n = 0

n成为0

时,循环退出

答案 6 :(得分:0)

使用调试器或使用printf()来逐步解决这个问题,但这是一个非常简单的程序,因此您可以使用笔和纸(或数字笔和纸)来完成此操作

printf("Enter an integer: ");
scanf("%d", &n);   // so say the number is 103
while(n!=0)        // n=103 so we enter the loop
{
 rem=n%10;               // rem = 3
 reverse=reverse*10+rem; // reverse = 0*10 + 3 = 0 + 3 = 3 
 n/=10;                  // n = 103/10 = 10
}

n/=10行因integer division而有效,rem=n%10行因modulus operator而有效。
这一行:reverse=reverse*10+remOperator precedence而起作用,乘法(*)的优先级高于加法(+)所以首先要完成。这不是C特定的,它在basic mathematics中是相同的。

所以现在n==10reverse==3,10仍然不是0,所以循环继续:

 rem=n%10;               // rem = 0
 reverse=reverse*10+rem; // reverse = 3*10 + 0 = 30 + 0 = 30 
 n/=10;                  // n = 10/10 = 1

所以现在n==1reverse==30,1仍然不是0,所以循环继续:

 rem=n%10;               // rem = 1
 reverse=reverse*10+rem; // reverse = 30*10 + 1 = 300 + 1 = 301 
 n/=10;                  // n = 1/10 = 0

所以现在循环停止了因为n==0而反面有301,这与给定输入的反向103

相关问题