写出0和1的排列

时间:2015-12-07 22:41:15

标签: binary permutation pascal

我需要在pascal中制作程序。

例如

readln(4)

和输出应该是0和1的所有排列

0000 0001 0010 0100 0111 0011 0110 0101 1010 1000 1001 1100 1011 1101 1110 1111

你能帮我吗?

1 个答案:

答案 0 :(得分:-1)

您可能已经注意到“0和1的所有排列”都是binary numbers

给定输入3,您将输出:

000, 001, 010, 011, 100, 101, 110 and  111

他们是数字0123456和基数2(二进制)中的7

所以你在这里有两个问题。

首先,您需要能够将十进制(基数为10)的整数(例如12)转换为二进制(二进制中的12为1100)。

第二个问题是找出用整数停在哪里。如果您输入了2,那么您将输出00, 10, 11并停止。这是从0到3.给定3您输出000, 001, 010, 011, 100, 101, 110, 111 - 从0到7。

这里有模式吗?是。如果输入为X,请尝试找出计算最大十进制数的方法。

  

基地10的权力为10,100 10 1  基数2是2的幂,4 2 1
 因此,给定输入5,我们知道将有5 1 s作为最后一个数字11111。十进制数是多少?它是2 5 -1,它是31.给定输入3,我们知道它将是111,它是7,或2 3 -1  

 因此,给定任何输入X,我们知道最后一个数字将是连续的X 1,并且X 1 s将等于2 X -1
 
 这很容易编程。只需创建一个函数MagicForumulaForCalculatingNumberGivenLength,它以整数作为输入(长度)并返回十进制整数:  
  function MagicForumulaForCalculatingNumberGivenLength(input:integer):integer; Result := (power(2, input) -1);

所以,现在我们知道我们需要达到的十进制数 - 对于输入为5,它是31。

我假设你可以像这样循环:

readln(Input);

for I := 1 to MagicFormulaForCalculatingNumberGivenLength(Input);
    writeln(MagicFormulaForCalculatingBinaryGivenNumber(I));

所以现在唯一的问题是如何创建二进制数。 It's pretty easy - 我会给你伪代码中的代码,这样你就可以自己写成pascal:

define DecimalNumberToBinaryString(Input:integer):string;

  SBinary: string;
  SBinaryRev: string;


  while Input > 0 do
    SBinary = SBinary + mod(Input,2)
    Input = div(Input,2)

 SBinaryRev = TextReverse(SBinary);

 return SBinary