Loading

算法小结(一)

一、求解步骤

1、问题分析

题目中给出的信息分析,审查问题的描述

2、数学模型建立

选择一个快速正确的模型

3、算法设计与选择

算法设计要同时结合数据结构的设计

4、算法表示

比如:流程图、盒图、PAD图和伪码等等

5、算法分析

时间复杂度和空间复杂度

6、算法实现

7、程序测试及调试

二、算法及其要素和特性

1、算法的3要素

算法由操作、控制结构、数据结构3要素组成

  • 操作:

算术运算:加减乘除

关系比较:大于、小于等于、不等于

逻辑运算:与、或、非

数据传送:输入、输出 、计算

  • 控制结构:

顺序结构

选择结构

循环结构

  • 数据结构

2、算法的基本性质

  • 目的性——有明确的目的
  • 分布性——有一系列的计算机可执行步骤组成
  • 有序性——算法的执行步骤是有顺序的
  • 有限性——算法的指令序列是有限的而且所包含的步骤是有限的
  • 操作性——对某些对象进行操作,使其改变状态,完成其有功能

3、算法的基本特征

  • 有穷性——一个算法必须在有穷步骤之后执行结束
  • 确定性——在任何条件下,算法只有一条执行路径
  • 可行性——基本操作运算有限次实现
  • 算法有零个或多个输入
  • 算法有一个或多个的输出

4、质量指标

  • 正确性
  • 可读性
  • 稳健性
  • 高效率与低存储量需求

5、设计方法

  • 结构化方法
  • 面向对象方法

三、几个程序算法的实现

(一)最大公约数

算法描述(C#)

main()
{
  int a,b,t,i;
  input(a,b);
  t=1;
  for(i=2;i<=a and i<=b;i=i+1)
    while (a mod i =0 and b mod i =0)
    {
      t=t*i;
      a=a/i;
      b=b/i;
    }
    print(a,b,"最大公约数是:",t);
}

该算发的优化(Java)——辗转相除法

自然语言描述
辗转相除法是利用以下性质来确定两个正整数 a 和 b 的最大公因子的:

  1. 若 r 是 a ÷ b 的余数,则
    gcd(a,b) = gcd(b,r)
  2. a 和其倍数之最大公因子为 a。
    另一种写法是:
  3. a ÷ b,令r为所得余数(0≤r<b)
    若 r = 0,算法结束;b 即为答案。
  4. 互换:置 a←b,b←r,并返回第一步
    这条算法基于一个定理:两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数。比如10和25,25除以10商2余5,那么10和25的最大公约数,等同于10和5的最大公约数。
import java.util.Scanner;
//最大公约数
public class GreatestMath {
	public static void main(String[] args) {
		System.out.println("请输入两个整数:");
		Scanner sc =new Scanner(System.in);
		int num1 = sc.nextInt();
		int num2 = sc.nextInt();
		int num3 = num1%num2;
		while(num3!=0) {
			num1 = num2;
			num2 = num3;
			num3 = num1%num2;
		}
		System.out.println("最大公约数为:"+num2);
	}
}

(二)最小公倍数

算法实现(Java)——最小公倍数=两整数的乘积÷最大公约数

//最小公倍数
import java.util.Scanner;
public class GreatestMathDemo {
	public static void main(String[] args) {
		System.out.println("请输入两个整数:");
		Scanner sc = new Scanner(System.in);
		int num1 = sc.nextInt();
		int num2 = sc.nextInt();
		int temp;
		if(num1<num2) {
			temp = num1;
			num1 = num2;
			num2 = temp;
		}
		int num3 = num1%num2;
		int min = (num1*num2)/num3;	
		if(num3 ==0) {
			System.out.println("最小公倍数是:"+num1);
		}else {
		System.out.println("最小公倍数是:"+min);	
		
		}	
	}
}

(三)一个矩阵的输出(无键盘输入)

//矩阵输出
public class Array01 {
	public static void main(String[] args) {
		int[] arr ={1,2,3,4,5,6};
		for(int i=1;i<=6;i++) {	
			for(int j=1;j<=arr.length;j++) {
				int t = (j-i)<0?j-i+6:j-i;
				System.out.print(arr[t]+" ");
		}			
			System.out.println();
		}
	}
}

(四)求2+22+222+2222+……+22……22的和

情况一:程序可以说有一点小问题

import java.util.Scanner;
public class FactorialSum01 {
	public static void main(String[] args) {
		int m=0;
		long sum =0;
		Scanner sc =new Scanner(System.in);
		System.out.println("请输入您要计算这个项式的位数:");
		int n = sc.nextInt();
		for(int i=0;i<n;i++) {
			m=(m*10)+2;
			sum+=m;
		}
		System.out.println("(2+22+222+……+22……22)这个项式的和为:"+sum);
	}
}

情况二:利用Math类中pow方法

import java.util.Scanner;
public class FactorislSun02 {
	public static void main(String[] args) {
		int sum=0;
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入您要计算这个项式的位数:");
		int num = sc.nextInt();
		for(int i =1;i<=num;i++) {
			sum+=((int)Math.pow(10,i)-1)/9*2;
		}
		System.out.println("(2+22+222+……+22……22)这个项式的和为:"+sum);
	}
}

(五)递归算法

递归算法解决问题的特点:.
1)递归就是方法里调用自身。
2)在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。
3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
4)在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。

n的阶乘

import java.util.Scanner;
public class Factrorisl_N {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("请输入您想要求阶乘的数:");
		int num = sc.nextInt();
		int sum = method(num);
		System.out.println(num+"的阶乘是:"+sum);
		
	}
	public static int method(int num) {
		if(num ==0 || num ==1) {
			return 1;
		}else {
			return num*method(num-1);
		}
	}
}

汉诺塔问题

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
后来,这个传说就演变为汉诺塔游戏,玩法如下:
1.有三根杆子A,B,C。A杆上有若干碟子
2.每次移动一块碟子,小的只能叠在大的上面
3.把所有碟子从A杆全部移到C杆上

图片

代码实现——Java

import java.util.Scanner;
public class Hanoi {
   //使用递归法求解含有n个不同大小盘子的汉诺塔移动路径,参数n为盘子数,把A塔上盘子全部移动到C塔上,B为过渡塔
    public static void recursionHanoi(int n,char A,char B,char C){
        if(n == 1){
            System.out.print(A+"——>"+C+"\n");
        }
        else{
            recursionHanoi(n-1,A,C,B);  
           //使用递归先把A塔最上面的n-1个盘子移动到B塔上,C为过渡塔
            System.out.print(A+"——>"+C+"\n");    
          //把A塔中底下最大的圆盘,移动到C塔上
            recursionHanoi(n-1,B,A,C);      
          //使用递归把B塔上n-1个盘子移动到C塔上,A为过渡塔
        }
    }

   public static void main(String[] args){
        System.out.println("请输入盘子总数n:");
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        recursionHanoi(n,'A','B','C');
    }
}

斐波纳锲数列

斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368........
这个数列从第3项开始,每一项都等于前两项之和。

代码实现——Java

import java.util.Scanner;
public class Fibonacci_Seqence {
	public static long finbonacci(long number) {
		if(number == 1||number ==0){
			return number;
		}else {
			return finbonacci(number-1)+finbonacci(number-2);
		}
	}
	
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		System.out.println("请输入您要打印输出的几项:");
		int n = sc.nextInt();
		for(int i=0;i<=n;i++) {
			System.out.println("第"+i+"项是:"+finbonacci(i)+" ");
		}
	}
	
}

posted @ 2020-09-10 20:19  余月七  阅读(287)  评论(0编辑  收藏  举报