问题描述:
有人说,中国古代的“周易”是二进制系统的起源,在该系统中,他们用“- -”表示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;
}