C语言-----任意进制转换程序(可以带小数)

任意进制转换

代码如下:

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdbool.h>
#define M 16
char a[M] , x[100] , y [100] , nua[100] , nub[100];
int  n1 , n2 , f=0;
double       s=0 ;
void build (void)
{
    int i;char q;
    for(i=0 , q='0';i<10;i++ , q++)
           a[i]=q;
    for(i=10 , q='A';i<M;i++ , q++)
           a[i]=q;
}
bool check ()
{
    int i , j , k=0 , n=0;

    for(i = 0 ; i<strlen(x) ; i++)
    {
          if(x[i]=='.')  k++;
             for( j=0 ;j<n1; j++){
          if(x[i]==a[j]) k++;
        }
    }
    if(k!=strlen(x))return false;

    return true;
}

void   change10   (void)
{
    int i , j , k=0  , m , n=0 ;

    while(x[k]!='.'&&x[k]!='\0')
    {
        k++;
    }
    //printf("%c\n",x[k]);

    if(x[k]=='\0')
    {
        for(i=k-1,j=0;i>=0;i--,j++)
        {
            for(int w=0; w<n1 ;w++)
               if(x[i]==a[w])  m=w;
               f  =f + m*pow(n1,j);
        }
    }
    if(x[k]=='.')
    {
        for(i=k-1,j=0;i>=0;i--,j++)
        {
            for(int w=0; w<n1 ;w++)
               if(x[i]==a[w])  m=w;
               f = f + m*pow(n1,j);
        }
        for(i=k+1 , j=-1;i<strlen(x);i++,j--)
        {
            for(int w=0; w<n1 ;w++)
                if(x[i]==a[w])  m=w;
                s = s + (double)(m*pow(n1,j));
        }
    }
}
void change (void)
{
    int  i=0  , j=0 , k;
    while (f != 0)
    {
       for(int w=0;w<n2;w++)
       {
           if(w==f%n2)
           nua[i]=a[w];
       }
       f  =  f  /   n2;
       i++;
    }
    while (s != 0)
    {
        k=(int)(s*n2);
        for(int w=0;w<n2;w++)
        {
            if(w==k)
            nub[j]  =   a[w];
        }
        s  = s*n2-k;
        j++;
    }
}
void  putout  (void)
{
    int i;
    for(i=strlen(nua)-1;i>=0;i--)
        printf ("%c"  ,  nua[i]);
    if(nub[0]!='\0')
    {
        printf(".");
        puts  (nub);
    }
}
int  main  () {
    int  i , j  , k ;
    double n;
    char q ;
    printf("请输入需要转换的进制和目标进制(用一个西文空格隔开)\n");
    scanf("%d%d" , &n1  ,&n2);
    if (  n1  > M || n2  > M)
        printf("ERROR");
    else
{
    build();
    printf("请输入需要转换的数字:");
    getchar();

    gets( x );

    if(check()==false)
        printf("ERROR");
    else
    {
        change10();
        //n=(double)f;
        //printf("%.3lf\n",f+s);
        change();
        putout();

    return 0;
    }//小else
}//大else
}

EG:(字母要大写)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.KEG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值