任意十六进制数转换成十进制数----不管你输入多长都能转换
来源:互联网 发布:淘宝店铺怎么加入村淘 编辑:程序博客网 时间: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);}
- 任意十六进制数转换成十进制数----不管你输入多长都能转换
- 任意十六进制数转换成十进制数----不管你输入多长都能转换
- 任意十六进制数转换成十进制数----不管你输入多长都能转换
- 输入十进制数转换成十六进制
- 十进制数转换成十六进制
- 将十六进制数转换成十进制数
- 十进制数转换成十六进制数
- 十进制数转换成十六进制数
- 将十六进制数转换成十进制数
- 十进制???转换为十六进制数
- 十进制数转换成任意进制数
- 十六进制数转换为十进制数
- 十进制数转换为十六进制数
- 十进制数转换为十六进制数
- 八、十六进制数转换到十进制数
- 将十进制数转换为十六进制数
- 十进制数转换为十六进制数
- 十六进制数转换为十进制数
- HDOJ What Are You Talking About
- Windbg断点命令
- servlet知识
- TBalloonHint气泡提示的用法(How to use TBalloonHint)
- android recovery 和reboot
- 任意十六进制数转换成十进制数----不管你输入多长都能转换
- VC++ 调用 C#生成DLL的两种方法(转)
- C# 读取Excel文件代码
- MFC点点滴滴——列表框使用list control(总结2)(编辑List Control里面的任何子项 转)
- Redhat的历史以及对应的内核版本
- Linux使用Wine 安装source insight
- MFC点点滴滴——列表框使用list control(总结3)(控件技巧总汇 转)
- redhat企业版以及Red Hat Linux,Fedora的关系
- 欧拉回路的使用