对于进制转换,其实是具有以下最初的思想
1-输入某一个十进制的数值
2-选择你所要进行的进制转换类型
3-将这个数的来进求余进制数并保留在数组中
4-将十进制的数字除以进制数
5-这是一个循环,直至该数小于零则结束
6-然后再让数组进行反向输出就能得到你所要转换的二进制
do{
a[count++]=x%p;
x=x/p;
}while(x!=0);
#include <stdio.h>
int main(){
int x,p; //x为十进制数,p为目标进制大小
scanf("%d",&x);
scanf("%d",&p);
int a[100]; //存放余数
int count=0;
do{
a[count++]=x%p;
x=x/p;
}while(x!=0);//当商不为0时进行循环
for(int i=count-1;i>=0;i--){
printf("%d",a[i]);
}
}
方法二 (其实原理是一样的,一样是求基取余)
#include<stdio.h>
int main(){
int A,B,sum,i=0,radix,c[31];
scanf("%d %d %d",&A,&B,&radix);
sum=A+B;
if(sum==0)//考虑两者相加为0的情况。
printf("0");
while(sum>0){
c[i++]=sum%radix; //十进制转其他进制,用除基取余法
sum/=radix; //(不断用商除以基数,然后倒序排列余数)
}
for(--i;i>=0;i--)
printf("%d",c[i]);
return 0;
}
方法三(传统的做法)
分析:这个做法的原理是去定义一个空的数组,以及定义一个函数,然后当你把所有的十进制二进制都输入完之后开始去调用函数,然后进入函数第一件事情是进行判断,如果你是0,哪个直接被覆盖掉,如果不是继续往下走,然后就用到递归,多次调用,直至再次传入这个函数中的数值为0然后进行返回。
在此涉及到以下的函数
这些函数的头文件是#include <string.h>
strlen :计算字符串的长度,作用类似于sizeof
strcpy:这个函数是可以用后续的将(s,"")的后覆盖前。
convto(s, n / b, b); //递归函数
len = strlen(s); //计算字符串的长度
s[len] = bit[n % b]; //求余
s[len + 1] = '\0'; //因为字符串的结尾要是空
#include <stdio.h>
#include <string.h>
void convto(char* s, int n, int b);
int main(void) {
char s[80]; //数组
int base, old;
printf("请输入十进制数:");
scanf("%d", &old);
printf("请输入转换的进制:");
scanf("%d", &base);
convto(s, old, base);
printf("%s\n", s);
getchar();
return 0;
}
void convto(char* s, int n, int b) {
char bit[] = { "0123456789ABCDEF" };
int len;
if (n == 0) {
strcpy(s, ""); //这个是用空覆盖
return;
}
convto(s, n / b, b);
len = strlen(s);
s[len] = bit[n % b];
s[len + 1] = '\0';
}
第四种方法:数据结构栈来进行进制转化
看着是很复杂吧,但是对于栈的构建完成后这个其实是不复杂的。
如果不了解栈,那么就去我的另一篇文章了解一下吧
栈的初步了解及其运用https://blog.csdn.net/m0_61196970/article/details/125859630?spm=1001.2014.3001.5502
那么对于这个进制的转换 其实核心也是这个
就是当你传入的N然后来进行求余,之后你去判断它是否为空,但是这些的判断都是基于函数上的判断的,同时在栈中进行的。
void conversion(int N, int d) {
// int c;
SeqStack s;
Elemtype t;
Init_SeqStack(&s);
while (N) {
Push_SeqStack(&s, N % d);
N = N / d;
}
while (!Empty_SeqStack(&s)) {
Pop_SeqStack(&s, &t);
printf("%d",t);
}}
代码如下
#include<stdio.h>
#define MAXSIZE 30
typedef int Elemtype;
typedef struct {
Elemtype data[MAXSIZE];
int top;
}SeqStack;
SeqStack* s;
void Init_SeqStack(SeqStack* s) {
s->top = -1;
}
int Empty_SeqStack(SeqStack* s) {
if (s->top == -1)
return 1;
else
return 0;
}
void Push_SeqStack(SeqStack* s, Elemtype t) {
if (s->top == MAXSIZE - 1);
else{
s->top++;
s->data[s->top] = t;
}
}
void Pop_SeqStack(SeqStack* s, Elemtype* t) {
*t = s->data[s->top];
s->top--;
}
void pananl()
{
puts("选择以下操作\t");
printf("\t 1:转换后的二进制:\t\n");
printf("\t 2:转换后的四进制:\n");
printf("\t 3:转换后的八进制:\n");
printf("\t 4:转换后的十六进制:\n");
printf("\t 5:转换后的三十二进制:\n");
printf("\t 6:转换后的六十四进制:\n");
printf("\t 7:输出所有进制:\n");
}
void conversion(int N, int d) {
// int c;
SeqStack s;
Elemtype t;
Init_SeqStack(&s);
while (N) {
Push_SeqStack(&s, N % d);
N = N / d;
}
while (!Empty_SeqStack(&s)) {
Pop_SeqStack(&s, &t);
printf("%d",t);
}
}
int main() {
int n, d,i,j=2;
printf("请输入十进制N的值:");
scanf("%d", &n);
pananl(); //这是哪个屏幕
printf("请输入你的选择:");
scanf("%d", &d);
switch (d) {
case 1:printf("%d的%d的进制是:",n,2);
conversion(n, 2); break;
case 2:printf("%d的%d的进制是:", n, 4);
conversion(n, 4); break;
case 3: printf("%d的%d的进制是:", n, 8);
conversion(n, 8); break;
case 4:printf("%d的%d的进制是:", n, 16);
conversion(n, 16); break;
case 5:printf("%d的%d的进制是:", n, 32);
conversion(n, 32); break;
case 6:printf("%d的%d的进制是:", n, 66);
conversion(n, 64); break;
case 7: printf("%d的2 4 8 16 32 64进制是分别是:\n", n);
for(i=1;i<=6;i++){
conversion(n, j);
j = j * 2;
printf(" ");
if (i == 6) break;
}
}
return 0;
}
这是我的一个小的想法,其中第一段的代码引用了另外一个靓仔
以上便是我的分享的了,如果够更好地想法欢迎在下边评论留言。