我希望有人可以解释为什么这个程序有效。我是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;
}
答案 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)
让我们一步一步来。
rem=n%10;
将余下的rem
除以10.对于1234,这意味着1234 % 10
为4。reverse=reverse*10+rem;
将其值乘以10(如果您愿意,将值移到左侧),然后添加rem
。因为,在循环的第一个回合中,它的值为10,我们只需添加4,结果为4。n/=10;
是整数除以10.这意味着1234 / 10 = 123
(任何小数都会丢失)。rem= 123 % 10;
或3。reverse=reverse*10+rem;
现在是reverse=4*10+3;
或43(请注意此处模式的开头?)n/=10;
所以现在n = 12;
对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+rem
因Operator precedence而起作用,乘法(*
)的优先级高于加法(+
)所以首先要完成。这不是C特定的,它在basic mathematics中是相同的。
所以现在n==10
和reverse==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==1
和reverse==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