2的次幂表示 蓝桥杯
来源:互联网 发布:黑龙江省人工智能学会 编辑:程序博客网 时间:2024/06/05 20:00
问题描述 任何一个正整数都可以用2进制表示,
例如:137的2进制表示为10001001。
将这种2进制表示写成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)
输入格式:
正整数(1<=n<=20000)
输出格式:
符合约定的n的0,2表示(在表示中不能有空格)
样例输入 137
样例输出 2(2(2)+2+2(0))+2(2+2(0))+2(0)
样例输入 1315
样例输出 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
提示
用递归实现会比较简单,可以一边递归一边输出 解题思路 用递归来实现。将十进制数转换成二进制,记录转换过程中为1的是第几次循环,然后再判断。递归的边界就是当n==0,n==1n==2的时候。 但是应该注意的是,要判断什么时候输出+号,什么时候不输出。当不是最后一个的时候就输出 + 定义数组的时候要定义为局部变量,因为每一次数组存储的都不同。 代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<stdio.h>
int
main()
{
int
n;
void
cimi(
int
n);
while
(scanf(
"%d"
,&n)!=EOF)
{
cimi(n);
printf(
"\n"
);
}
return
0
;
}
void
cimi(
int
n)
{
int
num;
int
i,j,k;
int
a[
32
];
//数组定义为局部变量
num=
0
;
i=
0
;
while
(n)
{
j=n%
2
;
if
(j==
1
)
a[num++]=i;
//存储第几次是1
i++;
n/=
2
;
}
for
(i=num-
1
;i>=
0
;i--)
{
if
(a[i]==
0
)
printf(
"2(0)"
);
else
if
(a[i]==
1
)
printf(
"2"
);
else
if
(a[i]==
2
)
printf(
"2(2)"
);
else
if
(a[i]>
2
)
{
printf(
"2("
);
cimi(a[i]);
printf(
")"
);
}
if
(i!=
0
)
printf(
"+"
);
//如果不是最后一个就得输出 +
}
}
***************************************************************************************
- #include <stdio.h>
- void fun(short i)
- {
- int j=0;
- if(i==0)
- {
- printf("0"); //0位是1时,配合调用前的2()正好组成2(0),即1
- return;
- }
- if (i==1)
- {
- printf("2(0)"); //1位是0,即2(2(0)),也就是2,只有2(),括号内的数拆分时有1才会用到
- return;
- }
- if(i==2)
- {
- printf("2"); //2(2)
- return;
- }
- for(;i!=0;j++)
- {
- if(i&1) //位运算
- {
- if(j==1) //2位为1直接打印2,不再递归
- printf("2");
- else
- {
- printf("2(");
- fun(j);
- printf(")");
- }
- i=i>>1;
- if(i!=0)
- printf("+"); //看情况打印“+”号
- continue;
- }
- i=i>>1;
- }
- }
- int main(int argc, char* argv[])
- {
- short i;
- scanf("%d",&i);
- fun(i);
- return 0;
- }
0 0
- 蓝桥杯题目 2的次幂表示
- 2的次幂表示 蓝桥杯
- 蓝桥杯:2的次幂表示
- 蓝桥杯 2的次幂表示
- 【蓝桥杯-java】2的次幂表示
- 2的次幂表示
- 2的次幂表示
- 2的次幂表示
- 2的次幂表示
- 2的次幂表示
- 2的次幂表示
- 2的次幂表示
- 2的次幂表示
- 2的次幂表示
- 2的次幂表示
- 2的次幂表示
- 2的次幂表示
- 2的次幂表示
- Linux系统我最常用的20条命令
- Hibernate 与mybatis的区别
- 大数加法
- C++虚函数表详细解释及实例分析
- TensorFlow在图像识别中的应用
- 2的次幂表示 蓝桥杯
- javaWeb笔记(六) 分页 显示分页页码列表
- HDU-1012-u Calculate e( C++ && 2000年纽约水果)
- uva10859 - Placing Lampposts
- 虽鸡汤,但够补
- uvaoj-401:回文词
- 查看Eclipse版本号,及各个版本区别
- 蓝桥杯 历届试题 错误票据
- Ubuntu14.04 下apt-get安装Code::Blocks