您的位置:首页 > 编程语言 > C语言/C++

【备战蓝桥杯】【递归】【C语言】【ALGO-95算法训练 2的次幂表示】

2018-03-11 18:03 375 查看
ALGO-95算法训练 2的次幂表示  时间限制:1.0s   内存限制:512.0MB问题描述  任何一个正整数都可以用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)

提示
用递归实现会比较简单,可以一边递归一边输出
思路:十进制整数转换为二进制整数采用"除2取余,逆序排列"法。
即用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
用递归来实现。将十进制数转换成二进制,记录转换过程中为1的是第几次循环,然后再判断。递归的边界就是当n==0,n==1n==2的时候。 但是应该注意的是,要判断什么时候输出+号,什么时候不输出。当不是最后一个的时候就输出 + 定义数组的时候要定义为局部变量,因为每一次数组存储的都不同。

代码1:
正整数(1<=n<=20000)的二进制输出

a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a[10][b]a[11]a[12]a[13]a[14][/b]#include<stdio.h>
void fun(int n){
int a[15]={0};//20000<2^15
for(int i=14;i>=0;i--){
a[i]=n%2;
n=n/2;
if(n==0)break;
}
for(int j=0;j<=14;j++)
printf("%d",a[j]);
}
int main(){
int n;
scanf("%d",&n);
fun(n);
return 0;
}


代码2:
137=2^7+2^3+2^0#include<stdio.h>
void fun(int n){
int a[15]={0};//20000<2^15
int b[15]={0};//存放b
int m=0;
for(int i=14,j=0;i>=0;i--,j++){
a[i]=n%2;
n=n/2;
if(a[i]!=0){
b[m]=j;//一定从b[0]开始,防止0冲突
m=m+1;
}
if(n==0)break;
}
for(int t=0;t<=14;t++)
printf("%d",b[t]);
}
int main(){
int n;
scanf("%d",&n);
fun(n);
return 0;
}


代码3:
打印[b]137:2(7)+2(3)+2(0)[/b]

#include<stdio.h>
void fun(int n){
int a[15]={0};//20000<2^15
int b[15]={0};//存放b
int m=0;
for(int i=14,j=0;i>=0;i--,j++){
a[i]=n%2;
n=n/2;
if(a[i]!=0){
b[m]=j;//一定从b[0]开始,防止0冲突
m=m+1;
}
if(n==0)break;
}
for(int t=14;t>=1;t--)
if(b[t])printf("2(%d)",b[t]);
printf("2(%d)",b[0]);//b[0]可能是0,单独打印
}
int main(){
int n;
scanf("%d",&n);
fun(n);
return 0;
}



代码4:
               27)+2(3)+2(0)
                     10001001

打印137:2(2(2)+2+2(0))+2(2+2(0))+2(0)

#include<stdio.h>
int l=0;
char temp[1000]={0};
void fun(int n){
if(n==0) {temp[l]='0';l++;return;}
if(n==2) {temp[l]='2',l++;return;}
int a[15]={0};//20000<2^15
for(int i=0;i<=15;i++){
a[i]=n%2;
n=n/2;
if(n==0)break;
}
for(int j=14;j>=0;j--){
if(a[j]==1){
if(j==1){
if(temp[l-1]==')' || temp[l-1]=='2' ) {temp[l]='+';l++;}
temp[l]='2';l++;
}
else{
if(temp[l-1]==')' || temp[l-1]=='2' ) {temp[l]='+';l++;}
temp[l]='2';l++;
temp[l]='(';l++;
fun(j);
temp[l]=')';l++;
}
}
}
}
int main()
{
int n;
scanf("%d",&n);
fun(n);
printf("%s",temp);
return 0;
}



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

or#include<stdio.h>
void f(int a)
{
int i=0,j,b[32],w,k;
if(a==0)printf("0");
else if(a==2)printf("2");
else if(a==1)printf("2(0)");
else
{
while(a){b[i]=a%2;a=a/2;i++;}w=i;
k=0;j=0;for(i=w-1;i>=0;i--)if(b[i])k++;
for(i=w-1;i>=0;i--)
if(b[i])
{j++;
if(i==1)printf("2");
else {printf("2(");f(i);printf(")");}
if(j!=k)printf("+");}
}
}
int main()
{
int a;scanf("%d",&a);
f(a);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: