目标C中的欧几里德算法

时间:2015-06-02 14:08:06

标签: objective-c

#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 = 2v = 2以来,但在第二种情况下u = 10以来v = 10

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

3 个答案:

答案 0 :(得分:0)

我认为你需要在%u中的scanf()个参数之间留一个空格,否则当第一个整数结束而第二个整数开始时,扫描器会怎么知道呢?

scanf("%u %u", &u , &v);

还添加一些错误检查和循环:

while (scanf("%u %u", &u , &v) == 2) {
    ...
}

答案 1 :(得分:0)

如果您(正确)用手跟踪您的2 10示例,您会发现当您第一次到达循环底部uv时交换。它已翻转到案例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 < vu % v == u时,只要u < vtemp == u

第13行,我们已将v的值复制到u。第15行,我们已将temp复制到v。请注意,当u < vtemp == u时。因此,每当u < v时,第一次通过循环都会产生交换uv的效果。