您的位置:首页 > 其它

算法训练 幂方分解

2016-01-22 12:48 239 查看
问题描述
  任何一个正整数都可以用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表示(在表示中不能有空格)
思路:
先对N进行幂的分解,然后对幂进行递归分解
注意:
1当某项(幂)不是最后一项(幂)的时候输出加号
2定义数组a[16](存储0,1)的时候要定义为局部变量,因为每一次数组存储的都不同
3递归的边界是0,1,2

#include <stdio.h>
int divide(int N ,int *a)
{
int i = 0;
while(N)
{
a[i++] = N%2;
N /= 2;
}
return i;
}
int IsLast(int i,int *a)
{
int k ;
//第i位前面有1,则表示a[i]不是最后一个1
for(k=0;k<i;k++)
if(a[k])
return 0;
return 1;
}
void recur(int N)
{
int i,t;
int a[16];
if(N == 0 || N == 2)
{
printf("2(%d)",N);
return;
}
else if(N == 1)
{
printf("2");
return;
}
else{//N > 2
printf("2(");
t = divide(N,a);
i = t-1;
while(i >= 0)
{
if(a[i])
{
recur(i);//幂
if(!IsLast(i,a))//不是最后一个要带加号
printf("+");
}
i --;
}
printf(")");
}
}
int main()
{
int N,i,t;
int a[16];
scanf("%d",&N);
//先对N进行幂的分解,然后对幂进行递归分解
t = divide(N,a);
i = t-1;
while(i >= 0)
{
if(a[i])
{
recur(i);//幂
if(!IsLast(i,a))//不是最后一个1
printf("+");
}
i --;
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: