buckwheat honey:求基本数据的转换公式

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/02 00:02:48
请教一下十进制转换成二进制八进制十六进制的方法,反过来转换的方法.如何做到又快又准确.谢谢.
我是想问公式,这不是做程序的问题。比如看到1290这个数,如何马上算出来它的二进制八进制十六进制等于多少,反过来也一样。就象笔试一样,给一个数,让你写上换算成其他进制的结果。
不过还是谢谢i777哈,辛苦了。

#include<stdio.h>
#include<math.h>
#include<stdlib.H>
#include<string.h>
#include<ctype.h>
#define MAXLEN 100
unsigned int DataLen(char *s,unsigned int m);
void Str2Num(char* str,unsigned int *p,unsigned int m);
unsigned long M2Ten(unsigned int *p,unsigned int mlen,unsigned int m);
void Ten2N(unsigned long l10,unsigned int *p,int n,unsigned int nlen);
//进制如果少于36,则用0~9A~Z来表示一个数字:比如20进制数"2DG1"
//如果大于36,则用数字得组合表示一位,用空格分可每一位:比如:"37 12 38"来表示40进制得3位
void main()
{
unsigned int m,n,mlen,nlen;
char snumber[MAXLEN];
unsigned int* p;
unsigned long l10;/*l10为m进制转为n进制时作为中转的十进制数*/
int i;
printf("万能进制转换程序。请输入欲转换的数:\n");
gets(snumber);/*将输入的m进制数作为一个字符串接收*/
printf("m进制转为n进制,请输入m和n:\n");
printf("m=");scanf("%u",&m);
printf("n=");scanf("%u",&n);
if(m<2||n<2){printf("非法输入!");exit(0);}
mlen=DataLen(snumber,m);
p=(unsigned int *)malloc(sizeof(int)*mlen);
Str2Num(snumber,p,m);
l10=M2Ten(p,mlen,m);
free(p);
nlen=log(l10)/log(n);/*求出将十进制数l10转为n进制数时该n进制数的位数*/
p=(unsigned int *)malloc(sizeof(int)*nlen);
Ten2N(l10,p,n,nlen);
printf("转为:");
for(i=0;i<=nlen;i++)
{
if(n>36)printf("%u ",p[i]);
else
{
if(p[i]>=10)printf("%c",p[i]+'A'-10);
else printf("%d",p[i]);
}
}
printf("\n");
// free(p);
}
unsigned int DataLen(char *s,unsigned int m)
/*将输入的m进制数字符串全部转为大写并返回有效的m进制数的位数*/
{

unsigned int i=0,num=0;
strupr(s);
while(s[i]!=0)
if(s[i++]==' ')num++;
if(m>36)return num+1;
else return strlen(s)-num;
}

void Str2Num(char* str,unsigned int *p,unsigned int m)
/*将输入的m进制数字符串一位一位转为数字并放入数组p中*/
{
int i=0,j=0;
char *q;
if(m>36)
{
q=strtok(str," ");p[i++]=atoi(q);
while(q){q=strtok(NULL," ");if(q)p[i++]=atoi(q);}
}
else
{
while(str[i]!='\0')
{
if(isalpha(str[i]))p[j++]=str[i]-'A'+10;
else if(isdigit(str[i]))p[j++]=str[i]-'0';
i++;
}
}
}
unsigned long M2Ten(unsigned int *p,unsigned int mlen,unsigned int m)
/*将数组p中按位存放的m进制数转为十进制数并返回*/
{
unsigned long l=0,h;
int i,j;
for(i=mlen-1;i>=0;i--)
{
h=1;
for(j=1;j<=i;j++)
h*=m;
l+=p[mlen-1-i]*h;
}
return l;
}
void Ten2N(unsigned long l10,unsigned int *p,int n,unsigned int nlen)
/*十进制转为n进制*/
{
unsigned long a=l10;
while(a)
{
p[nlen--]=a%n;
a/=n;
}
}