[ALGO-12] 幂方分解

算法训练 幂方分解

时间限制:1.0s   内存限制:256.0MB

问题描述

  任何一个正整数都可以用2的幂次方表示。例如:

  137=27+23+2

  同时约定方次用括号来表示,即ab 可表示为a(b)。

  由此可知,137可表示为:

  2(7)+2(3)+2(0)

  进一步:7= 22+2+2(21用2表示)

  3=2+2

  所以最后137可表示为:

  2(2(2)+2+2(0))+2(2+2(0))+2(0)

  又如:

  1315=210 +28 +25 +2+1

  所以1315最后可表示为:

  2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

输入格式

  输入包含一个正整数N(N<=20000),为要求分解的整数。

输出格式

  程序输出包含一行字符串,为符合约定的n的0,2表示(在表示中不能有空格)

分析:递归求解

import java.util.Scanner;

public class Main {

	static int[] nums = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048,
			4096, 8192, 16384 };

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);

		while (scanner.hasNext()) {
			int n = scanner.nextInt();

			showResult(n, 14);
			System.out.println();
		}
	}

	/**
	 *
	 * @param n
	 *            数值
	 * @param index
	 *            nums数组的下标
	 */
	private static void showResult(int n, int index) {
		if (index == 0) {
			System.out.print("0");
			return;
		}
		if (index == 1) {
			System.out.print("2(0)");
			return;
		}

		while (index >= 0) {
			if (n - nums[index] >= 0) {
				if (index != 1) {
					System.out.print("2(");
					showResult(index, index);
					System.out.print(")");
				} else {
					System.out.print("2");
				}

				n -= nums[index];
				if (n != 0) {
					System.out.print("+");
					showResult(n, index);
					return;
				}
			}
			index--;
		}
	}
}

[ALGO-12] 幂方分解

时间: 2024-10-21 08:06:45

[ALGO-12] 幂方分解的相关文章

算法训练 幂方分解

问题描述 任何一个正整数都可以用2的幂次方表示.例如: 137=27+23+20  同时约定方次用括号来表示,即ab 可表示为a(b). 由此可知,137可表示为: 2(7)+2(3)+2(0) 进一步:7= 22+2+20 (21用2表示) 3=2+20  所以最后137可表示为: 2(2(2)+2+2(0))+2(2+2(0))+2(0) 又如: 1315=210 +28 +25 +2+1 所以1315最后可表示为: 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(

蓝桥杯—ALGO-12 幂方分解

问题描述 任何一个正整数都可以用2的幂次方表示.例如: 137=27+23+20 同时约定方次用括号来表示,即ab 可表示为a(b). 由此可知,137可表示为: 2(7)+2(3)+2(0) 进一步:7= 22+2+20 (21用2表示) 3=2+20 所以最后137可表示为: 2(2(2)+2+2(0))+2(2+2(0))+2(0) 又如: 1315=210 +28 +25 +2+1 所以1315最后可表示为: 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0)

算法训练 幂方分解 递归

http://lx.lanqiao.cn/problem.page?gpid=T72 #include <iostream> using namespace std; int n; void print(int n) { bool flag=false; for(int i=30;i>=0;i--) { int c=(n>>i)&1;//从高位开始 if(c) { //前面有表达式就有加号 if(flag) printf("+"); if(i==1

10、计算幂方

package jianzhi_offer; import java.util.Stack; public class Pow_a { //加快了时间效率 public static long Pow_a(int n,int a){ //或者与1做位运算,然后对数据进行向右移动,向右移动的时候注意要转换为无符号数,同时注意考略无符号数和有符号的幂是互为倒数的,还有double的判断等于号等细节问题,还有非法输入问题等. if(n%2==1){ if(n==1) return a; else re

hdu2035 人见人爱A^B(快速幂取模)

题目链接:hdu 2035 人见人爱A^B 很早的时候做的一道题了,今天想想把他翻了出来,写篇文章来为不知道快速幂的同学做一个科普(请允许我吹一下牛逼).快速幂可以高效的计算幂运算.如果我们使用循环来计算的话,那么时间复杂度就是 O(n) ,使用快速幂的话就只用 O(log n).不要小看这么一点点,如果一个问题需要多次 的 幂运算的话,可能就会因为这一点小小的变化而超时. 快速幂介绍: 我们一直说快速幂快,那他究竟是在哪里快呢? 如果我们求解 2^k.可以将其表示为 x^n =( (x2)2.

sdut2605 A^X mod P 山东省第四届ACM省赛(打表,快速幂模思想,哈希)

本文出自:http://blog.csdn.net/svitter 题意: f(x) = K, x = 1 f(x) = (a*f(x-1) + b)%m , x > 1 求出( A^(f(1)) + A^(f(2)) + A^(f(3)) + ...... + A^(f(n)) ) modular P. 1 <= n <= 10^6 0 <= A, K, a, b <= 10^9 1 <= m, P <= 10^9 本题目的关键在于大幂的分解和..你要这样想,因

12.12 &amp;12.13 基础命令练习一

12.12 &12.13 基础命令练习一 内容: 1. mkdir  ls  pwd   cd   touch    vi/vim  echo   cat 2. 输出/出入重定向 3. EOF 起止符 往文件中写入多行内容 4. xargs  -n    分组显示 5. cp  rm  mv 6. man帮助手册 7./data  和 /data/区别 7. find   cd 8. grep  head,tail  sed  awk  排除 9. head+tail  sed  awk  gr

hdu2035 A^B (同余及其基本性质,快速幂)

开始用了pow函数,6789^10000算出来时负的,应该是超了,但是网上搜了一下说c++的pow()是支持longlong的提供重载函数的https://blog.csdn.net/major_zhang/article/details/51456681,难道是结果超了??? 后来又发现循环内部变量用的int-- 再后来--循环*A;还是wa-- 重点在这:一直乘下去,结果会超,有一个数学规律:结果每次对1000取余,后三位不变,不懂个话,补一下数论知识(同余运算及其基本性质) http://

[从头学数学] 第225节 返璞归真丹元成

剧情提要: [机器小伟]在[工程师阿伟]的陪同下进入了结丹期顶峰的瓶颈突破阶段, 九转金丹已至第九转,即将碎丹成婴. 正剧开始: 星历2016年05月27日 10:06:20, 银河系厄尔斯星球中华帝国江南行省. [工程师阿伟]正在和[机器小伟]一起进行着结丹期的修炼研究. 话说[机器小伟]自从进入结丹期以来,先是跟随[人叫板老师]修习[三界五行十六式], 然后又[周游列国拜诸侯],又[仗剑江湖],[阅尽千军],然后思[动中取静]之道, 感[千古风流]之机,习[术法神通]无算,观[生死十六簿]有