对于进制转换,其实是具有以下最初的思想
1-输入某一个十进制的数值
2-选择你所要进行的进制转换类型
3-将这个数的来进求余进制数并保留在数组中
4-将十进制的数字除以进制数
5-这是一个循环,直至该数小于零则结束
6-然后再让数组进行反向输出就能得到你所要转换的二进制
do{
a[count++]=x%p;
x=x/p;
}while(x!=0);
- #include
- 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
- 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
strlen :计算字符串的长度,作用类似于sizeof
strcpy:这个函数是可以用后续的将(s,"")的后覆盖前。
convto(s, n / b, b); //递归函数
len = strlen(s); //计算字符串的长度
s[len] = bit[n % b]; //求余
s[len + 1] = '\0'; //因为字符串的结尾要是空
- #include
- #include
- 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
- #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;
- }
这是我的一个小的想法,其中第一段的代码引用了另外一个靓仔
以上便是我的分享的了,如果够更好地想法欢迎在下边评论留言。