一、 問題描述
已知正整數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...