`

写一个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++十进制二进制互换

    本篇文章将深入探讨如何在C++中实现十进制与二进制之间的互换。 ### 一、十进制转二进制 #### 1. 使用`std::bitset` C++标准库中的`&lt;bitset&gt;`头文件提供了一个名为`std::bitset`的模板类,用于处理二进制位。我们...

    c++十进制和十六进制互换程序

    用户可以通过命令行输入一个数,程序会自动进行相应的转换并打印结果。 为了确保程序在DOS环境中正常工作,开发者可能已经考虑了以下几点: 1. 输入输出格式:DOS环境通常使用命令行参数传递输入值,或者通过标准...

    奇偶比特位互换

    由于0xAAAAAAAA是一个二进制掩码,其所有奇数位为1,偶数位为0,这个掩码会确保只有奇偶比特位参与异或操作,其他位保持不变。 例如,如果`num`是10101010(十进制为170),左移一位后变成101010100(十进制为340)...

    奥贫血十六进制转换器

    标题中的“奥贫血十六进制转换器”可能是指一个专门用于进行二进制与十六进制之间转换的工具。在IT领域,进制转换是一项基本技能,尤其在处理计算机数据时,不同进制间的转换非常常见。二进制(Binary)是计算机内部...

    Minitab

    格雷码,又称循环二进制码或反射二进制码,是一种特殊的二进制编码方式,其特点在于任意两个相邻的数在它们的数字表示中只有一个数字不同。这种编码方式在数字系统中有着广泛的应用,尤其是在需要高可靠性和低误差的...

    用于将Modbus通信中截取后四字节的十六进制数转换为单精度浮点数(源码)

    当我们有一个四字节的十六进制数时,需要将其转换为二进制形式,然后按照 IEEE754 的结构拆分。转换步骤如下: 1. **十六进制到二进制转换**:将每个字节的十六进制数转换为八位的二进制数。例如,十六进制数 ...

    16位转浮点型float,MODBUS 32位转浮点型float 64位转双浮点型double

    转换时,需要解码这32位数据并按照标准进行计算,将二进制形式转化为十进制的浮点数。 3. **64位转双浮点型(double)** 双浮点型(double)是64位的浮点数,提供更高的精度。同样遵循IEEE 754标准,64位数据由1位...

    浮点数整数之间互换.rar

    "浮点数整数之间互换.exe"这个程序很可能是一个图形用户界面应用,用户可以直接输入数值,选择转换类型(浮点数到整数或反之),并指定进制转换的选项。这样的工具在处理工控数据时非常实用,因为它可以快速、准确地...

    ip表示互换

    5. **工具使用**:描述中的工具可能有一个简单的用户界面,用户输入整数后点击按钮,程序会自动计算并显示对应的点分十进制IP地址。它也可能支持批量转换或者命令行接口。 6. **安全性**:尽管这类工具方便,但用户...

    ASCII码和数字之间的相互转换

    例如,当你需要将一个字符(如字母或数字)转换为其对应的十进制或十六进制数值时,或者相反地,将一个十进制或十六进制数值转换回对应的ASCII字符时,就需要进行这种转换。 1. ASCII到十进制转换:每个ASCII字符都...

    MFC做的科学计算器(源代码)

    例如,将十进制转换为二进制,可以先将十进制数除以2,取余数,再将商继续除以2,直到商为0。余数逆序排列即为二进制表示。 六、事件驱动编程 MFC采用事件驱动编程模型,通过消息队列和消息循环来处理用户的操作。...

    java面向对象笔记

    在补码表示法中,一个负数的补码是其对应的正数二进制表示取反(每一位进行0和1的互换)后再加1。例如,四位二进制补码中,1001表示-7,其计算过程为0111(7的二进制表示)取反得到1000,再加1得到1001。需要注意的...

    经纬度转换程序.7z

    针对这一需求,本项目提供了一个C++实现的经纬度转换程序,允许用户灵活地进行格式转换,并可自定义转换精度,具有良好的二次开发潜力。 首先,让我们了解经纬度的基本概念。经度表示地球上的东西方向,从本初子午...

    C++实现高性能转换大小写算法示例

    在C++编程中,大小写转换是一个常见的任务,特别是在处理字符串时。本文将深入探讨如何在C++中实现高性能的大小写转换算法,以及背后的原理和优化策略。 首先,我们可以利用C++标准库提供的`transform`函数和`::...

    ASCLL码转换器

    2. ASCII码显示:程序会将输入的字符转换为其对应的ASCII码值,并以十进制、十六进制和二进制的形式展示。 3. 字符显示:如果用户输入的是ASCII码值,程序会将其转换为相应的字符。 4. 复制和粘贴功能:用户可以方便...

    常用数据类型转换,资源很丰富

    在编程中,十六进制常用来表示二进制数据,因为每两位二进制可以对应一个十六进制数字。将十六进制数转换为对应的字符,通常涉及ASCII码或Unicode编码。例如,十六进制数'48'对应ASCII码的'0'字符。这种转换在处理...

    经纬度换算方法,可以将经纬度的度与度分秒进行互换

    假设有一个十进制度数为39.9042°,将其转换为度分秒的形式: 1. **确定度数**:整数部分为39°。 2. **计算分数**:小数部分为0.9042,计算其分值为\(0.9042 \times 60 = 54.252\)。 3. **计算秒数**:取第二步中...

Global site tag (gtag.js) - Google Analytics