例5004 周易

例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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值