zoukankan      html  css  js  c++  java
  • 【笔记】【C语言】任意进制之间的转换(支持小数部分)

      整理一下,免得自己忘记,也希望能帮到有需要的人。

    ————————————————————————我是一条华丽的分割线————————————————————————

      全局变量:双精度浮点数p、字符数组out。

      当其他进制转换成十进制时,将转换结果存储在浮点数p中;当十进制转换成其他进制时,将结果以字符串的形式存放在字符数组out中。

      转换过程分为整数部分和小数部分,整数部分转换后需逆序输出,而小数部分顺序输出。

    例如:

    Conversion(num,8,10);

      表示将num字符串数组所对应的一个八进制数转换成一个十进制数。

    直接上代码

      1 int Conversion(char num[20], int t, int n)
      2 {
      3     int i,ii,j,k,m,x,b[30],h[30],c;
      4     double d,r;
      5     ii=0; 
      6     p=0;
      7     memset(out,0,20);
      8     m=strlen(num);//求字符串的长度
      9     x=m; 
     10     for(k=0,j=0;k<m;k++)//主要是分段,以小数点为界限,只转换整数部分 
     11     { 
     12        if(num[k]=='.') 
     13        { 
     14           x=k; 
     15           break; 
     16        } 
     17     }
     18 
     19     for(j=x-1;j>=0;j--) 
     20     { 
     21        if(num[j]=='-') break; //符号的处理 
     22        if(num[j]=='A') r=10; 
     23        else if(num[j]=='B') 
     24           r=11; 
     25        else if(num[j]=='C') 
     26           r=12; 
     27        else if(num[j]=='D') 
     28           r=13; 
     29        else if(num[j]=='E') 
     30           r=14; 
     31        else if(num[j]=='F')
     32           r=15; 
     33        else 
     34           r=num[j]-'0';//将字符转换成数字 
     35        p=p+r*(pow ((double)t,(double)(x-j-1)));//计算结果 
     36     }
     37 
     38     if(num[x]=='.') 
     39     { 
     40        for(j=x+1;j<m;j++)
     41        {
     42           if(num[j]=='A') r=10; 
     43           else if(num[j]=='B') 
     44              r=11; 
     45           else if(num[j]=='C') 
     46              r=12; 
     47           else if(num[j]=='D') 
     48              r=13; 
     49           else if(num[j]=='E') 
     50              r=14; 
     51           else if(num[j]=='F') 
     52              r=15; 
     53           else 
     54              r=num[j]-'0';//将字符转换成数字 
     55           p=p+r*(pow ((double)t, (double)(x-j))); 
     56        } 
     57     }
     58     //g_print("%f",p);
     59     if(n==10)//如果要转换成十进制
     60     { 
     61        if(num[0]=='-') 
     62        {
     63           p=-p;
     64        }
     65        return 0;
     66     } 
     67      
     68     else //如果要转换成其他进制
     69     {
     70        k=(int)p;
     71        i=0; 
     72        while(k)//判定需要转换的数是否变为0 
     73        { 
     74           h[i++]=k%n;//取余,进行进制转换,但是顺序与正确值相反 
     75           k/=n;//转换一位之后进行相应的变化 
     76        } 
     77        c=0; 
     78        if(p!=(int)p)//选择性计算,如果是整数就不用进行这一步的计算了
     79        { 
     80           d=p-(int)p;//取小数部分 
     81           while(d!=0) 
     82           { 
     83              b[c]=(int)(d*n);//算法为×N取整 
     84              d=d*n-b[c]; 
     85              c++; 
     86              if(c>=10) 
     87                 break;//主要是控制小数后面万一出现无限小数的时候好跳出循环以免出现死循环 
     88           } 
     89        }
     90        if(num[0]=='-')
     91        {   
     92            out[0]='-';
     93            ii++;
     94        }
     95        for(j=i-1;j>=0;j--,ii++)//反序输出,大于10的数字进行相应的变化 
     96        { 
     97           if(h[j]==10) out[ii]='A';
     98           else if(h[j]==11) out[ii]='B';
     99           else if(h[j]==12) out[ii]='C';
    100           else if(h[j]==13) out[ii]='D';
    101           else if(h[j]==14) out[ii]='E';
    102           else if(h[j]==15) out[ii]='F';
    103           else if(h[j]==9)  out[ii]='9';
    104           else if(h[j]==8)  out[ii]='8';
    105           else if(h[j]==7)  out[ii]='7';
    106           else if(h[j]==6)  out[ii]='6';
    107           else if(h[j]==5)  out[ii]='5';
    108           else if(h[j]==4)  out[ii]='4';
    109           else if(h[j]==3)  out[ii]='3';
    110           else if(h[j]==2)  out[ii]='2';
    111           else if(h[j]==1)  out[ii]='1';
    112           else out[ii]='0';
    113        } 
    114        if(p!=(int)p)//选择性输出,这样可以节约输出时间和程序的运行时间 
    115        {
    116           out[ii++]='.';
    117           for(j=0;j<c;j++)//正序输出 
    118           { 
    119              if(b[j]==10) out[ii]='A';
    120              else if(b[j]==11) out[ii]='B';
    121              else if(b[j]==12) out[ii]='C';
    122              else if(b[j]==13) out[ii]='D';
    123              else if(b[j]==14) out[ii]='E';
    124              else if(b[j]==15) out[ii]='F';
    125              else if(b[j]==9) out[ii]='9';
    126              else if(b[j]==8) out[ii]='8';
    127              else if(b[j]==7) out[ii]='7';
    128              else if(b[j]==6) out[ii]='6';
    129              else if(b[j]==5) out[ii]='5';
    130              else if(b[j]==4) out[ii]='4';
    131              else if(b[j]==3) out[ii]='3';
    132              else if(b[j]==2) out[ii]='2';
    133              else if(b[j]==1) out[ii]='1';
    134              else out[ii]='0';
    135              ii++;
    136           }
    137        }
    138        //puts(out);
    139        return 0;
    140     } 
    141 }

    参考:Linux C编程从初学到精通 。

  • 相关阅读:
    Python第二十天 shutil 模块 zipfile tarfile 模块
    SQL Server中SET QUOTED_IDENTIFIER的使用
    SQL Server AG集群启动不起来的临时自救大招
    检查使用共享表空间的表
    数据库历史简图
    线上centos6出现软死锁 kernel:BUG: soft lockup
    ORA-01810:格式代码出现两次 解决方法
    C# DES (ECB模式) 加密解密 --单倍长
    Android-ContentProvider使用
    第十三周(动物这样叫)
  • 原文地址:https://www.cnblogs.com/kongtiao/p/2459523.html
Copyright © 2011-2022 走看看