c语言 数制转换(递归)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言 数制转换(递归)相关的知识,希望对你有一定的参考价值。

编写一个递归函数,将输入的N进制整,数转换为M进制整数形式。
第一行输入原数制,新数制;第二行输入原数制的数序列;输出新数值的数序列;输入原数为0时结束。例如:
第一行输入:2 3<回车>
第二行输入:11 100 1111 0<回车>
输出:10 11 120<回车>
怎么编,完全没有思路

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int converN(int p,int m, int n);
int conver10(char *pold, int m);
int power(int m, int pow);

int main( )

int old,fresh,oldv=0;
char cold[100];

printf("输入的数制不能超过16,按q退出,按回车继续。");
while(getchar() != 'q')

printf("请输入原数制:");
scanf("%d",&old);

printf("请输入新数制:");
scanf("%d",&fresh);

printf("请输入要转换数字:");
scanf("%s",&cold);

printf("转换后数字为:");
converN(conver10(cold, old),old,fresh);
putchar('\n');
printf("输入的数制不能超过16,按q退出,按回车继续。");
while(getchar() != '\n')
continue;


return 1;


int power(int m, int pow)

if(pow == 0)
return 1;
if(pow > 0)
return m*power(m,pow-1);

int conver10(char *pold, int m)

int len = strlen(pold);
int res=0;

for(int i=0; i<len; i++)

switch(tolower(pold[i]))

case 'a':
res += (pold[i]-'a'+10) * power(m,len-i-1);
break;
case 'b':
res += (pold[i]-'a'+10) * power(m,len-i-1);
break;
case 'c':
res += (pold[i]-'a'+10) * power(m,len-i-1);
break;
case 'd':
res += (pold[i]-'a'+10) * power(m,len-i-1);
break;
case 'e':
res += (pold[i]-'a'+10) * power(m,len-i-1);
break;
case 'f':
res += (pold[i]-'a'+10) * power(m,len-i-1);
break;
default:
res += (pold[i]-'0') * power(m,len-i-1);


return res;


int converN(int p,int m, int n)

int i=0;
if(p/n != 0)
converN(p/n,m,n);

if((i=p%n) < 10)
putchar('0' + i);
else
putchar('a' + i - 10);
return 1;
参考技术A 我做过一个二进制,八进制,十进制,十六进制间的任意转换,该成任意进制的也很方便,要的话我可以发给你。 参考技术B #include
"stdafx.h"
#include
<stdlib.h>
#include
<stdio.h>
#include
<string.h>
int
converN(int
p,int
m,
int
n);
int
conver10(char
*pold,
int
m);
int
power(int
m,
int
pow);
int
main(
)

int
old,fresh,oldv=0;
char
cold[100];
printf("输入的数制不能超过16,按q退出,按回车继续。");
while(getchar()
!=
'q')

printf("请输入原数制:");
scanf("%d",&old);
printf("请输入新数制:");
scanf("%d",&fresh);
printf("请输入要转换数字:");
scanf("%s",&cold);
printf("转换后数字为:");
converN(conver10(cold,
old),old,fresh);
putchar('\n');
printf("输入的数制不能超过16,按q退出,按回车继续。");
while(getchar()
!=
'\n')
continue;

return
1;

int
power(int
m,
int
pow)

if(pow
==
0)
return
1;
if(pow
>
0)
return
m*power(m,pow-1);

int
conver10(char
*pold,
int
m)

int
len
=
strlen(pold);
int
res=0;
for(int
i=0;
i<len;
i++)

switch(tolower(pold[i]))

case
'a':
res
+=
(pold[i]-'a'+10)
*
power(m,len-i-1);
break;
case
'b':
res
+=
(pold[i]-'a'+10)
*
power(m,len-i-1);
break;
case
'c':
res
+=
(pold[i]-'a'+10)
*
power(m,len-i-1);
break;
case
'd':
res
+=
(pold[i]-'a'+10)
*
power(m,len-i-1);
break;
case
'e':
res
+=
(pold[i]-'a'+10)
*
power(m,len-i-1);
break;
case
'f':
res
+=
(pold[i]-'a'+10)
*
power(m,len-i-1);
break;
default:
res
+=
(pold[i]-'0')
*
power(m,len-i-1);


return
res;

int
converN(int
p,int
m,
int
n)

int
i=0;
if(p/n
!=
0)
converN(p/n,m,n);
if((i=p%n)
<
10)
putchar('0'
+
i);
else
putchar('a'
+
i
-
10);
return
1;
参考技术C #include
"stdafx.h"
#include
<stdlib.h>
#include
<stdio.h>
#include
<string.h>
int
converN(int
p,int
m,
int
n);
int
conver10(char
*pold,
int
m);
int
power(int
m,
int
pow);
int
main(
)

int
old,fresh,oldv=0;
char
cold[100];
printf("输入的数制不能超过16,按q退出,按回车继续。");
while(getchar()
!=
'q')

printf("请输入原数制:");
scanf("%d",&old);
printf("请输入新数制:");
scanf("%d",&fresh);
printf("请输入要转换数字:");
scanf("%s",&cold);
printf("转换后数字为:");
converN(conver10(cold,
old),old,fresh);
putchar('\n');
printf("输入的数制不能超过16,按q退出,按回车继续。");
while(getchar()
!=
'\n')
continue;

return
1;

int
power(int
m,
int
pow)

if(pow
==
0)
return
1;
if(pow
>
0)
return
m*power(m,pow-1);

int
conver10(char
*pold,
int
m)

int
len
=
strlen(pold);
int
res=0;
for(int
i=0;
i<len;
i++)

switch(tolower(pold[i]))

case
'a':
res
+=
(pold[i]-'a'+10)
*
power(m,len-i-1);
break;
case
'b':
res
+=
(pold[i]-'a'+10)
*
power(m,len-i-1);
break;
case
'c':
res
+=
(pold[i]-'a'+10)
*
power(m,len-i-1);
break;
case
'd':
res
+=
(pold[i]-'a'+10)
*
power(m,len-i-1);
break;
case
'e':
res
+=
(pold[i]-'a'+10)
*
power(m,len-i-1);
break;
case
'f':
res
+=
(pold[i]-'a'+10)
*
power(m,len-i-1);
break;
default:
res
+=
(pold[i]-'0')
*
power(m,len-i-1);


return
res;

int
converN(int
p,int
m,
int
n)

int
i=0;
if(p/n
!=
0)
converN(p/n,m,n);
if((i=p%n)
<
10)
putchar('0'
+
i);
else
putchar('a'
+
i
-
10);
return
1;
参考技术D 北理的09么 这题最后一个保密是什么啊

编制不同数制间的转换程序...(用c语言编写程序)?

参考技术A 关于c语言的相关知识的话,我觉得你可以去咨询一下名字,语言老师。 参考技术B

我不太清楚这里所说的界面是什么意思,是Windows窗体吗,还是说命令行输出就行?而且里面提到的任意十进制数字有点不太明确,是不是整数,有没有超过 long 的表示范围。有没有负数,如果有的话,用多少位的补码表示?

如果假设既是整数,又没有超过long,并且没有负数的情况下,我可以给出下面的程序(windows窗口程序我做不了,我是用的Mac系统,只能给出命令行程序)


#include<stdio.h>

char bases[] = "0123456789ABCDEF";

char * change_base(char * buff, int buff_len, long abs_num, int to_base)

        int t = 0;

        /* 缓冲区指针 */

        char * bp = buff + buff_len;

        /* 因为适合倒序使用缓冲区,因此将末尾置为 '\\0' */

        *(--bp) = '\\0';


        while (abs_num > 0)

                t = abs_num % to_base;

                *(--bp) = bases[t];

                abs_num = (abs_num - t) / to_base;

       

        return bp;


void main()


    char buff[100] = "";

    long num = 0;

    int res, i, j, base = 0;


    printf("%s", "请输入十进制数字:");

    res = scanf("%ld", &num);


    if (res > 0)


        printf("%s", "请输入要转成多少进制(2~16):");

        res = scanf("%d", &base);


        if (base < 2 || base > 16)

            puts("输入进制数有误!"); return;

       


                printf("%ld转换为%d进制的结果是:", num, base);


                if (num < 0)

                        num = -num;

                        printf("-");

               

                /* 前面是全部输入输出和负数处理,

                 * 根据不同运行环境可以进行不同操作,

                 * 下面是转换算法,

                 * 入参为(结果缓冲区,缓冲区大小,待转换数字,转换后的进制),

                 * 返回结果为缓冲区上的结果字符串指针

                 */

                printf("%s\\n", change_base(buff, sizeof(buff), num, base));

    else

        puts("输入错误");

   

以上是关于c语言 数制转换(递归)的主要内容,如果未能解决你的问题,请参考以下文章

编制不同数制间的转换程序...(用c语言编写程序)?

数据结构(C语言) 栈的应用之数制转换

C 语言 数制

java的数制转换(详解,全!)

java的数制转换(详解,全!)

汇编语言第一节课:数制转换,真值和补码