拿到了关于我前几天发的关于2进制无限循环的正解,让大家看看
~~~~~~花了3天时间还是解不出来~求高手指教
要求是:
Abit 和Bbit是2种2进制数,Abit的值根据输入的变量a,从无限循环的1010101010...中取前a个数作为Abit的值。比如当 a=3,Abit=101;a=4,Abit=1010;a= 7, Abit= 1010101。 Bbit 的值根据输入的变量b,所有b位数的 2进制数都是Bbit的制。 程序的要求是根据输入的a和b,显示出所有含有Abit的Bbit的值,按照由小到大的顺序。不能在程序中使用 string,array 和 recursion。b 的取值从1到31,所以Bbit最大可以有31位数;a的取值小于等于b
下面是一个程序运行情况的sample:
please enter b:
5
please enter a:
3
the results are:
00101
01010
01011
01101
10100
10101
10110
10111
11010
11011
11101
~~~~~~~~~~~~~~~~~~~~~~~~~
大家都用了很多稍微复杂的编程,看到正解以后发现居然都是最简单的loop,和大家分享下
#include <stdio.h>
#include <math.h>
#include <stdbool.h>
/* Determine whether the i'th bit in a number
* is a 0 or a 1. Return true if the bit is a 1. */
bool getIthBit (int val, int i)
{
val /= (int)pow(2, i);
return (val % 2);
}
/* Print off an integer in binary.
* n is the number of bits to print.
*/
void printValue (int n, int val)
{
int i;
for (i = n-1; i >= 0; i--)
{
if (getIthBit(val,i) == true)
printf("1");
else
printf("0");
}
printf("\n");
}
/* Determine if the parameter val contains
* the m-bit pattern.
*/
bool isQualified (int n, int val, int m)
{
int i, j;
int count;
bool found;
for (i = n-1; i >= (m-1); i--) {
found = true;
// walk along and look at m bits
for (j = i, count = 0; (count < m) && found; j--, count++)
{
if (count % 2 == 0)
{ // looking for a 1 in the m-bit pattern
if (getIthBit(val, j) == 0)
found = false;
}
else
{ // looking for a 0 in the m-bit pattern
if (getIthBit(val, j))
found = false;
}
}
if (found) return true;
}
return false;
}
int main (void)
{
int i;
int n, m;
printf("Enter an integer n:\n");
scanf("%d", &n);
printf("Enter an integer m:\n");
scanf("%d", &m);
int limit = pow(2,n);
for (i = 0; i < limit; i++)
{
if (isQualified(n, i, m))
printValue(n,i);
}
return 0;
}