「求公約數」和「求公倍數」之類問題的「逆問題」

2021-09-13 03:16:34 字數 1729 閱讀 8518

一、 問題描述

已知正整數a0,a1,b0,b1,設某未知正整數x滿足:

1、x和a0的最大公約數是a1;

2、x和b0的最小公倍數是b1。

求出滿足條件的正整數x。這樣的x並不唯一,甚至可能不存在。考慮如何求解滿足條件的x的個數。程式設計求解這個問題。

輸入格式:

輸入第一行為乙個正整數n,表示有n組輸入資料。接下來的n行每行一組輸入資料,為四個正整數a0,a1,b0,b1,每兩個整數之間用乙個空格隔開。輸入資料保證a0能被a1整除,b1能被b0整除。

輸出格式:

輸出共n行。每組輸入資料的輸出結果佔一行,為乙個整數。對於每組資料:若不存在這樣的x,請輸出0;若存在這樣的x,請輸出滿足條件的x的個數;

樣例輸入

241 1 96 288

95 1 37 1776

樣例輸出62

二、 題目分析

1、 用乙個n行4列的二維陣列存放資料。

2、 驗證資料的正確性,即每行的第乙個數能被第二個數整除且第四個數能被第三個數整除。

3、 分別設定乙個求最大公約數和最小公倍數的函式。

4、 設定乙個number函式,用到4個引數,即陣列中每一行的四個數。定義x變數從1到四個數中最大的數開始迴圈。同時呼叫求最大公約數和求最小公倍數的函式。驗證滿足條件時,則計數變數count+1。最後返回count的值。

5、 在main方法中,驗證資料正確性的情況下,對陣列每一行的4個數呼叫number函式,把number的值賦值個計數變數count。

6、 輸出每一行資料得到的乙個count。

三、 演算法設計

1.求最大公約數的divisor函式:

用輾轉相除法。呼叫自身得到返回值。

public static int divisor(int x,int y)
2.求最小公倍數的multiple函式

呼叫divisor函式。用公式算出最小公倍數

public static int multiple(int x,int y)
3.求滿足條件的x個數的number函式:

public static int number(int a0,int a1,int b0,int b1) 

public static int multiple(int x,int y)

public static int number(int a0,int a1,int b0,int b1) {

int x=1;

int min = (a0>b1)?a0:b1; //選出a0和b1當中較大的數作為x範圍的右區間

int count = 0; // 變數count計算滿足條件的x的個數

while(x五、除錯截圖

六、 總結

這個題目的問題在於找到滿足題目條件的每乙個x的值,並統計個數。我用窮舉法,把範圍內所有滿足條件的x的值找到。我覺得這種思路是最容易理解的。同時呼叫求最大公約數和最小公倍數的函式。這樣使程式的結構比較清晰,不會有太多的**糅雜在一塊混淆思路。另外x的範圍應該可以在具體一些,但是我沒有找到乙個x確定的範圍。

公約數和公倍數

描述 給出兩個正整數,求出它們的最大公約數和最小公倍數。輸入 第一行輸入乙個整數n 0 include int main u a b m 最小公倍數等於他們的乘機除以最大公約數 printf d d n m,u return 0 執行結果 附加相應知識點 1,最大公約數與最小公倍數的一般求法 將每個...

求2個整數的公倍數和公約數

以下用2種方法求最大公約數和最小公倍數 package jk public class datatest 以下是一般的演算法 class diviserandmultiple 輾轉相除法求公約數 public int commondiviser while y x 0 return x 公倍數第1種...

python 公倍數,公約數問題

廢話不多說,直接看 輸入兩個數,求兩個數的最大公約數 如 12和8的最大公約數是4,1,先找出兩個數中最小的那個數,2,最小數 找出能被兩個數整除的數 退出迴圈break while true num1 int input 請輸入第乙個數 num2 int input 請輸入第二個數 num3 nu...