算法训练 幂方分解
时间限制:1.0s 内存限制:256.0MB
问题描述
任何一个正整数都可以用2的幂次方表示。例如:
137=2 7+2 3+2 0
同时约定方次用括号来表示,即a b 可表示为a(b)。
由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7= 2 2+2+2 0 (2 1用2表示)
3=2+2 0
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=2 10 +2 8 +2 5 +2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
137=2 7+2 3+2 0
同时约定方次用括号来表示,即a b 可表示为a(b)。
由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7= 2 2+2+2 0 (2 1用2表示)
3=2+2 0
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=2 10 +2 8 +2 5 +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表示(在表示中不能有空格
有的题目可能看起来比较难,但是需要你自己去逐步分解成简单问题
#include <cstdio>
#include <cstring>
using namespace std;
int divide(int n,int a[])
{
int i=0;
while(n)
{
a[i]=n%2;
n=n/2;
i++;
}
return i-1;
}
void put(int n,int a[])
{
int temp[16];
for(int j=n;j>=0;j--)
{
if(a[j]==1&&j!=n)
{
printf("+");
}
if(a[j]==1)
{
if(j!=1)
{
printf("2(");
}
else
{
printf("2");
}
if(j>2)
{
int i=divide(j,temp);
put(i,temp);
printf(")");
}
else if(j==0||j==2)
{
printf("%d)",j);
}
}
}
}
int main()
{
int a[16];
int n;
scanf("%d",&n);
int i=divide(n,a);
put(i,a);
return 0;
}
<<
返回
算法训练 幂方分解
时间限制:1.0s 内存限制:256.0MB
问题描述
任何一个正整数都可以用2的幂次方表示。例如:
137=2 7+2 3+2 0
同时约定方次用括号来表示,即a b 可表示为a(b)。
由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7= 2 2+2+2 0 (2 1用2表示)
3=2+2 0
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=2 10 +2 8 +2 5 +2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
137=2 7+2 3+2 0
同时约定方次用括号来表示,即a b 可表示为a(b)。
由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7= 2 2+2+2 0 (2 1用2表示)
3=2+2 0
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=2 10 +2 8 +2 5 +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表示(在表示中不能有空格)
主办单位:工业和信息化部人才交流中心
地址:北京市海淀区万寿路27号院工信部机关18#信箱 邮编: 100846
电话:4006-588-662 传真:010-68208666 京ICP备11024192号 京公网安备 11010802020352号
E-mail: lanqiao@lanqiao.org
- 关注订阅号,资讯先了解!
- 关注服务号,轻松查成绩!