任意十六进制数转换成十进制数----不管你输入多长都能转换
2011-09-11 00:52
295 查看
原来它妹这种方法叫大数运算,现在才知道,害我花上好几个小时自己去想……操呀……
算法由我博客中求阶乘算法变形而得……
下面是改过后的算法……原算法在后面……
运行结果:
原算法:
运行结果:
可以将十六进制数转换成任意进制,或稍改一下,可将10进制转为任意进制……只是输入太长的话可能益出……
运行结果:
算法由我博客中求阶乘算法变形而得……
下面是改过后的算法……原算法在后面……
运行结果:
#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); }
相关文章推荐
- 任意十六进制数转换成十进制数----不管你输入多长都能转换
- 任意十六进制数转换成十进制数----不管你输入多长都能转换
- 写出一个函数,要求将输入的十六进制数转换成十进制数。要求函数调用时,使用指针作函数形参。
- 输入一个8位二进制数,转换成十进制数输出
- 8.编写一个程序,它先将键盘上输入的一个字符串转换成十进制整数
- 将任意二进制转换成十进制
- 【任意进制转换】 例:输入十进制转换二进制
- C语言从键盘输入一个十进制数将其转换为任意进制数输出
- 将十六进制数转换成十进制数
- 将十六进制数转换成十进制数
- 输入一串数字转换为2,4,6,8,10,16任意进制数字
- 输入二进制数字串,转换成十进制正整数
- 8、编写一个程序,它先将键盘上输入的一个字符串转换成十进制整数, 然后打印出这个十进制整数对应的二进制形式。
- 十进制转换成其他进制和其他进制数转换成十进制数
- C语言将任意数转换成任意进制
- 【笔记】【C语言】任意进制之间的转换(支持小数部分)
- 九度OJ 1080 (大整数的任意进制的转换)
- C语言之任意进制的转换
- 二进制至三十六进制之间的任意转换-C语言
- 转帖:c#任意进制转换(2-36进制之间的转换)