Python使用窮舉法求兩個(gè)數(shù)的最大公約數(shù)問(wèn)題
使用窮舉法求兩個(gè)數(shù)的最大公約數(shù)
for m in range (0,2): a = int(input("請(qǐng)輸入一個(gè)數(shù):")) b = int(input("請(qǐng)輸入另外一個(gè)數(shù):")) #判斷num1與num2的大小 if a > b: #獲取最小值 min = b else: #獲取最小值 min = a for i in range(min+1,0,-1): #倒序 #滿(mǎn)足公因數(shù)的條件: if (a % i == 0) and (b % i == 0): c = i break print('這兩個(gè)數(shù)的最大公約數(shù)是:%d '%c)
窮舉法求N個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)
基本要求
求N個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)。用C或C++或java或python語(yǔ)言實(shí)現(xiàn)程序解決問(wèn)題。
提高要求
思考一個(gè)“求公約數(shù)”和“求公倍數(shù)”之類(lèi)問(wèn)題的“逆問(wèn)題”,這個(gè)問(wèn)題是這樣的:已知正整數(shù)a0,a1,b0,b1,設(shè)某未知正整數(shù)x滿(mǎn)足:
- 1、x和a0的最大公約數(shù)是a1;
- 2、x和b0的最小公倍數(shù)是b1。
Hankson的“逆問(wèn)題”就是求出滿(mǎn)足條件的正整數(shù)x。但稍加思索之后,他發(fā)現(xiàn)這樣的x并不唯一,甚至可能不存在。因此他轉(zhuǎn)而開(kāi)始考慮如何求解滿(mǎn)足條件的x的個(gè)數(shù)。
輸入格式
- 輸入第一行為一個(gè)正整數(shù)n,表示有n組輸入數(shù)據(jù)。接下來(lái)的n行每行一組輸入數(shù)據(jù),為四個(gè)正整數(shù)a0,a1,b0,b1,每?jī)蓚€(gè)整數(shù)之間用一個(gè)空格隔開(kāi)。輸入數(shù)據(jù)保證a0能被a1整除,b1能被b0整除。
輸出格式
- 輸出共n行。每組輸入數(shù)據(jù)的輸出結(jié)果占一行,為一個(gè)整數(shù)。
- 對(duì)于每組數(shù)據(jù):若不存在這樣的x,請(qǐng)輸出0;
- 若存在這樣的x,請(qǐng)輸出滿(mǎn)足條件的x的個(gè)數(shù);
樣例輸入
2
41 1 96 288
95 1 37 1776
算法設(shè)計(jì)思路
本程序先用窮舉法計(jì)算兩個(gè)數(shù)的最大公約數(shù)或最小公倍數(shù)。從兩個(gè)數(shù)中較小數(shù)開(kāi)始由大到小列舉,直到找到公約數(shù)立即中斷列舉,得到的公約數(shù)便是最大公約數(shù) 。
①定義1:對(duì)兩個(gè)正整數(shù)a,b如果能在區(qū)間[a,0]或[b,0]內(nèi)能找到一個(gè)整數(shù)temp能同時(shí)被a和b所整除,則temp即為最大公約數(shù)。
②定義2:對(duì)兩個(gè)正整數(shù)a,b,如果若干個(gè)a之和或b之和能被b所整除或能被a所整除,則該和數(shù)即為所求的最小公倍數(shù)。
#include<stdio.h> #define N 1000 ?/*自定義數(shù)組長(zhǎng)度*/ int input(int t[]) { ?? ?int i,n; ?? ?int k=1; ?? ?printf("Please input the count of numbers(n>=2):"); /*輸入計(jì)算值的個(gè)數(shù)*/ ?? ?scanf("%d",&n); ?? ?while(k) ?? ?{ ?? ??? ?printf("Please input numbers:\n"); ?/*輸入所算值*/ ?? ??? ?for(i=0;i<n;i++) ?? ??? ?{ ?? ??? ??? ?scanf("%d",&t[i]); ?? ??? ?} ?? ??? ?k=exper(t,n); ?? ?} ?? ?return n; } int exper(int t[],int n) ? /*驗(yàn)證函數(shù)*/ { ?? ?int i; ?? ?for(i=0;i<n;i++) ?? ?{ ?? ??? ?if(!t[i]) ?? ??? ?{ ?? ??? ??? ?printf("error(輸入為0)\n"); ?? ??? ??? ?return 1; ?? ??? ?} ?? ?} ? ?return 0; } int divisor (int a,int b) /*自定義函數(shù)求兩數(shù)的最大公約數(shù)*/ { ? ? int ?temp; ? ? ? ? ?/*定義義整型變量*/ ? ? temp=(a>b)?b:a; ? ?/*采種條件運(yùn)算表達(dá)式求出兩個(gè)數(shù)中的最小值*/ ? ? while(temp>0) ? ? { ? ? ? ?if (a%temp==0&&b%temp==0) /*只要找到一個(gè)數(shù)能同時(shí)被a,b所整除,則中止循環(huán)*/ ? ? ? ? ? break; ? ? ? ?temp--; ? ? ?/*如不滿(mǎn)足if條件則變量自減,直到能被a,b所整除*/ ? ? } ? return (temp); /*返回滿(mǎn)足條件的數(shù)到主調(diào)函數(shù)處*/ } int Gcd(int t[],int n) { ?? ?int i; ?? ?int c=t[0]; ?? ?for(i=1;i<n;i++) ?? ?{ ?? ??? ?c=divisor(c,t[i]); ?/*求N個(gè)數(shù)的最大公約數(shù)*/ ?? ?} ?? ?return c; } int multiple (int a,int b) { ? int p,q,temp; ? p=(a>b)?a:b; ? /*求兩個(gè)數(shù)中的最大值*/ ? q=(a>b)?b:a; ?/*求兩個(gè)數(shù)中的最小值*/ ? temp=p; ? ? ?/*最大值賦給p為變量自增作準(zhǔn)備*/ ? while(1) ?? ? { ? ? if(p%q==0) ? ? ? break; ?/*只要找到變量的和數(shù)能被a或b所整除,則中止循環(huán)*/ ? ? p+=temp; ? /*如果條件不滿(mǎn)足則變量自身相加*/ ? } ? return ?(p); } int Mul(int t[],int n) { ?? ?int i; ?? ?int s=t[0]; ?? ?for(i=0;i<n;i++) ?? ?{ ?? ??? ?s=multiple(s,t[i]); ?/*求N個(gè)數(shù)的最小公倍數(shù)*/ ?? ?} ?? ?return s; } int main() { ?int t[N]; ?int n; ?int flag=1; ?while(flag) ?{ ? ? n=input(t); ? ? printf("The higest common divisor is %d\n",Gcd(t,n)); ?/*輸出最大公約數(shù)*/ ? ? printf("The lowest common multiple is %d\n",Mul(t,n));/*輸出最小公倍數(shù)*/ ? ? printf("retreat:press 0\ncontiune:press 1"); ? ? scanf("%d",&flag); ?} ?return 0; }
測(cè)試截屏
輸入數(shù)據(jù)正確時(shí):
輸入數(shù)據(jù)有0時(shí)會(huì)提示錯(cuò)誤,計(jì)算完成后可以退出和繼續(xù):
總結(jié)
求N個(gè)數(shù)的最大公約數(shù)和最小公倍數(shù)的可以聯(lián)系上機(jī)作業(yè):用四種方法求兩個(gè)數(shù)最大公約數(shù)和最小公倍數(shù),像這種思考方式可以用于以后的解決問(wèn)題中。
在完成基本要求中,程序完成比較順利。提高要求仔細(xì)讀了幾遍,明白了題意,尋找滿(mǎn)足x的個(gè)數(shù),這就要用到循環(huán)和計(jì)數(shù)器一個(gè)個(gè)去找,但此要求最終沒(méi)能完成,在對(duì)x的求解過(guò)程仍有問(wèn)題。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python continue繼續(xù)循環(huán)用法總結(jié)
本篇文章給大家總結(jié)了關(guān)于Python continue繼續(xù)循環(huán)的相關(guān)知識(shí)點(diǎn)以及用法,有需要的朋友跟著學(xué)習(xí)下吧。2018-06-06OpenCV之理解KNN鄰近算法k-Nearest?Neighbour
這篇文章主要為大家介紹了OpenCV之理解KNN鄰近算法k-Nearest?Neighbour,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05符合語(yǔ)言習(xí)慣的 Python 優(yōu)雅編程技巧【推薦】
Python最大的優(yōu)點(diǎn)之一就是語(yǔ)法簡(jiǎn)潔,好的代碼就像偽代碼一樣,干凈、整潔、一目了然。這篇文章給大家介紹Python 優(yōu)雅編程技巧,感興趣的朋友跟隨小編一起看看吧2018-09-09解決啟動(dòng)django,瀏覽器顯示“服務(wù)器拒絕訪(fǎng)問(wèn)”的問(wèn)題
這篇文章主要介紹了解決啟動(dòng)django,瀏覽器顯示“服務(wù)器拒絕訪(fǎng)問(wèn)”的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05python2和python3應(yīng)該學(xué)哪個(gè)(python3.6與python3.7的選擇)
許多剛?cè)腴T(mén) Python 的朋友都在糾結(jié)的的問(wèn)題是:我應(yīng)該選擇學(xué)習(xí) python2 還是 python3,Python 3.7 已經(jīng)發(fā)布了,目前Python的用戶(hù),主要使用的版本 應(yīng)該是 Python3.6 和 Python2.7 ,那么是不是該轉(zhuǎn)到 Python 3.7 呢2019-10-10