網站首頁 編程語言 正文
題目五: 輸入兩個正整數 m 和 n,求最大公約數
A.輾轉相除法
1.核心思想
前提:被取余數%取余數=余數
a.第一次,拿大數%小數=余數
b.從第二次起,每次取余數部分(小數)就當成新一輪取余運算的被取余數,余數就當成新一輪取余運算的取余數
c.當被取余數%取余數=0時,此時找到最大公約數,其最大公約數=取余數,否則執行下一輪取余運算
2.核心代碼
if(m>n){
//被除數變為除數,除數變為余數
temp03=temp01%temp02;
result=temp02;
//當temp03=0時,代表temp02是最大公約數
temp01=temp02;
temp02=temp03;
}else{
temp03=temp02%temp01;
result=temp01;
temp02=temp01;
temp01=temp03;
}
//其中tempo1=m,temp02=n,temp03用于存放余數,result用來接收所產生的最大公約數
3.常見問題點分析
3.1 布爾類型變量flag與布爾類型變量flag01的作用分別是什么?
解答:flag的作用: 判斷是否輸入合法,若輸入合法就進入求公約數算法階段,此時flag=false,保證程序在求完公約數之后能順利結束.若非法則提示重新輸入,程序不會結束
flag01的作用:判斷最大公約數是否求解完畢,若求解完畢,求輸出公約數,并使flag01=false,退出當前求最大公約數這個循環,否則,則進入繼續求公約數的取余階段
3.2 為啥要判斷正整數m與正整數n的大小關系?
解答:輾轉相除法要求的是大數%小數,要保證每次大數在被取余數部分。
? 正整數m,正整數n之間的大小關系沒有要求,
3 運行截圖
3.1 第一次輸入m<=0且第二次時輸入時m>0且m<n
3.2 第一次輸入n<=0且第二次時輸入時n>0且m>=n
3.3 第一次輸入時,m>0且m<n;
3.4 第一次輸入時,n>0且m>=n;
4.源代碼
import java.util.Scanner;
public class Gcd{
public static void main(String[] args) {
//GCD中的G代表greatest c代表common d代表divisor(因子)
System.out.println("題目五:輸入正整數m和n,求最大公約數----輾轉相除法");
Scanner scanner=new Scanner(System.in);
System.out.println("請輸入正整數m:");
int m=scanner.nextInt();
System.out.println("請輸入正整數n:");
int n=scanner.nextInt();
boolean flag=true;
//flag用于判斷用戶輸入值是否正確,
// 若不正確,就要求你重新輸入,否則flag=false,進入公約數判斷
while(flag){
if(m>0&&n>0){
flag=false;
boolean flag01=true;
int temp01=m,temp02=n;
int result=0;
//result是用來接受最大公約數的
while(flag01){
int temp03=0;
if(m>n){
//被除數變為除數,除數變為余數
temp03=temp01%temp02;
result=temp02;
//當temp03=0時,代表temp02是最大公約數
temp01=temp02;
temp02=temp03;
}else{
temp03=temp02%temp01;
result=temp01;
temp02=temp01;
temp01=temp03;
}
//flag01判定是否產生最大公約數,若產生,則退出循環
if(temp03==0){
flag01=false;
System.out.println("最大公約數為:"+result);
}
}
}else{
System.out.println("輸入有誤,請檢查輸入的m值和n值");
System.out.println("請再次輸入正整數m:");
m=scanner.nextInt();
System.out.println("請再次輸入正整數m:");
n=scanner.nextInt();
}
}
}
}
B.輾轉相減法
1.核心思想
前提:被減數-減數=差
a.第一次,拿大數-小數=差
b.從第二次起,每次拿減數與差進行大小的比較,使較大值為被減數,較小值為差
c.當差為0時,此時找到最大公約數,其最大公約數=被減數,否則執行下一輪減法運算
2.核心代碼
if(temp01>temp02){
temp03 = temp01 - temp02;
if (temp03 > temp02) {
temp01 = temp03;
}else if (temp03 < temp02) {
temp01 = temp02;
temp02 = temp03;
// result = temp01;
}else {
result=temp03;
//當減數與差相等,意味著此時就是最大公約數
flag01 = false;
System.out.println("最大公約數為:" + result);
}
}else{
temp03 = temp02 - temp01;
if (temp03 > temp01) {
temp02 = temp03;
}else if (temp03 < temp01) {
temp02 = temp01;
temp01 = temp03;
}else {
result=temp03;
//當減數與差相等,意味著此時就是最大公約數
flag01 = false;
System.out.println("最大公約數為:" + result);
}
}
3.常見問題點分析
3.1 布爾類型變量flag與布爾類型變量flag01的作用分別是什么?
解答:flag的作用: 判斷是否輸入合法,若輸入合法就進入求公約數算法階段,此時flag=false,保證程序在求完公約數之后能順利結束.若非法則提示重新輸入,程序不會結束
flag01的作用:判斷最大公約數是否求解完畢,若求解完畢,求輸出公約數,并使flag01=false,退出當前求最大公約數這個循環,否則,則進入繼續求公約數的取余階段
3.2 為啥當差值與減數相等時,此時最大公約數為差值?
解答:輾轉相除法的核心是當被減數-減數=0時,可以推導出以下結論
? 最大公約數=差值=減數
因此當差值和減數相等時,最大公約數為差值
3 運行截圖
3.1 第一次輸入m<=0且第二次時輸入時m>0且m<n
3.2 第一次輸入n<=0且第二次時輸入時n>0且m>=n
3.3 第一次輸入時,m>0且m<n;
3.4 第一次輸入時,n>0且m>=n;
4.源代碼
import java.util.Scanner;
public class Gcd01 {
public static void main(String[] args) {
//GCD中的G代表greatest c代表common d代表divisor(因子)
System.out.println("題目五:輸入正整數m和n,求最大公約數----輾轉相減法");
Scanner scanner = new Scanner(System.in);
System.out.println("請輸入正整數m:");
int m = scanner.nextInt();
System.out.println("請輸入正整數n:");
int n = scanner.nextInt();
boolean flag = true;
//flag用于判斷用戶輸入值是否正確,
// 若不正確,就要求你重新輸入,否則flag=false,進入公約數判斷
while (flag) {
if (m > 0 && n > 0) {
flag = false;
boolean flag01 = true;
int temp01 = m, temp02 = n;
int result = 0;
//result是用來接受最大公約數的
while (flag01) {
int temp03 = 0;
if(temp01>temp02){
temp03 = temp01 - temp02;
if (temp03 > temp02) {
temp01 = temp03;
// result = temp02;
}else if (temp03 < temp02) {
temp01 = temp02;
temp02 = temp03;
// result = temp01;
}else {
result=temp03;
//當減數與差相等,意味著此時就是最大公約數
flag01 = false;
System.out.println("最大公約數為:" + result);
}
}else{
temp03 = temp02 - temp01;
if (temp03 > temp01) {
temp02 = temp03;
}else if (temp03 < temp01) {
temp02 = temp01;
temp01 = temp03;
}else {
result=temp03;
//當減數與差相等,意味著此時就是最大公約數
flag01 = false;
System.out.println("最大公約數為:" + result);
}
}
}
}else{
System.out.println("輸入有誤,請檢查輸入的m值和n值");
System.out.println("請再次輸入正整數m:");
m = scanner.nextInt();
System.out.println("請再次輸入正整數m:");
n = scanner.nextInt();
}
}
}
}
原文鏈接:https://blog.csdn.net/SSS4362/article/details/125355159
- 上一篇:簡單解析表格table標簽的用法
- 下一篇:vb腳本實現電腦定時關機操作
相關推薦
- 2022-05-17 bat批處理之字符串操作的實現_DOS/BAT
- 2022-06-10 Linux環境下部署Consul集群_Linux
- 2022-05-14 基于Unity編寫一個九宮格抽獎軟件_C#教程
- 2023-07-24 前端借助Canvas實現壓縮base64圖片兩種方法
- 2022-08-18 C#開發Windows?UWP系列之對話框MessageDialog和ContentDialog_C
- 2022-05-21 python實現會員信息管理系統(List)_python
- 2023-12-13 idea git只查看某個人提交的代碼記錄
- 2022-05-22 iOS實現背景滑動效果_IOS
- 最近更新
-
- 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同步修改后的遠程分支