200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 任意十六进制数转换成十进制数----不管你输入多长都能转换

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

时间:2023-08-04 03:12:17

相关推荐

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

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

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

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

运行结果:

#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);}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。