算法训练 幂方分解

问题描述

  任何一个正整数都可以用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))+2+2(0)

输入格式

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

输出格式

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

思路:我用的是递归,先把137用递归2(7)+2(3)+2(0)表达出来,先写简单的,在动态“2(x)”中的x再改成递归函数Fun(),这里的难度在于如何递归输出“+”,搞了我一上午的时间,最后还是发现,在x%2==0的时候,函数递归返回会少一个“+”,所以我用了一个计数器end,每当函数递归调用余数为0的函数时,end+1,但是end在每一层的数字都不一样,最后输出用flag>end来判断后面还有没有数字要加。其实也就是刚刚开始的第一个数如果是偶数,最后递归返回判断要不要加+时,如果余数为0的与余数不为0的相等,说明这一层是末尾,所以不用加+。

#include <bits/stdc++.h>
using namespace std;
void Fun(int x,int flag,int end){
	if(x==0) return;
	else if(x%2==1){
		Fun(x/2,flag+1,end);	
		if(flag==0||flag==2){
			cout<<"2("<<flag<<")";		
		}else if(flag==1){
			cout<<"2";
		}else{
			cout<<"2(";Fun(flag,0,0);cout<<")";	
		}
			if(flag>end)cout<<"+";
	}else{
		Fun(x/2,flag+1,end+1);
	}	
}
int main(){
	int a;
	cin>>a;
	Fun(a,0,0);	
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值