`

写一个C++程序,二进制十进制互换

    博客分类:
  • C++
阅读更多
现在提供一个C语言程序给你,可以实现任何进制(1~16)到任何进制的转换的呢?但是是C语言程序的,可以在VC++6.0Sp6上调试通过的,源程序如下:
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
void main()
{
int i,j,k,m,n,x,b[20],h[20],c,t;
double d,r,p=0;
char a[20];
printf("请输入一个任意进制的数:");
gets(a);//在头文件<string.h>中定义
printf("请输入此数为何种进制的数:");
scanf("%d",&t);
printf("请输入要转换成的进制(1<N<=16):");
scanf("%d",&n);
m=strlen(a);//求字符串的长度
x=m;
for(k=0,j=0;k<m;k++)//主要是分段,以小数点为界限
{
  if(a[k]=='.')
  {
   x=k;
   break;
  }
  if(a[k]=='-')
   j++;
}
for(k=x+1;k<m;k++)//修正输入过程中可能会输入不止一个“.”和“-”的问题
{
  if(a[k]=='-')
   j++;
  if(j>1)//如果其中再次遇到“-”证明输入有误,终止程序
  {
   printf("ERROR!\n");
   exit(0);
  }
  if(a[k]=='.')//如果其中再次遇到“.”证明输入有误,终止程序
  {
   printf("ERROR!\n");
   exit(0);
  }
}//注意:前面两个for()循环可以合并成一个循环,这样就可以节约很多的代码的,但是相对而言,两段程序的时间复杂度一样,修改后的代码如下:
/*
i=0;
j=0;
for(k=0;k<m;k++)
{
  if(a[k]=='.')
  {
   i++;
   x=k;
  }
  if(a[k]=='-')
      j++;
  if(i>1||j>1)
  {
   printf("ERROR!\n");
   exit(0);
  }
}*/
for(j=x-1;j>=0;j--)
{
  if(a[j]=='-')//符号的处理
   break;
  if(a[j]=='A')
   r=10;
  else
   if(a[j]=='B')
    r=11;
   else
    if(a[j]=='C')
     r=12;
    else
     if(a[j]=='D')
      r=13;
     else
      if(a[j]=='E')
       r=14;
      else
       if(a[j]=='F')
        r=15;
       else
        if(a[j]<48||a[j]>57&&a[j]<65||a[j]>70)//修正程序输入合不合法问题的判断,此处采用ASCII值进行编辑
        //if(a[j]>='G'&&a[j]<='Z'||a[j]>='a'&&a[j]<='z')//此段程序不能判断像输入&、%、#等字符的错误判断
        {
         printf("ERROR!\n");
         exit(0);//在头文件<stdlib.h>中定义,无条件跳出程序的的运行
        }
        else        
         r=a[j]-'0';//将字符转换成数字
  if(r>=t)
  {
   printf("ERROR!\n");
   exit(0);
  }
  p=p+r*pow((double)t,(double)(x-j-1));//计算结果
}
if(a[x]=='.')
{
  for(j=x+1;j<m;j++)
  {
   if(a[j]=='A')
    r=10;
   else
    if(a[j]=='B')
     r=11;
    else
     if(a[j]=='C')
      r=12;
     else
      if(a[j]=='D')
       r=13;
      else
       if(a[j]=='E')
        r=14;
       else
        if(a[j]=='F')
         r=15;
        else
         if(a[j]<48||a[j]>57&&a[j]<65||a[j]>70)//修正程序输入合不合法问题的判断,此处采用ASCII值进行编辑
         //if(a[j]>='G'&&a[j]<='Z'||a[j]>='a'&&a[j]<='z')//此段程序不能判断像输入&、%、#等字符的错误判断
         {
          printf("ERROR!\n");
          exit(0);
         }
         else
          r=a[j]-'0';//将字符转换成数字
  if(r>=t)
  {
   printf("ERROR!\n");
   exit(0);
  }
  p=p+r*pow((double)t,(double)(x-j));
  }
}
if(n==10)//选择性计算,如果是整数就不用进行这一步的计算了,这样可以节约程序的运行时间
{
  printf("转换结果为:");
  if(a[0]=='-')
  {  
   printf("-");
  }
  printf("%f",p);
}
else
{
  k=p;//强制类型转换,可以使用k=(int)p;代替,从而更加的一目了然
  i=0;
  while(k)//判定需要转换的数是否变为0
  {
   h[i++]=k%n;//取余,进行进制转换,但是顺序与正确值相反
   k/=n;//转换一位之后进行相应的变化
  }
  c=0;
  //if(p!=(int)p)//选择性计算,如果是整数就不用进行这一步的计算了,这样可以节约程序的运行时间
  //{
  d=p-(int)p;//取小数部分
  while(d!=0)
  {
   b[c]=(int)(d*n);//算法为×N取整
   d=d*n-b[c];
   c++;
   if(c>=10)
    break;//主要是控制小数后面万一出现无限小数的时候好跳出循环以免出现死循环
  //}
  }
  printf("转换结果为:");
  if(a[0]=='-')
   printf("-");
  for(j=i-1;j>=0;j--)//反序输出,大于10的数字进行相应的变化
  {
   if(h[j]==10)
    printf("A");
   else
    if(h[j]==11)
     printf("B");
    else
     if(h[j]==12)
      printf("C");
     else
      if(h[j]==13)
       printf("D");
      else
       if(h[j]==14)
        printf("E");
       else
        if(h[j]==15)
         printf("F");
        else
         printf("%d",h[j]);
  }
if(p!=(int)p)//选择性输出,这样可以节约输出时间和程序的运行时间
{
  printf(".");
  for(j=0;j<c;j++)//正序输出
  {
   if(b[j]==10)
    printf("A");
   else
    if(b[j]==11)
     printf("B");
    else
     if(b[j]==12)
      printf("C");
     else
      if(b[j]==13)
       printf("D");
      else
       if(b[j]==14)
        printf("E");
       else
        if(b[j]==15)
         printf("F");
        else
         printf("%d",b[j]);
  }
}
if(c>=10)//如果是无限小数则在后以省略号表示
  printf("......");
}
printf("\n");//输出换行,以使程序的输出结果美观
}
如果想变为C++程序,只需要做适当的修改就是了的呢?比如输入使用cin,输出使用cout等的就可以了的,主题结果就不用变的就好的!使用函数可以简化程序的,自己可以试一下的,此处只是作为参考的!
分享到:
评论

相关推荐

    c++十进制二进制互换

    轻松实现十进制和二进制的互相转

    JAVA上百实例源码以及开源项目源代码

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    JAVA上百实例源码以及开源项目

     Tcp服务端与客户端的JAVA实例源代码,一个简单的Java TCP服务器端程序,别外还有一个客户端的程序,两者互相配合可以开发出超多的网络程序,这是最基础的部分。 递归遍历矩阵 1个目标文件,简单! 多人聊天室 3...

    java开源包1

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包11

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包2

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包3

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包6

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包5

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包10

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包4

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包8

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包7

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包9

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    java开源包101

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

    Java资源包01

    Blister是一个用于操作苹果二进制PList文件格式的Java开源类库(可用于发送数据给iOS应用程序)。 重复文件检查工具 FindDup.tar FindDup 是一个简单易用的工具,用来检查计算机上重复的文件。 OpenID的Java客户端...

Global site tag (gtag.js) - Google Analytics