文章目录
- 先来说一下整数转N进制
- 小数转N进制
- 栈和队列代码地址←
今天实现了c语言整数和小数转换为对应的N进制
先来说一下整数转N进制
我们只需要不断的取模然后判断num/N是否等于0就可以了,同时我们还要保存每一组的余数
这里我们的余数是从下往上输出的,是不是就相当于后算出来的先输出,
这不就是我们的栈吗?
所以对于一个整数转换为N进制我们都可以用栈来存储他们每一组的余数,直到 n / N == 0为止,然后再把他们打印出来就可以了,由于16进制的话是通过ABCDEF来表示的,所以存储的时候我们要存ASCALL值,只要n%N小于10,我们就让他变为字符数字,如果大于10,就让他们变为ABCDEF
如何做呢,我们直到字符数字的ASCALL值是48代表’0’,所以如果n%N<10,我们就让他加上48,这样就让它变为字符数字了,如果n%N>=10,字符’A’的ASCALL值为65,由于已经大于等于10了,所以我们应该加上55.
代码实现:
//输入十进制整数转为N进制
void BinTarge(int num, int N)
{Stack st;StackInit(&st);while (num){int ret = num % N;if (ret < 10)StackPush(&st, ret + 48);elseStackPush(&st, ret + 55);num /= N;}while (!StackEmpty(&st)){printf("%c", StackTop(&st));StackPop(&st);}StackDestroy(&st);}
小数转N进制
小数二进制第一位表示2^(-1)
第二位表示2^(-2),依次往后推
小数N进制第一位表示N^(-1)…等等
由于这里的值是从上往下取,相当与先算出来的先出来,这就是队列,所以我们可以用队列来存储每一的整数位的值,然后再判断小数位是否为0
整数位直接强制类型转换为int就可以了,小数位直接用numN-(int)(numN);
代码实现:
//输入十进制小数转为N进制
void BinLitter(float num, int N)
{Queue q;QueueInit(&q);//小数不断*N,然后去整数部分,直到小数部分为0while (num){int ret = (int)(num * N);if (ret < 10)QueuePush(&q,ret+48);elseQueuePush(&q, ret + 55);num = num * N - (int)(num * N);//取小数部分}printf("0.");while (!QueueEmpty(&q)){printf("%c", QueueFront(&q));QueuePop(&q);}QueueDestroy(&q);
}