这是一个用于检查互质对的程序。
我正在尝试编写一个程序来接收整数输入,直到用户输入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
。
答案 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