给两组数字,每组有四个数字,分别找出每一组数字中最大的那个,然后输出它们的最大公约数。 输入两行,每行四个非负整数。保证每个非负整数的最大值不超过 int 类型的范围。 输出一行,一个数,表示最大公约数。
输入样例
1 2 3 4
5 6 7 8
这样的题要怎么计算啊?
这个题你可以以这个流程做:
第一步获得最大值
循环输入,“打擂台”比较获得
#include<bits/stdc++.h>
using namespace std;
int getGCD(int x,int z) { //递归函数获取公约数(辗转相除法)
int h=x%z; //余数定义
if(h==0)return z; //停止条件
else getGCD(z,h); //继续递归
}
int main () {
int x,a1=-1,a2=-1; //打擂台比较,a1和a2是两个最大值
for(int i=1;i<=4;i++) {
cin>>x;
a1=max(a1,x);
}
for(int i=1;i<=4;i++) {
cin>>x;
a2=max(a2,x);
}
cout<<getGCD(a1,a2);
return 0;
}
第二部获得最大公约数
使用辗转相除法(也被称作欧几里得方法)
辗转相除法
更相相减法
/************begin************/
#include"stdio.h"
#include"math.h"
//判断,如果m<n则交换m,n
void judgeAndSwap(int* m,int *n){
int temp;
if(*m<*n){
temp=*m;
*m=*n;
*n=temp;
}
}
//求最大公约数
int main()
{
int m,n;//定义两个变量 m,n。 此行代码不可修改!!!
int y1,y2;
printf("Enter two numbers:");
scanf("%d,%d",&m,&n);//接收输入的数值m,n。 此行代码不可修改!!!
if(m<=0||n<=0)
{
printf("Nonpositive value not allowed\n");
return 0;
}
//网上求最大公约数的算法有好几种,这里我采用了效率较高的更相减损术
while(1)
{
judgeAndSwap(&m,&n);//比较m,n大小,如果m>n,则交换,保证减数n为较小数
y1=m-n;
judgeAndSwap(&y1,&n);//比较y1和n大小,如果y1>n,则交换 保证减数n为较小数
y2=y1-n;
m=y2;//n中保存始终是较小的减数,不用再次赋值
if((y2-y1)==0)//相邻俩数更相 相减,当结果为0时,该数为最大公约数
{
printf("the greatest common divistr is:%d\n",y2);
break;
}
}
}
/*************end*************/
最简单的就是用循环,让计算机自己去一个一个试,也可以用下面两个答主的方法,辗转相除。