例5004 周易
Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others)
Total Submissions: 315 Accepted Submissions: 104
Problem Description
有人说,中国古代的“周易”是二进制系统的起源,在该系统中,他们用“- -”表示1,“—”表示0。因此,二进制数字“011010”可以表述为“—\n- -\n- -\n—\n- -\n—\n”(符号“\n”表示换行)。现在的问题是如何把一个十进制数转换为“周易”中的二进制?
Input
文件中包含多组测试数据。每个测试数据占一行,包括一十进制整数n(0 <= n <= 1000000)和表示二进制位数的k(0 < k <= 20 且 n < 2^k)。
n=0,k=0表示输入结束。
Output
对于每组测试数据,输出“周易”中对应的k行二进制数。每组测试数据之间输出一个空行。
Sample Input
7 3
0 3
26 6
0 0
Sample Output
- -
- -
- -
---
---
---
---
- -
- -
---
- -
---
题解:
这个题没有必要把十进制数的二进制的完整表示求出来,我们只需要把每一位求出来的二进制直接转化为周易的符号即可。
但是,这里有一个细节,就是它给的十进制数转化为二进制的位数可能没有它所要求输出的二进制位数多,这样我们就得考虑前导0的处理。
这里我们发现它所给的二进制位数<=20,所以我们可以把二进制数存在一个长度为20,全为0的数组中,这样我们只需要输出足够的位数即可,前导0的问题就解决了。
#include <stdio.h>
#include <string.h>
int main()
{
int num,count;
int a[20];
while(1)
{
int i = 0;
memset(a,0,sizeof(a));
scanf("%d %d",&num,&count);
if(num==0&&count==0)
break;
while(num)
{
a[i++] = num%2;
num /= 2;
}
for(int j = count-1;j>=0;j--)
{
if(a[j]==1)
printf("- -\n");
else
if(a[j]==0)
printf("---\n");
}
printf("\n");
}
return 0;
}