網站首頁 編程語言 正文
使用窮舉法求兩個數的最大公約數
for m in range (0,2):
a = int(input("請輸入一個數:"))
b = int(input("請輸入另外一個數:"))
#判斷num1與num2的大小
if a > b:
#獲取最小值
min = b
else:
#獲取最小值
min = a
for i in range(min+1,0,-1): #倒序
#滿足公因數的條件:
if (a % i == 0) and (b % i == 0):
c = i
break
print('這兩個數的最大公約數是:%d '%c)
窮舉法求N個數的最大公約數和最小公倍數
基本要求
求N個數的最大公約數和最小公倍數。用C或C++或java或python語言實現程序解決問題。
提高要求
思考一個“求公約數”和“求公倍數”之類問題的“逆問題”,這個問題是這樣的:已知正整數a0,a1,b0,b1,設某未知正整數x滿足:
- 1、x和a0的最大公約數是a1;
- 2、x和b0的最小公倍數是b1。
Hankson的“逆問題”就是求出滿足條件的正整數x。但稍加思索之后,他發現這樣的x并不唯一,甚至可能不存在。因此他轉而開始考慮如何求解滿足條件的x的個數。
輸入格式
- 輸入第一行為一個正整數n,表示有n組輸入數據。接下來的n行每行一組輸入數據,為四個正整數a0,a1,b0,b1,每兩個整數之間用一個空格隔開。輸入數據保證a0能被a1整除,b1能被b0整除。
輸出格式
- 輸出共n行。每組輸入數據的輸出結果占一行,為一個整數。
- 對于每組數據:若不存在這樣的x,請輸出0;
- 若存在這樣的x,請輸出滿足條件的x的個數;
樣例輸入
2
41 1 96 288
95 1 37 1776
算法設計思路
本程序先用窮舉法計算兩個數的最大公約數或最小公倍數。從兩個數中較小數開始由大到小列舉,直到找到公約數立即中斷列舉,得到的公約數便是最大公約數 。
①定義1:對兩個正整數a,b如果能在區間[a,0]或[b,0]內能找到一個整數temp能同時被a和b所整除,則temp即為最大公約數。
②定義2:對兩個正整數a,b,如果若干個a之和或b之和能被b所整除或能被a所整除,則該和數即為所求的最小公倍數。
#include<stdio.h>
#define N 1000 ?/*自定義數組長度*/
int input(int t[])
{
?? ?int i,n;
?? ?int k=1;
?? ?printf("Please input the count of numbers(n>=2):"); /*輸入計算值的個數*/
?? ?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) ? /*驗證函數*/
{
?? ?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) /*自定義函數求兩數的最大公約數*/
{
? ? int ?temp; ? ? ? ? ?/*定義義整型變量*/
? ? temp=(a>b)?b:a; ? ?/*采種條件運算表達式求出兩個數中的最小值*/
? ? while(temp>0)
? ? {
? ? ? ?if (a%temp==0&&b%temp==0) /*只要找到一個數能同時被a,b所整除,則中止循環*/
? ? ? ? ? break;
? ? ? ?temp--; ? ? ?/*如不滿足if條件則變量自減,直到能被a,b所整除*/
? ? }
? return (temp); /*返回滿足條件的數到主調函數處*/
}
int Gcd(int t[],int n)
{
?? ?int i;
?? ?int c=t[0];
?? ?for(i=1;i<n;i++)
?? ?{
?? ??? ?c=divisor(c,t[i]); ?/*求N個數的最大公約數*/
?? ?}
?? ?return c;
}
int multiple (int a,int b)
{
? int p,q,temp;
? p=(a>b)?a:b; ? /*求兩個數中的最大值*/
? q=(a>b)?b:a; ?/*求兩個數中的最小值*/
? temp=p; ? ? ?/*最大值賦給p為變量自增作準備*/
? while(1) ??
? {
? ? if(p%q==0)
? ? ? break; ?/*只要找到變量的和數能被a或b所整除,則中止循環*/
? ? p+=temp; ? /*如果條件不滿足則變量自身相加*/
? }
? 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個數的最小公倍數*/
?? ?}
?? ?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)); ?/*輸出最大公約數*/
? ? printf("The lowest common multiple is %d\n",Mul(t,n));/*輸出最小公倍數*/
? ? printf("retreat:press 0\ncontiune:press 1");
? ? scanf("%d",&flag);
?}
?return 0;
}
測試截屏
輸入數據正確時:
輸入數據有0時會提示錯誤,計算完成后可以退出和繼續:
總結
求N個數的最大公約數和最小公倍數的可以聯系上機作業:用四種方法求兩個數最大公約數和最小公倍數,像這種思考方式可以用于以后的解決問題中。
在完成基本要求中,程序完成比較順利。提高要求仔細讀了幾遍,明白了題意,尋找滿足x的個數,這就要用到循環和計數器一個個去找,但此要求最終沒能完成,在對x的求解過程仍有問題。
原文鏈接:https://blog.csdn.net/weixin_45556441/article/details/123733406
相關推薦
- 2022-04-21 python數據類型bytes?和?bytearray的使用與區別_python
- 2023-11-26 XMLHttpRequest對象的Get請求和Post請求的用法
- 2022-10-09 .NET擴展方法使用實例詳解_實用技巧
- 2023-10-10 uniapp實現預覽請求后臺接口返回的文件
- 2022-09-24 一文詳解Golang協程調度器scheduler_Golang
- 2022-01-27 修改Linux系統時間Date改為CST
- 2022-11-14 配置iOS?16?屏幕旋轉適配實例詳解_IOS
- 2023-06-03 Numpy數值積分的實現_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支