兩個數的最大公約數c語言
『壹』 c語言求兩個數最大公約數
我覺得思路就有問題。
首先,在循環之前就應該找出較小的數,然後從較小的數開始自減,判斷能否被兩個數整除。
因為兩個數的最大公約數一定是介於1到較小數之間的。
如果還要保持輸入的正確輸出的話,找出較小數的操作不要放在循環內。
參考如下:
voidmain()
{
inta,b,gcd;
printf("Inputtwonumber:");
scanf("%d%d",&a,&b);
if(a==b)
{
printf("Thetwonumberis%dand%d.Theirgcdis%d. ",a,b,a);
return;
}
if(a>b)
gcd=b;
else
gcd=a;
while(gcd>0)
{
if(a%gcd==0&&b%gcd==0)
break;
else
gcd--;
}
printf("Thetwonumberis%dand%d.Theirgcdis%d. ",a,b,gcd);
}
『貳』 如何用C語言求兩個數的最大公約數的三種演算法
1、相減法
#include<stdio.h>
int
main()
{
int
a,b;
int
c=0;//計數器
while(1)//循環判斷的作用
{
printf("輸入兩個數字求最大公約數:");
scanf("%d%d",&a,&b);
while(a!=b)
{
if(a>b)
a=a-b;
else
b=b-a;
c++;
}
printf("最大公約數是:%d\n",a);
printf("%d\n",c);
}
return
0;
}
運行效果:
2、輾轉相除法:
#include<stdio.h>
int
a,b,temp;
int
Division(){
printf("請輸入兩個數(a,b):\n");
scanf("%d,%d",&a,&b);
if(a<b){
temp=a;
a=b;
b=temp;
}
while(a%b!=0){
temp=a%b;
a=b;
b=temp;
}
printf("最大公約數為:%d\n",b);
return
0;
}
3、窮舉法
#include<stdio.h>
int
main()
{
int
a,b,c;
int
d=0;//計數器
while(1)
{
printf("輸入兩個數字求最大公約數:");
scanf("%d%d",&a,&b);
c=(a>b)?b:a;//三目運算符
while(a%c!=0||b%c!=0)
{
c--;
d++;
}
printf("最大公約數是:%d\n",c);
printf("%d\n",d);
}
return
0;
}
『叄』 c語言求最大公約數
1、新建一個C語言源程序,這里使用Visual C++6.0的軟體:
『肆』 C語言程序:求兩個數的最大公約數和最小公倍數。
#include<iostream>
using
namespace
std;
int
f(int
p,int
q);
int
g(int
u,int
v,int
w);
int
main()
{
int
x,y,m,n;
cout<<"請輸入兩個整數"<<endl;
cin>>x>>y;
m=f(x,y);
n=g(x,y,m);
cout<<"這兩個數的最大公約數是"<<m<<"\n這兩個數的最小公倍數是"<<n<<endl;
}
int
f(int
p,int
q)
{
int
r;
p>q?r=q:r=p;
//找兩個數中最小的最小的
for(;p%r!=0||q%r!=0;r--);
return
r;
}
int
g(int
u,int
v,int
w)
//w是最大公約數
{
int
g;
g=u*v/w;
return
g;
}
『伍』 怎麼用C語言編輯出兩個數的最大公約數呀謝謝!!
#include
"stdio.h"
main()
{
int
x=0,y=0;
/*被求公倍數的兩個數*/
int
z
=
0;
/*保存臨時的取余結果*/
int
count
=
3;
/*循環計數*/
int
tmp
=
0;
/*交換x,y的臨時變數
*/
/*循環3次獲得用戶輸入,直到輸入正確,或超過次數*/
while(count
>
0)
{
printf("please
input
two
numbers\n");
if(2
!=
scanf("%d%d",&x,&y))
/*如果正確的輸入參數不等於2
就結束這次循環,並給出錯誤信息*/
{
fflush(stdin);
/*清空輸入緩沖區,否則下次輸入會有錯誤*/
count--;
printf("error:This
figure
must
be
imported
!
you
still
have
%d
opportunities.\n",count);
}
else
if(
x
==
0
||
y
==
0)
{
count--;
printf("error:The
input
not
equal
to
0!
you
still
have
%d
opportunities.\n",count);
}else
break;
}
/*如果輸入次數超過限制,則退出程序並給出提示*/
if(count
<=
0)
{
printf("You
have
no
chance
of
withdrawal
proceres
");
return;
}
/*將兩個數的大小位置固定,x永遠大於y
方便下面判斷*/
if(x
<
y)
{
tmp
=
x;
x
=
y;
y
=
tmp;
}
/*用輾轉相除法求出最大公倍數*/
while(
x
%
y
!=
0)
{
printf("%d\t/\t%d\tremainder\t%d\n",x,y,(x
%
y));
/*輸出求解過程*/
z
=
x
%
y;
x
=
y;
y
=
z;
}
printf("%d\t/\t%d\tremainder\t%d\n",x,y,(x
%
y));
/*輸出最後一次求解過程*/
printf("the
result
is
%d\n",y);
}
『陸』 c語言求兩個數的最大公約數
思路:求兩個數的最大公約數使用輾轉相除法。
輾轉相除法,
又名歐幾里德演算法(Euclidean
algorithm)乃求兩個正整數之最大公因子的演算法。原理:兩個整數的最大公約數等於其中較小的數和兩數的差的最大公約數。
參考代碼:
#include <stdio.h>
int main()
{
int x,y,z;
scanf("%d%d",&x,&y);
while(x!=0)
{
z=x%y;
x=y;
y=z;
}
printf("%d\n",z);
return 0;
}
/*
運行結果:
6 27
3
*/
『柒』 C語言:求兩數的最大公約數
我的方法,很笨。請勿見笑
// 函數 GetCommonDivisor: 求兩個數的最大公約數
int GetCommonDivisor( int x , int y )
{
// 取x,y的小者作為運算的起始點,逐漸減小,直到x,y都能整除為止
int Max = min( x,y );
while( Max >= 1 )
{
if( ( x % Max == 0 ) && ( y % Max == 0 ) )
// 找到最大公約數返回
return Max;
Max --;
}
return 1;
}
『捌』 2個數的最大公約數和最小公倍數 C語言怎麼求
輸入兩個正整數m和n,
求其最大公約數和最小公倍數.
<1>
用輾轉相除法求最大公約數
演算法描述:
m對n求余為a,
若a不等於0
則
m
<-
n,
n
<-
a,
繼續求余
否則
n
為最大公約數
<2>
最小公倍數
=
兩個數的積
/
最大公約數
#include
int
main()
{
int
m,
n;
int
m_cup,
n_cup,
res;
/*被除數,
除數,
余數*/
printf("Enter
two
integer:\n");
scanf("%d
%d",
&m,
&n);
if
(m
>
0
&&
n
>0)
{
m_cup
=
m;
n_cup
=
n;
res
=
m_cup
%
n_cup;
while
(res
!=
0)
{
m_cup
=
n_cup;
n_cup
=
res;
res
=
m_cup
%
n_cup;
}
printf("Greatest
common
divisor:
%d\n",
n_cup);
printf("Lease
common
multiple
:
%d\n",
m
*
n
/
n_cup);
}
else
printf("Error!\n");
return
0;
}
★
關於輾轉相除法,
搜了一下,
在我國古代的《九章算術》中就有記載,現摘錄如下:
約分術曰:「可半者半之,不可半者,副置分母、子之數,以少減多,更相減損,求其等也。以等數約之。」
其中所說的「等數」,就是最大公約數。求「等數」的辦法是「更相減損」法,實際上就是輾轉相除法。
輾轉相除法求最大公約數,是一種比較好的方法,比較快。
對於52317和75569兩個數,你能迅速地求出它們的最大公約數嗎?一般來說你會找一找公共的使因子,這題可麻煩了,不好找,質因子大。
現在教你用輾轉相除法來求最大公約數。
先用較大的75569除以52317,得商1,余數23252,再以52317除以23252,得商2,余數是5813,再用23252做被除數,5813做除數,正好除盡得商數4。這樣5813就是75569和52317的最大公約數。你要是用分解使因數的辦法,肯定找不到。
那麼,這輾轉相除法為什麼能得到最大公約數呢?下面我就給大夥談談。
比如說有要求a、b兩個整數的最大公約數,a>b,那麼我們先用a除以b,得到商8,余數r1:a÷b=q1…r1我們當然也可以把上面這個式子改寫成乘法式:a=bq1+r1------l)
如果r1=0,那麼b就是a、b的最大公約數3。要是r1≠0,就繼續除,用b除以r1,我們也可以有和上面一樣的式子:
b=r1q2+r2-------2)
如果余數r2=0,那麼r1就是所求的最大公約數3。為什麼呢?因為如果2)式變成了b=r1q2,那麼b1r1的公約數就一定是a1b的公約數。這是因為一個數能同時除盡b和r1,那麼由l)式,就一定能整除a,從而也是a1b的公約數。
反過來,如果一個數d,能同時整除a1b,那麼由1)式,也一定能整除r1,從而也有d是b1r1的公約數。
這樣,a和b的公約數與b和r1的公約數完全一樣,那麼這兩對的最大公約數也一定相同。那b1r1的最大公約數,在r1=0時,不就是r1嗎?所以a和b的最大公約數也是r1了。
有人會說,那r2不等於0怎麼辦?那當然是繼續往下做,用r1除以r2,……直到余數為零為止。
在這種方法里,先做除數的,後一步就成了被除數,這就是輾轉相除法名字的來歷吧。
『玖』 c語言編程,求兩個數的最大公約數和最小公倍數
這樣寫:
#include
void
main()
{
int
m,n,i,r,temp;
printf("請輸入第一個數的值:
");
scanf("%d",&m);
printf("請輸入第二個數的值:
");
scanf("%d",&n);
if(n>m)
{
temp=m;
m=n;
n=temp;
}
i=n;
while(i%m!=0)
{
i=i+n;
}
printf("最小公倍數是:%d
\n",i);
r=m%n;
while(r!=0)
{
m=n;
n=r;
r=m%n;
}
printf("最大公約數是:%d
\n",n);
}
圖: