#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
unsigned int u;
unsigned int v;
unsigned int temp;
NSLog(@"Enter two numbers: ");
scanf("%u%u", &u , &v);
while (v != 0)
{
temp = u % v;
u = v;
v = temp;
}
NSLog(@" Greatest Common Factor: %u" , u);
}
return 0;
}
上述程序要求用户输入两个整数。然后计算最大公约数。
10 2
中的用户作为两个值,则答案为2 2 10
怎么办? (答案仍然是2)在第一种情况下:u = 2
自v = 2
以来,但在第二种情况下u = 10
以来v = 10
我的问题是为什么我仍然得到2作为第二种情况的答案?如果有人能帮我理解这个概念,我将不胜感激。
答案 0 :(得分:0)
我认为你需要在%u
中的scanf()
个参数之间留一个空格,否则当第一个整数结束而第二个整数开始时,扫描器会怎么知道呢?
scanf("%u %u", &u , &v);
还添加一些错误检查和循环:
while (scanf("%u %u", &u , &v) == 2) {
...
}
答案 1 :(得分:0)
如果您(正确)用手跟踪您的2 10
示例,您会发现当您第一次到达循环底部u
和v
时交换。它已翻转到案例1,因此将给出相同的答案。
至于它的工作原理,请参阅Wikipedia。
答案 2 :(得分:0)
在循环中添加一些打印件以了解正在发生的事情:
1 #import <Foundation/Foundation.h>
2
3 int main(int argc, const char * argv[]) {
4 @autoreleasepool {
5 unsigned int u, v, temp;
6 printf("Enter two numbers:\n");
7 scanf("%u%u", &u , &v);
8 while (v != 0)
9 {
10 temp = u % v;
11 printf("(11) u=%u v=%u temp=%u\n", u, v, temp);
12 u = v;
13 printf("(13) u=%u v=%u temp=%u\n", u, v, temp);
14 v = temp;
15 printf("(15) u=%u v=%u temp=%u\n", u, v, temp);
16 }
17 printf("Greatest Common Factor: %u\n" , u);
18 }
19 return 0;
20 }
然后我们可以看到发生了什么:
Enter two numbers:
2 10
(11) u=2 v=10 temp=2
(13) u=10 v=10 temp=2
(15) u=10 v=2 temp=2
(11) u=10 v=2 temp=0
(13) u=2 v=2 temp=0
(15) u=2 v=0 temp=0
Greatest Common Factor: 2
因此,在第一次循环中,第11行我们将temp
设置为u % v
,这是2(因为2/10 = 0余数2)。事实上,每当u < v
,u % v == u
时,只要u < v
,temp == u
。
第13行,我们已将v
的值复制到u
。第15行,我们已将temp
复制到v
。请注意,当u < v
,temp == u
时。因此,每当u < v
时,第一次通过循环都会产生交换u
和v
的效果。