s99q


私信TA

用户名:20206805

访问量:17570

签 名:

在否定中提升自己

等  级
排  名 290
经  验 5662
参赛次数 0
文章发表 91
年  龄 19
在职情况 学生
学  校 东大
专  业 软件工程

  自我简介:

代码是大一上学期写的,格式等都不规范,请多包涵。编写的代码,有些是为了练习库函数的使用,所以看着可能比较怪或者难以理解。

·知识&&分析:
更相减损术求两个数的最大公约数 :之前大的数 =(赋值) |两数差|(绝对值符号) ,直到两个数相等为止;所得的即为最大公因数利用各个数值之间的关
系求最小公倍数和最大公因数。同时:还可以运用更相减损术和辗转相除法,亦或短除法(比较简单)。
下面的代码(1)则是使用最初始的办法:
                       1:分解质因数
                       2:求公因数
                        (1):找到最大公因数
                        (2):用两数的积来除以公因数(每个公因数最多用两次)
                        (3):在(2)中,为了能够辨别是否已经,在求最小公倍数之前还要设置一个相应的布尔类型的数组
代码(2)则是短除法利用方法(1)和方法(2)还可以求出处最大的公有质因数
代码(4)是使用的更相减损术(较简单)
·最大公因数 = 公有的质因数的积
·在使用方法3时,应该明确知道:
                             1)最大公因数 * 最大公因数 * 短除后的余数1 * 余数2 = 两数积
                             2)最小公倍数 = 最大公因数 * 短处后的余数1 * 余数2
                       因而有:最小公倍数 = 最大公因数除两数的积


·以下的方法一个比一个简单,但是知识量越来越大,由下而上,步骤越详细
·显然,更相减损术的(4),(3)是最简单的,但是(1)是使用的技巧最多的


参考代码:

(1)
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int[] array;
		byte[] ij = new byte[]{0,0};
		array = new int[2];
		int[][] cFactor = new int[2][10];
		boolean[] b = new boolean[10];                //用来判断下面的内层的相应的公质因数是否已经被用过
		array[0] = scanner.nextInt();
		array[1] = scanner.nextInt();
		int[] x = new int[] {array[0],array[1]};
		x[1] *= x[0];
		x[0] = 1;
		for(byte i = 0;i < 2;i++) {                 //分解质因数        
			for(byte j = 2;array[i] != 1;) {
				if(array[i]%j == 0) {
					cFactor[i][ij[i]] = j;
					array[i] /= j;
					ij[i]++;
					j = 2;
				}
				else {
					j++;
				}
			}
		}

		for(byte m = 0;m < ij[0];m++) {                //获取公因数
			for(byte n = 0;n < ij[1];n++) {
				if(cFactor[0][m]==cFactor[1][n] && (!b[n])) {   //关键点
					b[n] = true; 
					x[0] *=cFactor[0][m];
					x[1] /= cFactor[0][m];
				}
			}
		}
		System.out.println(x[0] +" "+ x[1]);
		
	}
}
```
(2)//短除法
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int[] array;
		int counter = 0;
		array = new int[] {1,1,1};
		int[] cFactor = new int[10];
		array[0] = scanner.nextInt();
		array[1] = scanner.nextInt();
		for(byte i = 2;i = i ;) {           
			if(array[0] % i == 0 && array[1] % i == 0){
				cFactor[counter] = i;
				counter ++;
				array[0] /= i;
				array[1] /= i;
				i = 2;
			}
			else {
				i++;
			}
		}
		for(byte i = 0;i < counter;i++) {
			array[2] *= cFactor[i];
			array[0]*=cFactor[i];
		}
		System.out.print(array[2] + " " + array[0] * array[1]);
	}
}
```
(3):
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int[] array;
		array = new int[2];
		array[0] = scanner.nextInt();
		array[1] = scanner.nextInt();
		if(array[0] < array[1]) {
			int t = array[0];
			array[0] = array[1];
			array[1] = t;
		}
		for(int i = array[1];i > 0;i--) {
		    if(array[0] % i == 0&&array[1]%i == 0) {
			System.out.print(i + " " + array[0] * array[1] / i);
			break;
			}
		}
	}
}
```
(4):
import java.util.Scanner;
import java.util.Arrays;                     //java数组头文件

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int[] array;
		array = new int[2];
		array[0] = scanner.nextInt();
		array[1] = scanner.nextInt();
		int x = array[0] * array[1];         //积 = 最大公约数 * 最小公倍数
		Arrays.sort(array);
		while(array[0] != array[1]) {          //循环相见求最大公约数
			array[1] = array[1] - array[0];
			Arrays.sort(array);             //位于Arrays中,排序方法是从默认从小到大
		}
		System.out.print(array[0] + " " + x / array[0]);
	}	
}


 

0.0分

0 人评分

  评论区

  • «
  • »