任意一个正整数都可以用2的幂次方表示
答案:5 悬赏:40
解决时间 2021-02-28 20:05
- 提问者网友:酱爆肉
- 2021-02-28 16:47
任意一个正整数都可以用2的幂次方表示
最佳答案
- 二级知识专家网友:你可爱的野爹
- 2021-02-28 17:57
也不说用什么语言,怎么给你写程序嘛,还是你自己写吧,用递归来做这样的程序是很简单的,不用管n有多大,因为n太大以后就需要多次扫描。
对于任意的数n,可以根据其二进制形态哪些位数为1改为∑2(i)的形式,然后递归把里面括号中大于的2的数进行分解,最后没有大于的2的指数出现即可。
设计一个把n转换为字符串的函数,逐位转换时,如果遇到大于2的指数就递归调用一次本函数,装配一下字符串即可。
补充:
今天花了半小时下载和学习了QBASIC,下面是我人生的第一个QBASIC程序,调试通过,结果保证正确:
FUNCTION STR2$ (X)
LET s$ = ""
LET I = X
LET j = 0
DO WHILE I > 0
IF I MOD 2 = 1 THEN
IF s$ <> "" THEN s$ = "+" + s$
IF j > 2 THEN
s$ = "2(" + STR2$(j) + ")" + s$
ELSE
IF j = 1 THEN
s$ = "2" + s$
ELSE
IF j = 0 THEN
s$ = "2(0)" + s$
ELSE
s$ = "2(2)" + s$
END IF
END IF
END IF
END IF
I = INT(I / 2)
j = j + 1
LOOP
STR2$ = s$
END FUNCTION
DECLARE FUNCTION STR2$ (X!)
INPUT X
PRINT STR2$(X)
有主程序和函数,我是按F2进行切换分开复制的,我也不太熟悉QBASIC的操作,希望你是高手,一看就明白。
对于任意的数n,可以根据其二进制形态哪些位数为1改为∑2(i)的形式,然后递归把里面括号中大于的2的数进行分解,最后没有大于的2的指数出现即可。
设计一个把n转换为字符串的函数,逐位转换时,如果遇到大于2的指数就递归调用一次本函数,装配一下字符串即可。
补充:
今天花了半小时下载和学习了QBASIC,下面是我人生的第一个QBASIC程序,调试通过,结果保证正确:
FUNCTION STR2$ (X)
LET s$ = ""
LET I = X
LET j = 0
DO WHILE I > 0
IF I MOD 2 = 1 THEN
IF s$ <> "" THEN s$ = "+" + s$
IF j > 2 THEN
s$ = "2(" + STR2$(j) + ")" + s$
ELSE
IF j = 1 THEN
s$ = "2" + s$
ELSE
IF j = 0 THEN
s$ = "2(0)" + s$
ELSE
s$ = "2(2)" + s$
END IF
END IF
END IF
END IF
I = INT(I / 2)
j = j + 1
LOOP
STR2$ = s$
END FUNCTION
DECLARE FUNCTION STR2$ (X!)
INPUT X
PRINT STR2$(X)
有主程序和函数,我是按F2进行切换分开复制的,我也不太熟悉QBASIC的操作,希望你是高手,一看就明白。
全部回答
- 1楼网友:不想翻身的咸鱼
- 2021-02-28 19:31
不就是十进制都能转2进制吗?
- 2楼网友:逐風
- 2021-02-28 19:17
C语言程序,编死我了!
#include<stdio.h>
void main()
{
int deep(int m,int r);
int n;
printf("input a number:");
scanf("%d",&n);
if(n>=1)
{ deep(n,0);
printf("\n");
}
else
printf("data error!");
}
int deep(int m,int r)
{
if(m==1)
switch(r)
{
case 0:printf("2(0)");break;
case 1:printf("2");break;
case 2:printf("2(2)");break;
default:
{
printf("2(");
deep(r,0);
printf(")");
}
}
else
{
deep(m/2,r=r+1);r--;
if(m%2==1)
switch(r)
{
case 0:printf("+2(0)");break;
case 1:printf("+2");break;
case 2:printf("+2(2)");break;
default:
{
printf("+2(");
deep(r,0);
printf(")");
}
}
}
}
#include<stdio.h>
void main()
{
int deep(int m,int r);
int n;
printf("input a number:");
scanf("%d",&n);
if(n>=1)
{ deep(n,0);
printf("\n");
}
else
printf("data error!");
}
int deep(int m,int r)
{
if(m==1)
switch(r)
{
case 0:printf("2(0)");break;
case 1:printf("2");break;
case 2:printf("2(2)");break;
default:
{
printf("2(");
deep(r,0);
printf(")");
}
}
else
{
deep(m/2,r=r+1);r--;
if(m%2==1)
switch(r)
{
case 0:printf("+2(0)");break;
case 1:printf("+2");break;
case 2:printf("+2(2)");break;
default:
{
printf("+2(");
deep(r,0);
printf(")");
}
}
}
}
- 3楼网友:洎扰庸人
- 2021-02-28 18:51
注意,计算机中数字本身就是二进制表示的,即每一位都是2的次幂。
所以只需把内部表示方法表达出来就可以了,根本无须刻意编程。
所以只需把内部表示方法表达出来就可以了,根本无须刻意编程。
- 4楼网友:上分大魔王
- 2021-02-28 18:05
varn:integer;
procedure bin(k:integer);
var
b:array[0..15] of integer;
i,p:integer;
first:boolean;
begin
p:=-1;
if k=0 then
write(0)
else begin
while k>0 do
begin
inc(p);
b[p]:=k mod 2;
k:=k div 2;
end;
first:=true;
for i:=p downto 0 do
if b[i]=1 then
begin
if first then first:=false else write('+');
if i=1 then write('2')
else begin
write('2(');
bin(i);
write(')');
end;
end;
end;
end;
begin
write('n=');
readln(n);
bin(n);
writeln;
end.
procedure bin(k:integer);
var
b:array[0..15] of integer;
i,p:integer;
first:boolean;
begin
p:=-1;
if k=0 then
write(0)
else begin
while k>0 do
begin
inc(p);
b[p]:=k mod 2;
k:=k div 2;
end;
first:=true;
for i:=p downto 0 do
if b[i]=1 then
begin
if first then first:=false else write('+');
if i=1 then write('2')
else begin
write('2(');
bin(i);
write(')');
end;
end;
end;
end;
begin
write('n=');
readln(n);
bin(n);
writeln;
end.
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯