c语言 数制转换(递归)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言 数制转换(递归)相关的知识,希望对你有一定的参考价值。
编写一个递归函数,将输入的N进制整,数转换为M进制整数形式。
第一行输入原数制,新数制;第二行输入原数制的数序列;输出新数值的数序列;输入原数为0时结束。例如:
第一行输入:2 3<回车>
第二行输入:11 100 1111 0<回车>
输出:10 11 120<回车>
怎么编,完全没有思路
#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语言 数制转换(递归)的主要内容,如果未能解决你的问题,请参考以下文章