目标C中的Euclid算法

博士
#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;
}

上面的程序要求用户输入两个整数。然后,计算最大公约数。

  • 情况1:如果用户输入10 2两个值,则答案为2
  • 情况2:如果用户将整数反转为,该2 10怎么办?(答案仍然是2)

在第一种情况:u = 2因为v = 2,但是在第二种情况下u = 10,因为v = 10

我的问题是,为什么我仍然得到2作为第二种情况的答案?如果有人可以帮助我理解这个概念,我将不胜感激。

抢马约夫

将一些打印品添加到循环中以了解发生了什么:

 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行将设置tempu % v,即为2(因为2/10 = 0余数2)。实际上,无论何时u < vu % v == u无论何时u < v…… temp == u

在第13行,我们将的值复制vu到第15行,我们已经复制tempv请记住,当u < vtemp == u因此,无论何时u < v,第一次通过循环都具有交换u的作用v

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章