您的位置:首页 > 其它

任意十六进制数转换成十进制数----不管你输入多长都能转换

2011-09-11 00:52 295 查看
原来它妹这种方法叫大数运算,现在才知道,害我花上好几个小时自己去想……操呀……

算法由我博客中求阶乘算法变形而得……

下面是改过后的算法……原算法在后面……

运行结果:



#include<stdio.h>
#include<string.h>
#define N 200

int multiply(int *b,int m,int n,int k)
{
int i,j,temp,flag,*p;

for(i=flag=0;i<n;i++)
{
p=b;
flag=temp=0;
for(j=0;j<=k;j++)
{
p=b+j;
if(flag!=1)
*p*=m;
else
{
*p=*p*m+temp;
flag=0;
}
if(*p>=10)
{
temp=*p/10;
*p=*p%10;
flag=1;
if(j==k)
k++;
}
}
}
return k;
}

int plus(int *a,int *b,int k)
{
int i,flag,temp,*p,*q;

temp=flag=0;
for(i=0;i<k;i++)
{
p=a+i;
q=b+i;
if(flag!=1)
*p+=*q;
else
{
*p=*p+*q+temp;
flag=0;
}
if(*p>=10)
{
temp=*p/10;
*p=*p%10;
flag=1;
if(i==k)
k++;
}
}
return k;
}

void main()
{
int i,j,k,l,r,a[2*N],b[2*N],c
;

j=j=k=l=r=0;
for(i=0;i<2*N;i++)
a[i]=b[i]=0;
b[0]=1;

printf("\n输入任意十六进制字数(非十六进制字符表结束):\n");
while(1)
{
scanf("%1x",&c[j++]);
if(c[j-1]>15||c[j-1]<0)
break;
}
for(i=0;i<j-1;i++)
{
k=0;
k=multiply(b,16,j-i-2,k);
k=multiply(b,c[i],1,k);
if(i==0)l=k;
k=plus(a,b,k+3);
for(r=0;r<=k;r++)
b[r]=0;
b[0]=1;
}
printf("\n结果为:\n");
for(i=l;i>=0;i--)
printf("%d",a[i]);
printf("\n");
}


原算法:

运行结果:



#include<stdio.h>
#include<string.h>
#define N 200

int multiply(int *b,int m,int n,int k)
{
int i,j,temp,flag,*p;

for(i=flag=0;i<n;i++)
{
p=b;
flag=temp=0;
for(j=0;j<=k;j++)
{
p=b+j;
if(flag!=1)
*p*=m;
else
{
*p=*p*m+temp;
flag=0;
}
if(*p>=10)
{
temp=*p/10;
*p=*p%10;
flag=1;
if(j==k)
k++;
}
}
}
return k;
}

int plus(int *a,int *b,int k)
{
int i,flag,temp,*p,*q;

temp=flag=0;
for(i=0;i<k;i++)
{
p=a+i;
q=b+i;
if(flag!=1)
*p+=*q;
else
{
*p=*p+*q+temp;
flag=0;
}
if(*p>=10)
{
temp=*p/10;
*p=*p%10;
flag=1;
if(i==k)
k++;
}
}
return k;
}

void main()
{
char str
;
int i,j,k,l,a[2*N],b[2*N],c
;

printf("\n请输入任意一个十六进制数:\n");
scanf("%s",str);
j=strlen(str);

for(i=0;i<2*N;i++)
a[i]=b[i]=0;
for(i=0;i<N;i++)
c[i]=0;
b[0]=1;

for(i=0;i<j;i++)
{
if(str[i]-48<10&&str[i]-48>=0)
c[j-i-1]=str[i]-48;
else
if(str[i]-65<6&&str[i]-65>=0)
c[j-i-1]=str[i]-65+10;
else
if(str[i]-97<6&&str[i]>=0)
c[j-i-1]=str[i]-97+10;
else
{
printf("\n输入错误!");
exit(1);
}
}

for(i=j-1;i>=0;i--)
{
k=0;
k=multiply(b,16,i,k);
k=multiply(b,c[i],1,k);
if(i==j-1)l=k;
k=plus(a,b,k+5);
for(j=0;j<=k;j++)
b[j]=0;
b[0]=1;
}
printf("\n结果:\n");
for(i=l;i>=0;i--)
printf("%d",a[i]);
printf("\n");
}


可以将十六进制数转换成任意进制,或稍改一下,可将10进制转为任意进制……只是输入太长的话可能益出……

运行结果:



#include "stdio.h"
#include<stdlib.h>
#define StackSize 100 /*假定预分配的栈空间最多为100个元素*/
typedef int DataType;/*假定栈元素的数据类型为字符*/
typedef struct{
DataType data[StackSize];
int top;
}SeqStack;
/* 置栈空*/
void Initial(SeqStack *S)
{/*将顺序栈置空*/
S->top=-1;
}
/*判栈空*/
int IsEmpty(SeqStack *S)
{
return S->top==-1;
}
/*判栈满*/
int IsFull(SeqStack *S)
{
return S->top==StackSize-1;
}
/*进栈*/
void Push(SeqStack *S,DataType x)
{
if (IsFull(S))
{
printf("栈上溢"); /*上溢,退出运行*/
exit(1);
}
S->data[++S->top]=x;/*栈顶指针加1后将x入栈*/
}
/*出栈*/
DataType Pop(SeqStack *S)
{
if(IsEmpty(S))
{
printf("栈为空"); /*下溢,退出运行*/
exit(1);
}
return S->data[S->top--];/*栈顶元素返回后将栈顶指针减1*/
}
/* 取栈顶元素*/

void MultiBaseOutput (int n,int b)
{/*假设n是非负的十进制整数,输出等值的b进制数*/
int i;
SeqStack S;
Initial(&S);
while(n){  /*从右向左产生b进制的各位数字,并将其进栈*/
Push(&S,n%b); /*将bi进栈0<=i<=j*/
n=n/b;
}
printf("\n结果为:");
while(!IsEmpty(&S)){  /*栈非空时退栈输出*/
i=Pop(&S);
printf("%d",i);
}
printf("\n");
}
void main()
{
int n,m;
printf("\n请输入一个十六进制数:");
scanf("%x",&n);
printf("\n请输入想转换的进制数:");
scanf("%d",&m);
MultiBaseOutput(n,m);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: