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

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

运行结果:


  1. #include<stdio.h>    
  2. #include<string.h>    
  3. #define N 200    
  4.     
  5. int multiply(int *b,int m,int n,int k)    
  6. {    
  7.     int i,j,temp,flag,*p;    
  8.             
  9.     for(i=flag=0;i<n;i++)    
  10.     {    
  11.         p=b;    
  12.         flag=temp=0;            
  13.         for(j=0;j<=k;j++)      
  14.         {                
  15.             p=b+j;    
  16.             if(flag!=1)      
  17.                 *p*=m;      
  18.             else      
  19.             {      
  20.                 *p=*p*m+temp;      
  21.                 flag=0;                       
  22.             }    
  23.             if(*p>=10)      
  24.             {      
  25.                 temp=*p/10;      
  26.                 *p=*p%10;      
  27.                 flag=1;       
  28.                 if(j==k)      
  29.                     k++;      
  30.             }      
  31.         }           
  32.     }    
  33.     return k;    
  34. }    
  35.     
  36. int plus(int *a,int *b,int k)    
  37. {    
  38.     int i,flag,temp,*p,*q;    
  39.     
  40.     temp=flag=0;    
  41.     for(i=0;i<k;i++)    
  42.     {    
  43.         p=a+i;    
  44.         q=b+i;    
  45.         if(flag!=1)      
  46.             *p+=*q;      
  47.         else      
  48.         {      
  49.             *p=*p+*q+temp;      
  50.             flag=0;                       
  51.         }    
  52.         if(*p>=10)      
  53.         {      
  54.             temp=*p/10;      
  55.             *p=*p%10;      
  56.             flag=1;       
  57.             if(i==k)      
  58.                 k++;      
  59.         }      
  60.     }    
  61.     return k;    
  62. }    
  63.     
  64. void main()    
  65. {      
  66.     int i,j,k,l,r,a[2*N],b[2*N],c[N];    
  67.         
  68.     j=j=k=l=r=0;               
  69.     for(i=0;i<2*N;i++)    
  70.         a[i]=b[i]=0;    
  71.     b[0]=1;  
  72.       
  73.     printf("\n输入任意十六进制字数(非十六进制字符表结束):\n");  
  74.     while(1)  
  75.     {         
  76.         scanf("%1x",&c[j++]);   
  77.         if(c[j-1]>15||c[j-1]<0)  
  78.             break;            
  79.     }       
  80.     for(i=0;i<j-1;i++)    
  81.     {    
  82.         k=0;    
  83.         k=multiply(b,16,j-i-2,k);    
  84.         k=multiply(b,c[i],1,k);    
  85.         if(i==0)l=k;    
  86.         k=plus(a,b,k+3);            
  87.         for(r=0;r<=k;r++)    
  88.             b[r]=0;    
  89.         b[0]=1;    
  90.     }   
  91.     printf("\n结果为:\n");    
  92.     for(i=l;i>=0;i--)    
  93.         printf("%d",a[i]);    
  94.     printf("\n");    
  95. }    


原算法:

运行结果:



  1. #include<stdio.h>  
  2. #include<string.h>  
  3. #define N 200  
  4.   
  5. int multiply(int *b,int m,int n,int k)  
  6. {  
  7.     int i,j,temp,flag,*p;  
  8.           
  9.     for(i=flag=0;i<n;i++)  
  10.     {  
  11.         p=b;  
  12.         flag=temp=0;          
  13.         for(j=0;j<=k;j++)    
  14.         {              
  15.             p=b+j;  
  16.             if(flag!=1)    
  17.                 *p*=m;    
  18.             else    
  19.             {    
  20.                 *p=*p*m+temp;    
  21.                 flag=0;                     
  22.             }  
  23.             if(*p>=10)    
  24.             {    
  25.                 temp=*p/10;    
  26.                 *p=*p%10;    
  27.                 flag=1;     
  28.                 if(j==k)    
  29.                     k++;    
  30.             }    
  31.         }         
  32.     }  
  33.     return k;  
  34. }  
  35.   
  36. int plus(int *a,int *b,int k)  
  37. {  
  38.     int i,flag,temp,*p,*q;  
  39.   
  40.     temp=flag=0;  
  41.     for(i=0;i<k;i++)  
  42.     {  
  43.         p=a+i;  
  44.         q=b+i;  
  45.         if(flag!=1)    
  46.             *p+=*q;    
  47.         else    
  48.         {    
  49.             *p=*p+*q+temp;    
  50.             flag=0;                     
  51.         }  
  52.         if(*p>=10)    
  53.         {    
  54.             temp=*p/10;    
  55.             *p=*p%10;    
  56.             flag=1;     
  57.             if(i==k)    
  58.                 k++;    
  59.         }    
  60.     }  
  61.     return k;  
  62. }  
  63.   
  64. void main()  
  65. {  
  66.     char str[N];  
  67.     int i,j,k,l,a[2*N],b[2*N],c[N];  
  68.       
  69.     printf("\n请输入任意一个十六进制数:\n");  
  70.     scanf("%s",str);      
  71.     j=strlen(str);    
  72.   
  73.     for(i=0;i<2*N;i++)  
  74.         a[i]=b[i]=0;  
  75.     for(i=0;i<N;i++)  
  76.         c[i]=0;  
  77.     b[0]=1;   
  78.       
  79.     for(i=0;i<j;i++)  
  80.     {  
  81.         if(str[i]-48<10&&str[i]-48>=0)  
  82.             c[j-i-1]=str[i]-48;  
  83.         else  
  84.         if(str[i]-65<6&&str[i]-65>=0)  
  85.             c[j-i-1]=str[i]-65+10;  
  86.         else  
  87.         if(str[i]-97<6&&str[i]>=0)  
  88.             c[j-i-1]=str[i]-97+10;  
  89.         else  
  90.         {  
  91.             printf("\n输入错误!");  
  92.             exit(1);  
  93.         }  
  94.     }  
  95.   
  96.     for(i=j-1;i>=0;i--)  
  97.     {  
  98.         k=0;  
  99.         k=multiply(b,16,i,k);  
  100.         k=multiply(b,c[i],1,k);  
  101.         if(i==j-1)l=k;  
  102.         k=plus(a,b,k+5);          
  103.         for(j=0;j<=k;j++)  
  104.             b[j]=0;  
  105.         b[0]=1;  
  106.     }  
  107.     printf("\n结果:\n");  
  108.     for(i=l;i>=0;i--)  
  109.         printf("%d",a[i]);  
  110.     printf("\n");  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值