如何用pascal语言,把一个自然数转换为二进制,并统计1和0的个数

题目:一个自然数转换成2进制后,如果1的个数比0多,称为A类数,否则称为B类数。输入一个数M(M<10000),统计1到M之间的A,B类数的个数。

第1个回答  2010-08-01
你要做一个窗口的还是命令行的?
这个用栈和一个运算符优先级表可以解决运算次序问题,然后用case进行运算。
这样可以进行四则运算(带括号),但是没有尝试过带平方根和阶乘的,理论上应该也是可以的。
具体描述很复杂,你必须参考一些书籍。你看数据结构吧,一般在讲到栈结构是都会把这个作为例子的。
第2个回答  2010-08-01
对于一个数i,如果它是奇数,那么i(2)的末位为1,否则为零;
我们可以用n来记录i中1-0的个数;
ans:=0;
for i:=1 to m do
begin
n:=0;
t:=i;
while t>0 do
begin
if t mod 2=0 then inc(n) else dec(n);
t:=t div 2(去掉t的最后一位);
end;
if n>0 then inc(ans);
end;
则A类数有ans个
B类数有m-ans个
第3个回答  2010-08-03
我用了位运算。
program AB;
const
er:array[1..14]of longint=(1,3,7,15,31,63,127,255,511,1023,2047,4095
,8191,16383);
var
n,i,j,k,t,ans,n2:longint;
begin
readln(n); n2:=n;
repeat
n:=n div 2;
inc(t);
until n=0;
n2:=n2 xor er[t];
if n2<>0 then
repeat
if n2 mod 2=1 then inc(ans);
n2:=n2 div 2;
until n2=0;
if t-ans>ans then writeln('A') else writeln('B');
end.
第4个回答  2010-08-04
var
m,i,k,a,b,l,p:longint;
begin
readln(m);
for i:=1 to m do
begin
k:=i;
l:=0;
p:=0;
while k<>0 do
begin
if k mod 2=1 then inc(l) else inc(p);
k:=k div 2;
end;
if l>p then inc(a) else inc(b);
end;
writeln(a,' ',b);
end.
很简单滴~本回答被提问者和网友采纳
相似回答