5004 周易

问题描述:

       有人说,中国古代的“周易”是二进制系统的起源,在该系统中,他们用“- -”表示1,“---”表示0。因此,二进制数字“011010”可以表述为“---\n- -\n- -\n---\n- -\n---\n”(符号“\n”表示换行)。现在的问题是如何把一个十进制数转换为“周易”中的二进制?

输入:

文件中包含多组测试数据。每个测试数据占一行,包括一十进制整数n(0 <= n <= 1000000)和表示二进制位数的k(0 < k <= 20 且 n < 2^k)。

n=0,k=0表示输入结束。

输出:

对于每组测试数据,输出“周易”中对应的k行二进制数。每组测试数据之间输出一个空行。

输入样例:

7 3

0 3

26 6

0 0

 输出样例:

- -

- -

- -

---

---

---

---

- -

- -

---

- -

---

 

解题分析:

       这题首先要把十进制数转换为二进制数,这个可以采用除2取余,再逆序输出即可。其次就是如何输出k位,这里可能涉及到两种情况,一是k要大于实际二进制数的位数,那么前面需要用0来填补。二是k小于实际的位数,那么需要在输出时控制只输出前k位(这里不会出现这种情况,因为题目中已经明确了n < 2^k)。由于k>0且k<=20,因此我们可以使用一个20位长的整数数组来存储转换后的二进制数,初始化时全部为0。

代码

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int main(int argc, char *argv[]) {
	int n,k;
	while(1){
		int i,j=0;
		scanf("%d %d",&n,&k);
		if(n==0&&k==0) break;
		int a[20]={0};
		if(n==0){//输入为0时直接输出k个0对应的符号
			for(i=0;i<k;i++) printf("---\n");
		}
		else{
			while(n){
				a[j]=n%2;
				n/=2;
				j++;
			}
			if(j<k){//k比实际位数大,先补0,再输出
				for(i=j;i<k;i++){
					printf("---\n");
				}
			}
			for(i=j-1;i>=0;i--){//逆序输出二进制
				if(a[i]==0) printf("---\n");
				else printf("- -\n");
			}
			
		}
		printf("\n");
	}
	return 0; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值