您的位置:首页 > 理论基础 > 数据结构算法

Java 数据结构与算法(1)-------------求最大公约数

2017-03-21 19:14 260 查看
一、问题:输入n个数据,输出它们的最大公约数。

最大公约数?

能整除一个数的数叫约数。而能被一个数整除的数叫倍数。

二、函数主体
(函数中测试数据为  64  20)
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package javaapplication5;

/**
*功能简介: 本类中的所有静态方法都是用来求两个数的最大公约数。
* @author nazi
*/
public class JavaCalculater {

private final static int m = 64 ;
public  final static int n = 20;

/*
func:传入两个整数,输出其最大公约数
算法: 辗转相除法
*/
public static void greaterNum(int i , int j){
int r = i % j ; //余数r

//如果j能整除i,则循环结束,j就是最大公约数
while(r!=0){
i = j;
j = r;
r = i % j ;
}//for语句结束,准备输出
System.out.println("最大公约数是:"+ j);
}

/*
func:求最大公约数
算法:辗转相除法(递归)
*/
public static void greaterNum2(int i , int j){
int r = i % j;//求余

//终止条件:余数为0
if(r == 0){
System.out.println("辗转相除算法最大公约数:"+j);//打印的是余数
}else{
i = j;
j = r;
greaterNum2(i , j);
}
}

/*
func:求最大公约数
算法:更相减损数
*/
public static void greaterNum3(int i , int j){
int r = i - j;
while(j!=r){
if(j < r){
i = r;
r = i - j;
}else if(j > r){
i = j;
j = r;
r =  i -j;
}
}
System.out.println("更相减法将;"+r);
}

/*
func:质因数分解法
算法: 将一个数分解成多个质数相乘的形式
实现思路: 数组下标index代表质数,a[index]值代表出现次数。因而再求公共质数时极为方便
程序存在的问题: 数组长度定死。。。
*/
public static void greaterNum4(int i , int j){
int []a = new int[20];
int []b = new  int[20];
int index = 2;
//质数分解
while(i>1){

while((i%index) == 0){//除到不能被2整除为止
i = i / index;
//System.out.println(index);
a[index]++;
}
index ++;
}//while 结束

//质数分解
index = 2;
while(j>1){
while((j%index) == 0){//除到不能被2整除为止
j = j / index;
//System.out.println(index);
b[index]++;
}
index ++;
}//while 结束
int total =1;
for(int in = 2; in <= 19;in++){
if(a[in]<=b[in]){
//此时以a为准
total =total * (int) Math.pow(in, a[in]);
}else if(a[in]>b[in]){
//此时已b为准
total = (int) (total * Math.pow(in, b[in]));
}
}

System.out.println("最大公约数:"+total);

}

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
//辗转相除法v1.0
JavaCalculater.greaterNum(m,n);

//辗转相除法v2.0
JavaCalculater.greaterNum2(m, n);

//更相减损法
JavaCalculater.greaterNum3(m ,n);

//质因数分解法
JavaCalculater.greaterNum4(m , n);
}

}
测试结果:


遇到的问题:程序输出不了东西!!!!

解决办法: 单步调试   注意循环的终止条件



数据正确性验证:如果用户乱输数据怎么办?
解决办法:1、正则表达式  2、输入函数控制
/*
func: 输入函数控制

*/
public static void inputNum(){
System.out.println("输入的数请大于2");
Scanner in = new Scanner(System.in);
int a = in.nextInt();
while(a<2){
System.out.println("输入的数请大于等于2");
a = new Scanner(System.in).nextInt();
}//while jieshu
//System.out.println("数据验证成功,正在进行下一步");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构与算法