经典算法分析与设计——最短加法链

来源:互联网 发布:linux ping命令 编辑:程序博客网 时间:2024/06/12 20:41

问题描述:

对一个整数序列a1, a2, ,… ,an,若对序列中的每个数a( 1< k  n),总存在序列中的数ai和aj(1<i , jk),使得a= a+ aj,则称该整数序列为加法链。(相加的两个数可以是同一个数)例如:

1 2 3 5 

1 2 4 6 7 

3 6 9 15

都是加法链。

问题:对给定的整数m,构造一个最短的加法链,使得a1 = 1,am = m

输入:整数m

输出:以 1 打头、以m结尾的加法链


算法分析:

  1. 先从最开始输入的数将其拆分为两个数先加,当两个数相同时只输出一个数即可(也就是对2求余为0),否则就输出一个整除2的数以及一个整除2的数再加1
  2. 取最小的一个数再进行第一步的拆分数操作,当拆到的数有1存在,运行终止
  3. 例如下图所示分别对12,和7进行分析:

代码实现(java):

package shortest_addition_chain;import java.util.Scanner;/** * 算法分析:最短加法链 * 问题描述: * 1:先从最开始输入的数将其拆分为两个数先加, *   当两个数相同时只输出一个数即可(也就是对2求余为0), *    否则就输出一个整除2的数以及一个整除2的数再加1 * 2:取最小的一个数再进行第一步的拆分数操作,当拆到的数有1存在,运行终止 * @author jodenhe (824923282@qq.com) * */public class Main {public static void main(String[] args) {@SuppressWarnings("resource")Scanner sc = new Scanner(System.in);System.out.println("输入m:");int m = sc.nextInt();String result = "" + m;if (m != 1 && m != 0) {while (m != 1) {if (m % 2 == 0) {result = m / 2 + " " + result;} else {result = m / 2 + " " + (m / 2 + 1) + " " + result;}m = m / 2;}}System.out.println(result);}}


阅读全文
0 0
原创粉丝点击