关于网友提出的“ 关于数值进制转换表示的”问题疑问,本网通过在网上对“ 关于数值进制转换表示的”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: 关于数值进制转换表示的描述:
看到上的一个小程序,不明白,希望高手解决下,写写更详细的注解(有更高的解法最好)哈哈!
#include
void main()
{
char ch;
float result;
int radix,scale;
cout<<"输入进制的数值";
cin>>radix;
cout<<"输入数值("<<>
do //过滤去第一个数字前面的非数字字符
{
cin.get(ch);//获取字符
}
while (ch<='0'||ch>'9');
while(ch>='0'&&ch<='9')//整数转换
{
result=radix*result+ch-'0';
cin.get(ch);
}
if (ch=='.')//小数部分转换
{
scale=0;
cin.get(ch);
while(ch>='0'&&ch<='9')//优先转换为整数
{
result=radix*result+ch-'0';
cin.get(ch);
scale++;
}
while(scale>0)//再还原成小数
{
result=result/radix;
scale--;
}
}
cout<<"结果转换为十进制"<<><>
}
哎呀,还是看不明白
解决方案1:
参看:http://www.bast.net.cn/dntd/zxfd/82946.shtml
还可以看看这个,
实现的是任意进制的转换,
算法原理就是上面说的:
[ref]
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int SElemType;
typedef struct
{
SElemType *base;
SElemType *top;
int stacksize;
}SqStack;
SqStack S;
int iN,iM,e;
char c[]="0123456789ABCDEF";
Status InitStack(SqStack *S)
{
S->base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if(!S->base) exit(OVERFLOW);
S->top=S->base;
S->stacksize=STACK_INIT_SIZE;
return OK;
}
Status Push(SqStack *S,SElemType e)
{
if(S->top-S->base>=S->stacksize)
{
S->base=(SElemType*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!S->base) exit(OVERFLOW);
S->top=S->base+S->stacksize;
S->stacksize+=STACKINCREMENT;
}
*S->top++=e;
return OK;
}
Status StackEmpty(SqStack *S)
{
if(S->base==S->top) return OK;
return ERROR;
}
Status Pop(SqStack *S,SElemType *e)
{
if(S->top==S->base) return ERROR;
*e=*--S->top;
return OK;
}
main()
{
InitStack(&S);
printf("InPut the number: ");
scanf("%d",&iN);
printf("Input jin zhi shu:");
scanf("%d",&iM);
while(iN)
{
Push(&S,iN%iM);
iN=iN/iM;
}
while(!StackEmpty(&S))
{
Pop(&S,&e);
printf("%c",c[e]);
}
getchar();
}
明白了这个原理,
程序应该也是比较简单的了,
不需要说明了吧?
其中 x 表示 基数,
a b c d表示各个位,它们分别在 第四位, 第三位 ...
那么就是各个数据位 乘以 基数的 (所在位-1)次方, 累加求和就是 10进制的结果了
数值的转化算法原理楼主能明白么?
x 进制的数据 abcd,
转化为10进制就是: a*x^3+b*x^2+c*x^1+d*x^0