最详细最简单:最大公因数求法、辗转相除法、更相减损法,入门ACM,杭电水题,算法递归,初级算法题一看就懂
文章目錄
- 前言
- 一、名稱(chēng)定義
- 1.最大公約數(shù)
- 2.輾轉(zhuǎn)相除法
- 3.更相減損法
- 二、ACM杭電入門(mén)題
- 1.解題思路
- 三、解題參考代碼(C語(yǔ)言,C++)
- 0.最優(yōu)算法(C++)
- 1.輾轉(zhuǎn)相除求解(C語(yǔ)言)
- 2.更相減損法求解(C語(yǔ)言)
- 總結(jié)
前言
本篇博客對(duì):最大公因數(shù),輾轉(zhuǎn)相除法,更相減損法等專(zhuān)有名詞進(jìn)行了詳細(xì)的介紹,分享了兩種求解最大公因數(shù)的算法代碼,以杭州電子科技大學(xué)的ACM入門(mén)題作為索引,借助實(shí)際代碼,對(duì)上面介紹的兩種算法求解最大公因數(shù)進(jìn)行初級(jí)應(yīng)用,粗略地介紹了遞歸思想對(duì)算法的優(yōu)化。
一、名稱(chēng)定義
1.最大公約數(shù)
定義:最大公因數(shù)是指兩個(gè)或多個(gè)整數(shù)共有約數(shù)中最大的一個(gè)。
示例:12、16的公約數(shù)有1、2、4,其中最大的一個(gè)是4,4是12與16的最大公約數(shù)。
2.輾轉(zhuǎn)相除法
定義:輾轉(zhuǎn)相除法是求兩個(gè)自然數(shù)的最大公約數(shù)的一種方法。
示例:求319,377的最大公約數(shù)
319÷377=0(余319)
377÷319=1(余58)
319÷58=5(余29)
58÷29=2(余0)
當(dāng)余數(shù)為0時(shí),除數(shù)即為最大公約數(shù):29
3.更相減損法
定義:更相減損法是出自《九章算術(shù)》的一種求最大公約數(shù)的算法。
示例:求98與63的最大公約數(shù)。
98-63=35
63-35=28
35-28=7
28-7=21
21-7=14
14-7=7
7-7=0
當(dāng)差為0時(shí),除數(shù)即為最大公約數(shù):7
while循環(huán)
int fun(int m,int n) {while(m!=n) //當(dāng)差為0的時(shí)候,n即為最大公約數(shù){if(m>n)m=m-n;elsen=n-m;}return n; }二、ACM杭電入門(mén)題
先來(lái)看一個(gè)杭電的水題,看看有有沒(méi)有解題思路
ACM編程題(請(qǐng)根據(jù)下列各題目的描述、輸入和輸出要求,分別寫(xiě)出相應(yīng)正確的代碼)
----------------------------------第11題(hdu2503)--------------------------------
(1)題目
a/b + c/d
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description
給你2個(gè)分?jǐn)?shù),求他們的和,并要求和為最簡(jiǎn)形式。
Input
輸入首先包含一個(gè)正整數(shù)T(T<=1000),表示有T組測(cè)試數(shù)據(jù),然后是T行數(shù)據(jù),每行包含四個(gè)正整數(shù)a,b,c,d(0<a,b,c,d<1000),表示兩個(gè)分?jǐn)?shù)a/b 和 c/d。
Output
對(duì)于每組測(cè)試數(shù)據(jù), 輸出兩個(gè)整數(shù)e和f,表示a/b + c/d的最簡(jiǎn)化結(jié)果是e/f,每組輸出占一行。
Sample Input
2
1 2 1 3
4 3 2 3
Sample Output
5 6
2 1
- 本題在A(yíng)CM中并不難,主要考察是否掌握最大公約數(shù)的求法
1.解題思路
- 先求解出未化簡(jiǎn)的e,f
- 再求出最大公因數(shù)z(兩種方法)
- 最后輸出e=e/z, f=f/z
三、解題參考代碼(C語(yǔ)言,C++)
0.最優(yōu)算法(C++)
一個(gè)優(yōu)秀的acmer總是尋求最優(yōu)算法(輾轉(zhuǎn)相除法時(shí)間復(fù)雜度優(yōu)于更相減損法)
本段代碼為c++語(yǔ)言編寫(xiě),新手小白看不懂可以看下面的C語(yǔ)言解題
#include<iostream> //頭文件 using namespace std; int fun(int m,int n) //定義函數(shù) 輾轉(zhuǎn)相除法 {return n?fun(n,m%n):m; //求解最大公因數(shù)n,返回其值 } int main() { int n,a,b,c,d,e,f,z; //n行數(shù),z最大公約數(shù)cin>>n;while(n--){ cin>>a>>b>>c>>d; e=a*d+b*c;f=b*d;z=fun(e,f); //調(diào)用函數(shù)返回最大公約數(shù) cout<<e/z<<f/z; //輸出最簡(jiǎn)答案}return 0; }1.輾轉(zhuǎn)相除求解(C語(yǔ)言)
(1)參考代碼:
#include<stdio.h> int main() {int t,e,f,m,n,tmp,r;scanf("%d",&t);for(int i=0;i<t;i++){int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);e=a*d+b*c;f=b*d;///進(jìn)行最大公約數(shù)的求解(f,e) <==> (m,n)m=f;n=e;///輾轉(zhuǎn)相除r=m%n;while(r!=0){m=n;n=r;r=m%n;}///經(jīng)過(guò)上面的輾轉(zhuǎn)過(guò)程,所求的最大公約數(shù)就是n//printf("%d %d\n", e/n, f/n);}return 0; }2.更相減損法求解(C語(yǔ)言)
(2)參考代碼:
#include<stdio.h> int main() {int t,e,f,m,n;scanf("%d",&t);for(int i=0;i<t;i++){int a,b,c,d;scanf("%d%d%d%d",&a,&b,&c,&d);e=a*d+b*c;f=b*d;///進(jìn)行最大公約數(shù)的求解(f,e) <==> (m,n)m=f;n=e;//輾轉(zhuǎn)相減while(m!=n){if(m>n)m=m-n;elsen=n-m;}///經(jīng)過(guò)上面的輾轉(zhuǎn)過(guò)程,所求的最大公約數(shù)就是n//printf("%d %d\n",e/n,f/n);}return 0; }總結(jié)
今天的分享就到這里啦,喜歡小編博客的可以點(diǎn)贊支持哦,覺(jué)得內(nèi)容對(duì)你有用的可以收藏備用
最后,祝我們?cè)缛湛挂叱晒?#xff0c;摘下口罩和最想見(jiàn)面的人見(jiàn)面,齊心抗疫,眾志成城!
總結(jié)
以上是生活随笔為你收集整理的最详细最简单:最大公因数求法、辗转相除法、更相减损法,入门ACM,杭电水题,算法递归,初级算法题一看就懂的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 九个角度分析对比 Android、iOS
- 下一篇: ITS测试