如何在不使用数组的情况下连续比较N对整数

时间:2019-01-07 14:10:56

标签: c input multiple-conditions

这是一个用于检查互质对的程序。

我正在尝试编写一个程序来接收整数输入,直到用户输入0为止,这很容易在数组的帮助下解决(我已经用数组完成了),因为一次只有一个值进行阅读和检查。 有了数组,就很简单:

for(i = 0; i < n-1; i++)

然后比较v[i]v[i+1]

不过,我正在尝试不使用数组而应用这种精确的检查算法, 读取两个值并进行比较,以某种方式,只有当我输入0多次,有时是两次,有时是三个时,循环才会结束。

#include <stdio.h>


int gcd1(int a, int b) //function containing Euclid's algorithm 
{
    while (b != 0)
    {
        int temp = a%b;

        a = b;
        b = temp;
    }


    return a;   
}


int main(int argc, char * argv[])
{

    int num1, num2; /* both of these vars would otherwise have a non-zero 
    value if I was using Try Nr.1 written in bold below was applied */

    int cate = 0, flag = 1;
    while(1)
    {
        scanf("%d %d", &num1, &num2);

        if(num1 == 0 && num2 == 0)
        {
        break;
        }

        if(gcd1(num1, num2) == 1) //check if pair is co-prime 
        {
            cate++;
        }

    }
        printf("%d\n", cate);


    return 0;
}

我尝试过的事情:

1-

while(num1 != 0 || num2 != 0) /*using this inside the while(), also tried
changing the operator to &&, without a condition and a break inside the 
body*/

2-

尝试过while(flag != 0)来更改if(num1 == 0 || num2 == 0),也将运算符更改为&&,但是它还是一样,或者对我来说没有意义。

我需要从程序中停止任何输入0,例如:

25 27 12 24 11 13 0 

该程序应该在那里停止并告诉我有多少对互质数,但是只有当我再输入两次0时,它才会停止。

如果需要,我将发布使用数组完成的操作。

编辑

我根据下面的bruno的回答更新了程序,进行了一些测试,但未通过问题提供的测试。

int cate = 0;
    while(1)
    {
        scanf("%d" ,&num1);

        if(num1 == 0)
            break;

        scanf("%d", &num2);

        if(num2 == 0)
            break;

    if(gcd1(num1, num2) == 1)
    {
        cate++;
    }

}
    printf("%d\n", cate);

使用输入:

25 27 18 11 0

输出为2,这是正确的,(25, 27)(18, 11)是互质对。

,但输入内容:

15 63 43 129 55 15 4 0

输出为0,但应该为3

2 个答案:

答案 0 :(得分:5)

  

我需要从程序中停止任何输入0

scanf("%d %d", &num1, &num2);在您输入2个数字之前一直处于阻止状态

如果要在第一个数字为0时停止而不必读取第二个数字,则必须执行2 scanf

scanf("%d", &num1);

if(num1 == 0)
  break;

scanf("%d", &num2);

if(num2 == 0)
  break;

答案 1 :(得分:1)

问题在于,在测试15和63之后,您将它们全部丢掉了,所以63对43没有机会被测试。与其总是读两个。 em>数字,仅读取一个,并沿

的行也扔掉一个

    read a
    while ()
        read b
        gcd(a, b), etc
        a = b