十进制转二进制的一种实现

/*Binary Digit Translation*/
/*这个程序用于十进制数字到二进制数字的转换,使用的是字符串和数字的互相转化,
具体使用规格说明如下:
Type of Number: unsigned long 32bits
Type of Strings: char *s[13]
Cycle variable:unsigned int i,t*/
 


 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
char bin[33]="00000000000000000000000000000000";
int isnumerical(char *s)/*用于判断是否为数字的函数,0-非数字,1-数字*/
{
    unsigned int i,flag=1;/*flag为数字类型标识*/
    if ((s[0]!='-')&&(s[0]<'0'||s[0]>'9')) flag=0;/*非数字*/
    else
    {
        if (s[0]=='-') flag=1;/*负数*/
        for (i=1;i<strlen(s);i++)/*从第二个字符开始验证是否为数字*/
        if (s[i]<'0'||s[i]>'9')
        {
            flag=0;
            break;
        }
    }
    return flag;
}

void lowcase(char *s)/*将非数字的字符串统一转换成小写*/
{
     unsigned int i;
     for (i=0;i<strlen(s);i++)
     if (s[i]>='A'&&s[i]<='Z') s[i]+=32;
}

unsigned long e(unsigned int times)/*这个函数用来返回10^times*/
{
         unsigned int i;
         unsigned long num=1;
         if (times==0) return 1;
         else 
         for (i=0;i<times;i++)
         num*=10;
         return num;
}

long val(char *s)/*这个函数实现字符串到数字的转换,返回数字部分,负数返回数字部分*/
{
         unsigned int i,len=strlen(s);
         long num=0;
         if (s[0]!='-')/*正数*/
         for (i=0;i<len;i++) num+=(s[i]-'0')*e(len-i-1);
         else /*负数*/
         {
              for(i=1;i<len;i++) num+=(s[i]-'0')*e(len-i-1);
              num=-num;
         }
         return num;
}

char *D_B(long val) /*十进制转换成二进制,val-value*/
{
     char c;/*bin[]前32位为二进制,最后一位为'/0'*/
     unsigned int i=0,t=0,len,ad=1;/*ad-进位*/
     if (val==0) return bin;
     if (val>0)/*正数*/
     {
        while (val!=0)
        {
              bin[i++]=val%2+'0';
              val/=2;
        }
        //bin[i]='/0';
        len=i-1;/*len下脚标恢复到'/0'之前的位置*/
        for (i=0,t=len;i<t;i++,t--)
        {
            c=bin[i];
            bin[i]=bin[t];
            bin[t]=c;
        }/*交换二进制字符串使得从0-len为正确的顺序*/
        /*把数字部分移动到数组尾部*/
        for (i=0;i<len+1;i++)
        {
            c=bin[31-i];
            bin[31-i]=bin[len-i];
            bin[len-i]=c;
        }
     }
     else /*负数*/
     {
          /*负数部分还存在问题*/
          bin[0]='1';/*负数为最高位为1,其他位为正数二进制取反加1*/
          i=1;/*转换的数字要从第二个字符串开始*/
          val=abs(val);
          while (val!=0)
          {
                bin[i++]=val%2+'0';
                val/=2;
          }
          len=i-1;/*len下脚标恢复到'/0'之前的位置*/
          for (i=1,t=len;i<t;i++,t--)
          {
              c=bin[i];
              bin[i]=bin[t];
              bin[t]=c;
          }/*交换二进制字符串使得从0-len为正确的顺序*/
          /*把数字部分移动到数组尾部*/
          for (i=0;i<len;i++)
          {
              c=bin[31-i];
              bin[31-i]=bin[len-i];
              bin[len-i]=c;
          }
          /*按位取反*/
          for (i=1;i<32;i++)
          {
              if (bin[i]=='0') bin[i]='1';
              else bin[i]='0';
          }
          /*再加一*/
          for (i=31;ad!=0;i--)
          {
              if (bin[i]+ad>'1') bin[i]='0';/*需要进位*/
              else
              {
                  bin[i]='1';/*前面有进位,此时可以推出s[i]=='0'*/
                  ad=0;
              }
          }
     }/*else 结束*/
     return bin;
}

main()
{
      char s[14];
      puts("This program is made for translate Decimal Digit to Binary Digit.");
      puts("/"Exit/" for exit.");
      putchar('/n');
      puts("ATTENTION:");
      puts("The number rangement:-2147483647~2147483647/n");
      while (1)
      {
            printf(">>");
            gets(s);
            if (isnumerical(s))/*s是数字*/
            {
               putchar('/n');
               printf("Binary Digit:");
               puts(D_B(val(s)));
               putchar('/n');
            }
            else
            {
                lowcase(s);
                if (strcmp(s,"exit")!=0)
                {
                    puts("/nInvalid input.");
                    puts("Only /"exit/" can exit this program./n");
                }
                else break;
            }
            strcpy(bin,"00000000000000000000000000000000");
      }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值