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

来源:互联网 发布:淘宝店铺怎么加入村淘 编辑:程序博客网 时间:2024/05/16 08:45


原来它妹这种方法叫大数运算,现在才知道,害我花上好几个小时自己去想……操呀……


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


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

运行结果:


#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[N];            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 200int 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[N];int i,j,k,l,a[2*N],b[2*N],c[N];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;elseif(str[i]-65<6&&str[i]-65>=0)c[j-i-1]=str[i]-65+10;elseif(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);}


原创粉丝点击