精华内容
下载资源
问答
  • C++语言实现带小数的任意进制转换,使用了数据结构中的栈和队列,在VC++6.0上编译运行通过。对于学习C++和数据结构有一定的参考意义!
  • 代码来的,经过运行唔错的,想交作业或者懒得去计算的可以下载去玩玩
  • 16进制与10进制相互转换代码,10转16进制,16转10进制,包含源文件与头文件,直接移植后可以使用。
  • c/c++进制转换方法汇总(含全部代码

    万次阅读 多人点赞 2019-02-24 17:51:16
    进制转换方法汇总表 原进制 转换进制 方法1 方法2 方法3 方法4 十进制 二进制 bitset指定格式输出 除留余数法 itoa 十进制 八进制 oct/%o指定格式输出 流 除留余数...
    进制转换方法汇总表
    原进制转换进制方法1方法2方法3方法4
    十进制二进制bitset指定格式输出 除留余数法itoa
    十进制八进制oct/%o指定格式输出除留余数法itoa
    十进制十六进制hex/%x指定格式输出除留余数法itoa
    十进制其他进制  除留余数法itoa
    二进制八进制三位一组   
    二进制十进制按权展开  strtol
    二进制十六进制四位一组   
    八进制二进制一位换三 除留余数法 
    八进制十进制按权展开 strtol
    八进制十六进制   
    十六进制二进制一位换四 除留余数法 
    十六进制八进制   
    十六进制十进制按权展开 strtol

    基本操作函数:

    Atoi(string &S, int R) 任意进制转十进制(All Radix to Int) 参数:任意进制字符串 进制R 作用:利用按权展开加和,返回十进制
    Itoa(int Num,int R) 十进制转任意进制(Int to All Radix)参数:十进制数Num,进制R 作用:利用除留余数法,返回逆序的余数,即返回所要转换的进制数

    功能实现函数:

    ToAll() 十进制转任意进制 调用函数Itoa,自带的itoa
    ToDecimal(string &S) 任意进制转十进制函数 调用Atoi函数,strtol函数
    ZhiDing() 作用:利用std的hex dec 以及 bitset,c语言的%o,%x
    Stream() 作用:利用sstream头文件将数按某进制读入流,输出流

    1.任意进制转十进制

    【分析】按权展开,求和即可。例如,二进制数110,即4+2+0=6;另外,不想自己写的话,有strtol函数(百度百科)。

    long int strtol(const char *nptr,char **endptr,int base);参数:字符串,非法字符指针,字符串中的进制

    考虑的很详细,字符串中含有非法的字符(,.*等)时还能停止转换,并返回指针。

    2.十进制转任意进制

    【分析】除留余数法,逆序输出余数即可。另外,如果自己不想写的话,有itoa函数。

    string itoa(int x,char *string,int jz);参数:想要转换的数,转换结果字符串,转换结果的进制

    3.指定格式与流

    【分析】主要是八进制、十进制和十六进制。对c来说是%o%d,%x;对c++来说是oct,dec,hex。作者感觉所谓的指定格式是输入输出流,sstream的stringstream类是字符串流,本质上应该是差不多的,就写在了一起。学的不深,没有看标准库中类的源代码,请大神指点。

    4.二、八、十六之间的转换

    【分析】表格里面的一位换四,三位一组之类的是指通过二进制。例如,二进制与八进制进行转换,二进制的110就是八进制的6。反过来,八进制转为二进制,只需要一位转换为三位,6换为110即可。由于也不多,大家都很熟悉,没必要用除留余数法,可以自己写个映射之类的。至于八进制与十六进制的转换,可以利用二进制或十进制作为跳板。(这个代码里面没有,读者可以尝试写一下)

    5.全部代码

    /*
    Project: 进制转换(Radix)
    Date:    2019/02/24
    Author:  Frank Yu
    基本操作函数:
    Atoi(string &S, int R) 任意进制转十进制(All Radix to Int) 参数:任意进制字符串 进制R 作用:利用按权展开加和,返回十进制
    Itoa(int Num,int R) 十进制转任意进制(Int to All Radix)参数:十进制数Num,进制R 作用:利用除留余数法,返回逆序的余数,即返回所要转换的进制数
    功能实现函数:
    ToAll() 十进制转任意进制 调用函数Itoa
    ToDecimal(string &S) 任意进制转十进制函数 调用Atoi函数,strtol函数
    ZhiDing() 作用:利用std的hex dec 以及 bitset,c语言的%o,%x
    Stream() 作用:利用sstream头文件将数按某进制读入流,输出流
    */
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<cmath>
    #include<string>
    #include<set>
    #include<list>
    #include<vector>
    #include<map>
    #include<iterator>
    #include<algorithm>
    #include<bitset>
    #include<sstream>
    #include<iostream>
    using namespace std;
    #define Max 100
    //进制权值
    int power(int R,int turn)
    {
    	int ans = 1;
    	while (turn--)
    	{
    		ans = ans*R;
    	}
    	return ans;
    }
    //**************************************基本操作函数**********************************//
    //任意进制转十进制(All Radix to Int) 参数:任意进制字符串 进制R 作用:利用按权展开加和,返回十进制
    long int Atoi(string &S, int R)
    {
    	long int ans = 0;
    	for (int i=0;i < S.size();i++)//按权展开
    	{
    		ans += (S[i] - '0') * power(R, S.size() - i - 1);
    	}
    	/* 网上代码 不理解(已了解,举例,十六进制时t可能为f,那么f-'a'=5,再加10就是15了)	
    	int ans=0;
    	for (int i = 0;i<s.size();i++)
    	{
    		char t = s[i];
    		if (t >= '0'&&t <= '9') ans = ans*radix + t - '0';
    		else ans = ans*radix + t - 'a' + 10;
    	}*/
    	return ans;
    }
    //十进制转任意进制(Int to All Radix)参数:十进制数Num,进制R 作用:利用除留余数法,返回逆序的余数,即返回所要转换的进制数
    string Itoa(int Num,int R)
    {
      string remain="";
      int temp;
      do {
       temp = Num%R;//取余
       Num /= R;
       if (temp >= 10)
    	   remain += temp - 10 + 'A';//任意进制为大于基数大于10的进制 例如,十六进制
       else remain += temp + '0';
      } while (Num);
      reverse(remain.begin(),remain.end());//逆序
      return remain;
    }
    //**************************************功能实现函数**********************************//
    //菜单
    void menu()
    {
    	cout << "************1.十进制转任意进制(除留余数)       2.任意进制转为十进制(按权展开)****" << endl;
    	cout << "************3.十进制指定格式输出(二、八、十六)  4.利用流****************************" << endl;
    	cout << "************5.退出" << endl;
    }
    void menu1()
    {
    	cout << "************1.十进制转二进制         2.十进制转八进制****" << endl;
    	cout << "************3.十进制转十六进制       4.退出**************" << endl;
    }
    void menu2()
    {
    	cout << "************1.十进制转八进制         2.十进制转十六进制**************" << endl;
    	cout << "************3.八进制转十进制         4.十六进制转十进制**************" << endl;
    	cout << "************5.退出" << endl;
    }
    //十进制转任意进制 调用函数Itoa,自带的itoa
    void ToAll()
    {
    	int num, R;char str[Max];
    	cout << "请输入数和进制:" << endl;
    	cin >> num >> R;
    	cout << num << "转换为"<<R<<"进制为:" << Itoa(num,R) << endl;
    	cout << "利用itoa函数:" <<itoa(num,str,R)<<endl;
    }
    //任意进制转十进制函数 调用Atoi函数,strtol函数
    void ToDecimal(string &S)
    {
    	int R;
    	cout << "请输入数和进制:" << endl;
    	cin >>S>>R;
    	cout <<S<<"转换为十进制为:"<<Atoi(S, R)<<endl;
    	//利用strtol函数 long int strtol(const char *nptr,char **endptr,int base)
    	//参数,字符串,非法字符指针,字符串中的进制
    	char nptr[Max],*stop;
    	strcpy(nptr,S.c_str());//string类型转换为char
    	cout<<S << "转换为十进制为(利用strtol函数):" << strtol(nptr,&stop,R) << endl;
    }
    //作用:利用std的hex dec 以及 bitset,c语言的%o,%x
    void ZhiDing()
    {
    	int num;int choice = 0;
    	 cout << "请输入十进制数:" << endl;
    	 cin >> num;
    	while (1)
    	{
    		menu1();
    		printf("请输入菜单序号:\n");
    		scanf("%d", &choice);
    		if (4 == choice) break;
    		switch (choice)
    		{
    		case 1:cout << num <<"转为二进制(利用bitset):"<<bitset<8>(num)<<endl;break;
    		case 2: {
    			      cout << num << "转为八进制(利用oct):" << oct << num << endl;
    				  printf("转为八进制(利用o):%o\n",num);//8位,高位补0
    		         }break;
    		case 3: {
    			       cout << num << "转为十六进制:" << hex << num << endl;
    				   printf("转为十六进制(利用x):%x\n", num);
    		        }break;
    		default:printf("输入错误!!!\n");break;
    		}
    	}
    }
    //作用:利用sstream头文件将数按某进制读入流,输出流
    void Stream()
    {
    	string s;int choice = 0;
    	stringstream ss;int num;
    	while (1)
    	{
    		menu2();
    		printf("请输入菜单序号:\n");
    		scanf("%d", &choice);
    		if (5 == choice) break;
    		switch (choice)
    		{
    		case 1: {
    			cout << "请输入一个数:" << endl;
    			cin >> num;
    			ss.clear();//清空一下,防止出错
    			ss << oct << num;//十进制转为八进制读入流中
    			ss >> s;//转换的八进制数放入字符串s中
    			cout << num << "转为八进制(利用流):" << s << endl;
    		}break;
    		case 2: {
    			cout << "请输入一个数:" << endl;
    			cin >> num;
    			ss.clear();//清空一下,防止出错
    			ss << hex << num;//十进制转为十六进制读入流中
    			ss >> s;//转换的十六进制数放入字符串s中
    			cout << num << "转为十六进制(利用流):" << s << endl;
    		}break;
    		case 3: {
    			cout << "请输入一个数:" << endl;
    			cin >> s;
    			ss.clear();//清空一下,防止出错
    			ss << oct << s;//将s以八进制形式读入流中
    			ss >> num;//以十进制输入到num中
    			cout << s << "转为十进制(利用流):" << num << endl;
    		}break;
    		case 4: {
    			cout << "请输入一个数:" << endl;
    			cin >> s;
    			ss.clear();//清空一下,防止出错
    			ss << hex << s;//将s以八进制形式读入流中
    			ss >> num;//以十进制输入到num中
    			cout << s << "转为十进制(利用流):" << num << endl;
    		}break;
    		default:printf("输入错误!!!\n");break;
    		}
    	}
    }
    //主函数
    int main()
    {
    	int choice = 0;
    	string S;
    	while (1)
    	{
    		menu();
    		printf("请输入菜单序号:\n");
    		scanf("%d", &choice);
    		if (5 == choice) break;
    		switch (choice)
    		{
    		case 1:ToAll();break;
    		case 2:ToDecimal(S);break;
    		case 3:ZhiDing();break;
    		case 4:Stream();break;
    		default:printf("输入错误!!!\n");break;
    		}
    	}
    	return 0;
    }

    更多数据结构与算法实现:数据结构(严蔚敏版)与算法的实现(含全部代码)

    有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

     

     

    展开全文
  • C++任意进制转换

    2014-12-04 09:54:46
    我的其他资源都是免费的,是对于c语言初学者的帮助比较大的,其中有单片机,ARM,数据结构,window编程,MFC编程,自己编写的小游戏。
  • C++实现各进制转换

    2014-04-27 20:16:55
    c++实现二进制到八进制,十进制,十六进制转换
  • 文章目录(1)其他进制转换为十进制原理代码(2)十进制转换为其他进制原理代码(3)总结 (1)其他进制转换为十进制 原理 P进制x上的每一个位对十进制而言表达的含义都不同 从右到左,各表示个位,P位,P2位,…,Pn位 例如...

    (1)其他进制转换为十进制

    原理

    P进制x上的每一个位对十进制而言表达的含义都不同
    从右到左,各表示个位,P位,P2位,…,Pn
    例如:
    十进制123

    3表个位,2表十位,1表百位
    

    八进制123

    3表个位,28位,164

    二进制101

    1表个位,02位,14位(从右到左)
    

    所以
    P进制x=d1d2…dn
    换个形式x = d1*Pn-1 + d2*Pn-2 +…+ dn-1*P + dn
    在使用十进制的乘法和加法后,x就转换成十进制数了

    代码

    1.用十进制数储存r进制数x
    只能从右往左操作位数

    int rToTen(int n,int r){
    	//将r进制转为10进制,n是该r进制的十进制int表示
    	int ans=0;//存放结果
    	product=1;//存放位数的十进制含义,一开始表示1
    	while(n){//n=0时退出循环
    		ans += (x%10) * product;
    		//x%10取出个位数
    		x /= 10; 
    		// x去掉个位数,并存放于x中
    		product*=r;
    		//得到下一位数
    	}
    	return ans;
    }
    
    

    2.用字符串储存r进制数n
    从右往左

    int rToTen(string n,int r){
        	//将r进制转为10进制,n是该r进制的字符串表示
          int i = n.length()-1;
          int ans = 0;//存放结果
      	  int product=1;//存放位数的十进制含义
          while(i>=0){//i从后往前(从右往左)遍历n
             ans+= (n[i]-'0')*product;
             product*=r;//更新下一个位数的十进制数含义
             i--;
         }
         return ans;
     }
    

    从左往右

    int rToTen(string n,int r){
        	//将r进制转为10进制,n是该r进制的字符串表示
          int len = n.length();
          int ans = 0;//存放结果
          int i = 0;
          while(i<len){//i遍历n
             ans*=r;//所有位数在r进制表示下向左移一位,相当于r进制每个位数乘于r
             ans+=n[i]-'0';//-'0'表示char转换int,加上int相当于加个个位数
             i++;
         }
         return ans;
     }
    

    (2)十进制转换为其他进制

    原理

    一个数除于当前进制数得到的商
    形象上看相当于让这个数所有位都向右移动了一位
    与此同时,原本最右的位数(也就是个位数)
    会从这个数中脱出,成为余数。

    十进制111 111/10=11......1
    二进制111   111/2=11......1 
    八进制111   111/8=11......1
    

    乘的话,就向左移动,个位数补0。

    如果不除或乘于当前进制(比如/或*r进制)
    那么就相当于在r进制的尺度上位移
    只是表面上看不出来而已
    要转换为r进制显示才可以看得出来

    注意:

    显示在屏幕上的数字不加说明的话默认是十进制存储和显示的
    虽然有时明面说是其他进制
    也就是说还得 %10/10来操作个位数
    如果将r进制的x操作,x/r虽然表明上看
    没有得到移位后的效果,这是是用十进制存储和显示的
    实际效果是达到的,显示的数就是以r进制存储位移后转换成10进制的结果。
    

    代码

    十进制数y

    int ans[40]//低位到高位存储
    int len=0;//长度
    do{
    	ans[len++]=y%r;
    	y/=r;
    }while(y);
    //ans[len-1]到ans[0]即为r进制y
    

    (3)总结

    说白了,就是操作位数,或取出,或移位。

    x % P = 得到个位数
    x / P = 去掉个位数
    

    值得注意的是
    只有P进制的尺度下
    才能直观直接地看到/P,*P的位移,%P的取值
    但不妨碍我们抽象地使用

    展开全文
  • 进制转换 C++ 的简单代码

    千次阅读 2020-04-16 22:16:13
    由于整数与小数的进制转化不同,此题我们应用到栈与队列 代码如下: #include<iostream.h> #include<malloc.h> #include<stdio.h> //栈的结构体,用于计算小数点前的数字,即整数部分 ...

    由于整数与小数的进制转化不同,此题我们应用到栈与队列

    代码如下:  

     

     

     

    #include<iostream.h>
    #include<malloc.h>
    #include<stdio.h>

    //栈的结构体,用于计算小数点前的数字,即整数部分
    typedef struct linknode
    {
     int data;//整数
     struct linknode *next;//指针域
    }LinkStNode;
    //初始化栈
    void InitStack(LinkStNode *&s)
    {
        s=new LinkStNode;
     s->next=NULL;
    }
    //进栈 ---------头插法
    void push(LinkStNode *&s,int &i)
    {
     LinkStNode *p;
     p=new LinkStNode;
     p->data=i;
     p->next=s->next;
     s->next=p;
     
    }
    //  出栈
    bool pop(LinkStNode *&s,int &j)
    {
     LinkStNode *p;
     if(s->next==NULL)
      return false;
     p=s->next;
     j=p->data;
     s->next=p->next;
     free(p);
     return true;
    }
    //销毁栈
    void des(LinkStNode *&s)
    {
     LinkStNode *pre=s,*p=s->next;
     while(s!=NULL)
     {
      delete pre;
      pre=p;
      p=pre->next;
     }
     delete pre;

    }
    //进制转化的小数点前的整数部分
    /*1.进制的转换运用了栈和队列,其中整数部分是除以进制数的余数存储在栈中(取决于它的算法,先进后出),
      当除以进制数商为0时,
      over,此时栈存储的是整数部分的进制转换,直接出来即可。*/
    void Game1(LinkStNode *&s,int x,int b)    //x表示整数部分,b表示进制
    {
     int z;
     do
     {
      z=x%b;  //余数
      x=x/b;  //商
      push(s,z);
     }while(x!=0);
     while(pop(s,z))
     {
      if(z<10)
       cout<<z;
      else
       cout<<char(z-10+65);  //10代表A啊
     }

    }

    //队列的结构体
    typedef struct qnode
    {
     int data;
     struct qnode *next;
    }datanode;

    typedef struct
    {
     datanode *front;
     datanode *rear;
    }QueueNode;
    //初始化队列
    void InitQueue(QueueNode *&q)
    {
     q= new QueueNode;
     q->front=q->rear=NULL;
    }
    //进队列

    void enQueue(QueueNode *&q,int i)
    {
     datanode *p;
     p=new datanode;  //
     p->data=i;
     p->next=NULL;
     if(q->rear==NULL)  //
      q->front=q->rear=p;
     else
     {
      q->rear->next=p;//将结点p链到队尾,并将rear指向它
      q->rear=p;
     }
    }

    //出队列
    bool deQueue(QueueNode *&q,int &i)
    {
     datanode *t;
     if(q->rear==NULL)  //空则无法出列
      return false;
     t=q->front;
     if(q->front==q->rear)   //这是只有一个节点,即是首节点也会是尾节点
      q->front=q->rear=NULL;
     else
      q->front=q->front->next;
     i=t->data;
     free(t);
     return true;
    }


    //处理小数点后的转换
    /*2.小数部分,是这样的计算的。小数部分乘以进制数,取结果整数部分 放入队列中(取决于它的算法,先进先出),
        小数部分继续乘以进制数,
        直到小数部分为0(但有时会算不尽,因此应有精度)*/
    void Game2(QueueNode *&q,double a,int b)//处理到8个数
    {
     int p=0;
     int r;
     while(p<28&&a!=0)
     {
      p++;
      r=int(a*b);   //进队
      enQueue(q,r);
      a=a*b-r;    //小数点后的值 
     }
     cout<<".";
     while(deQueue(q,r))
     {
      if(r<10)
       cout<<r;
      else
       cout<<char(r-10+65);
     }

    }
    //主函数
    void main()
    {
     double a;  //小数
     int b;
     while(1)
     {
      cout<<"请输入想转换的数字:";
      cin>>a;
      cout<<"请输入想转换的进制:";
      cin>>b;
      cout<<endl;
      cout<<"将"<<a<<"转换为"<<b<<"进制后为:";
      LinkStNode *s; //栈指针  先进后出
      QueueNode *q;  //队列指针 先进先出
      InitStack(s);
      int x=int(a);  //整数部分
      Game1(s,x,b);
      InitQueue(q);
      double y=a-x;  //小数部分
      Game2(q,y,b);
      cout<<endl;
     }

       //3.最后将输出栈+小数点+队列的值即可。

    }

    我的答案:

    #include<iostream.h>
    #include<malloc.h>
    #include<stdio.h>

    //栈的结构体,用于计算小数点前的数字,即整数部分
    typedef struct linknode
    {
     int data;//整数
     struct linknode *next;//指针域
    }LinkStNode;
    //初始化栈
    void InitStack(LinkStNode *&s)
    {
        s=new LinkStNode;
     s->next=NULL;
    }
    //进栈 ---------头插法
    void push(LinkStNode *&s,int &i)
    {
     LinkStNode *p;
     p=new LinkStNode;
     p->data=i;
     p->next=s->next;
     s->next=p;
     
    }
    //  出栈
    bool pop(LinkStNode *&s,int &j)
    {
     LinkStNode *p;
     if(s->next==NULL)
      return false;
     p=s->next;
     j=p->data;
     s->next=p->next;
     free(p);
     return true;
    }
    //销毁栈
    void des(LinkStNode *&s)
    {
     LinkStNode *pre=s,*p=s->next;
     while(s!=NULL)
     {
      delete pre;
      pre=p;
      p=pre->next;
     }
     delete pre;

    }
    //进制转化的小数点前的整数部分
    /*1.进制的转换运用了栈和队列,其中整数部分是除以进制数的余数存储在栈中(取决于它的算法,先进后出),
      当除以进制数商为0时,
      over,此时栈存储的是整数部分的进制转换,直接出来即可。*/
    void Game1(LinkStNode *&s,int x,int b)    //x表示整数部分,b表示进制
    {
     int z;
     do
     {
      z=x%b;  //余数
      x=x/b;  //商
      push(s,z);
     }while(x!=0);
     while(pop(s,z))
     {
      if(z<10)
       cout<<z;
      else
       cout<<char(z-10+65);  //10代表A啊
     }

    }

    //队列的结构体
    typedef struct qnode
    {
     int data;
     struct qnode *next;
    }datanode;

    typedef struct
    {
     datanode *front;
     datanode *rear;
    }QueueNode;
    //初始化队列
    void InitQueue(QueueNode *&q)
    {
     q= new QueueNode;
     q->front=q->rear=NULL;
    }
    //进队列

    void enQueue(QueueNode *&q,int i)
    {
     datanode *p;
     p=new datanode;  //
     p->data=i;
     p->next=NULL;
     if(q->rear==NULL)  //
      q->front=q->rear=p;
     else
     {
      q->rear->next=p;//将结点p链到队尾,并将rear指向它
      q->rear=p;
     }
    }

    //出队列
    bool deQueue(QueueNode *&q,int &i)
    {
     datanode *t;
     if(q->rear==NULL)  //空则无法出列
      return false;
     t=q->front;
     if(q->front==q->rear)   //这是只有一个节点,即是首节点也会是尾节点
      q->front=q->rear=NULL;
     else
      q->front=q->front->next;
     i=t->data;
     free(t);
     return true;
    }


    //处理小数点后的转换
    /*2.小数部分,是这样的计算的。小数部分乘以进制数,取结果整数部分 放入队列中(取决于它的算法,先进先出),
        小数部分继续乘以进制数,
        直到小数部分为0(但有时会算不尽,因此应有精度)*/
    void Game2(QueueNode *&q,double a,int b)//处理到8个数
    {
     int p=0;
     int r;
     while(p<28&&a!=0)
     {
      p++;
      r=int(a*b);   //进队
      enQueue(q,r);
      a=a*b-r;    //小数点后的值 
     }
     cout<<".";
     while(deQueue(q,r))
     {
      if(r<10)
       cout<<r;
      else
       cout<<char(r-10+65);
     }

    }
    //主函数
    void main()
    {
     double a;  //小数
     int b;
     while(1)
     {
      cout<<"请输入想转换的数字:";
      cin>>a;
      cout<<"请输入想转换的进制:";
      cin>>b;
      cout<<endl;
      cout<<"将"<<a<<"转换为"<<b<<"进制后为:";
      LinkStNode *s; //栈指针  先进后出
      QueueNode *q;  //队列指针 先进先出
      InitStack(s);
      int x=int(a);  //整数部分
      Game1(s,x,b);
      InitQueue(q);
      double y=a-x;  //小数部分
      Game2(q,y,b);
      cout<<endl;
     }

       //3.最后将输出栈+小数点+队列的值即可。

    }

    我的答案:

    #include<iostream.h>
    #include<malloc.h>
    #include<stdio.h>

    //栈的结构体,用于计算小数点前的数字,即整数部分
    typedef struct linknode
    {
     int data;//整数
     struct linknode *next;//指针域
    }LinkStNode;
    //初始化栈
    void InitStack(LinkStNode *&s)
    {
        s=new LinkStNode;
     s->next=NULL;
    }
    //进栈 ---------头插法
    void push(LinkStNode *&s,int &i)
    {
     LinkStNode *p;
     p=new LinkStNode;
     p->data=i;
     p->next=s->next;
     s->next=p;
     
    }
    //  出栈
    bool pop(LinkStNode *&s,int &j)
    {
     LinkStNode *p;
     if(s->next==NULL)
      return false;
     p=s->next;
     j=p->data;
     s->next=p->next;
     free(p);
     return true;
    }
    //销毁栈
    void des(LinkStNode *&s)
    {
     LinkStNode *pre=s,*p=s->next;
     while(s!=NULL)
     {
      delete pre;
      pre=p;
      p=pre->next;
     }
     delete pre;

    }
    //进制转化的小数点前的整数部分
    /*1.进制的转换运用了栈和队列,其中整数部分是除以进制数的余数存储在栈中(取决于它的算法,先进后出),
      当除以进制数商为0时,
      over,此时栈存储的是整数部分的进制转换,直接出来即可。*/
    void Game1(LinkStNode *&s,int x,int b)    //x表示整数部分,b表示进制
    {
     int z;
     do
     {
      z=x%b;  //余数
      x=x/b;  //商
      push(s,z);
     }while(x!=0);
     while(pop(s,z))
     {
      if(z<10)
       cout<<z;
      else
       cout<<char(z-10+65);  //10代表A啊
     }

    }

    //队列的结构体
    typedef struct qnode
    {
     int data;
     struct qnode *next;
    }datanode;

    typedef struct
    {
     datanode *front;
     datanode *rear;
    }QueueNode;
    //初始化队列
    void InitQueue(QueueNode *&q)
    {
     q= new QueueNode;
     q->front=q->rear=NULL;
    }
    //进队列

    void enQueue(QueueNode *&q,int i)
    {
     datanode *p;
     p=new datanode;  //
     p->data=i;
     p->next=NULL;
     if(q->rear==NULL)  //
      q->front=q->rear=p;
     else
     {
      q->rear->next=p;//将结点p链到队尾,并将rear指向它
      q->rear=p;
     }
    }

    //出队列
    bool deQueue(QueueNode *&q,int &i)
    {
     datanode *t;
     if(q->rear==NULL)  //空则无法出列
      return false;
     t=q->front;
     if(q->front==q->rear)   //这是只有一个节点,即是首节点也会是尾节点
      q->front=q->rear=NULL;
     else
      q->front=q->front->next;
     i=t->data;
     free(t);
     return true;
    }


    //处理小数点后的转换
    /*2.小数部分,是这样的计算的。小数部分乘以进制数,取结果整数部分 放入队列中(取决于它的算法,先进先出),
        小数部分继续乘以进制数,
        直到小数部分为0(但有时会算不尽,因此应有精度)*/
    void Game2(QueueNode *&q,double a,int b)//处理到8个数
    {
     int p=0;
     int r;
     while(p<28&&a!=0)
     {
      p++;
      r=int(a*b);   //进队
      enQueue(q,r);
      a=a*b-r;    //小数点后的值 
     }
     cout<<".";
     while(deQueue(q,r))
     {
      if(r<10)
       cout<<r;
      else
       cout<<char(r-10+65);
     }

    }
    //主函数
    void main()
    {
     double a;  //小数
     int b;
     while(1)
     {
      cout<<"请输入想转换的数字:";
      cin>>a;
      cout<<"请输入想转换的进制:";
      cin>>b;
      cout<<endl;
      cout<<"将"<<a<<"转换为"<<b<<"进制后为:";
      LinkStNode *s; //栈指针  先进后出
      QueueNode *q;  //队列指针 先进先出
      InitStack(s);
      int x=int(a);  //整数部分
      Game1(s,x,b);
      InitQueue(q);
      double y=a-x;  //小数部分
      Game2(q,y,b);
      cout<<endl;
     }

       //3.最后将输出栈+小数点+队列的值即可。

    }

     

    展开全文
  • 进制转换成八进制

    2014-09-28 01:22:06
    栈的应用举例,由于没给出完整源码,自己写了一个比较完整的
  • 通过用户菜单选择需要转换的数字和任意进制 直接上代码了 #include<algorithm> #include<cmath> #include<string> #include<iostream> using namespace std; #include<stack> int _...

    通过用户菜单选择需要转换的数字和任意进制

    直接上代码了

    #include<algorithm>
    #include<cmath>
    #include<string>
    #include<iostream>
    using namespace std;
    #include<stack>
    
    int _sys=0;  //进制
    string  _input(" ");//转换数字
    
    
    
    
    //10进制转任意进制
    void func2(){
    //eg: 10 2  先输出最后的商然后倒序输出余数
    
    cout<<"请输入要转换的数字"<<endl;
    cin>>_input;
    cout<<"请输入要转换的进制"<<endl;
    cin>>_sys;
    stack<int> s;
    int res=0;
    const char*p=_input.c_str();
    int _num=atoi(p);  //拿到数字10
    int tmp;
    
    while(_num/_sys>=_sys){
    s.push(_num%_sys);
    
    _num=_num/_sys;
    tmp=_num;
    }
    
    s.push(tmp%_sys);
    s.push(_num/_sys);
    while(!s.empty()){
    cout<<s.top();
    s.pop();
    
    }
    
    }
    
    
    
    
    
    
    
    //任意进制转10进制
    void func1(){
    //eg: 1010 2 
    
    cout<<"请输入要转换的数字"<<endl;
    cin>>_input;
    cout<<"请输入要转换的进制"<<endl;
    cin>>_sys;
    const char *p=_input.c_str();
    int _num=atoi(p);
    int res=0;
    int len=_input.size();
    
    
    for(int i=0;i<len;++i){
    res+=(_input[i]-48)*pow(_sys,len-1-i);
    
    }
    cout<<res<<endl;
    
    }
    
    
    
    void menu(){
    
    cout<<"*********************************************"<<endl;
    cout<<"1. 任意进制转换10进制    2.10进制转换任意进制 "<<endl;
    cout<<"*********************************************"<<endl;
    
    }
    
    
    
    
    int main(){
    
    int _sys;  //进制
    string  _input;//转换数字
    int _switch;//函数选择
    
    
    menu();//选择菜单
    cout<<"请输入要执行的功能"<<endl;
    cin>>_switch;
    
    switch(_switch){
    
    case 1:  func1();     break;
    case 2:  func2();     break;
    default: cout<<"输入有误";       
    break; 
    }
    
    
    return 0;
    }
    
    
    
    
    展开全文
  • 进制转换代码

    2013-08-13 09:39:44
    这是我自己总结的进制转换代码,包括二进制转十进制,十六进制转二进制,十六进制转十进制,十进制转二进制,字符串转十六进制等
  • 进制转换(C++)

    2021-02-17 14:42:00
    以二进制转换为十进制为例: 基本规则:把二进制数按权展开、相加即得十进制数。 c++代码实现 int toDecimal(string s,int radix){ //s是给定的radix进制字符串 int ans=0; for(int i=0;i<s.size();i++){ ...
  • c++进制转换十进制 double power(double x,int n) { double v=1; while(n--) { v=v*x; } return v; }
  • c++实现代码36进制与十进制之间进行转换,标准代码,亲自验证过,可正常运行,直接使用即可
  • 进制的转换 stoi函数(<string>)与itoa函数(<stdlib.h>) /* 原型:int stoi(string str, size_t* idx = 0, int base = 10...功能:把一个字符串按照base进制转换成数字,至str的第一个非法字符结束 */ //...
  • 链式栈的进制转换代码 #define datatype int typedef struct stacknode { int num; datatype data; struct stacknode *pNext; }StackNode; StackNode * init(StackNode * phead);//初始化 StackNode * push...
  • 进制转换(用c++实现)

    千次阅读 2020-06-05 09:05:11
    把一个32位整数M(十进制)转换成n进制的数字并输出 输出结果为一行 输入示例: ...//存储每个进制转换后位的数字 long long M;//32位整数M的变量 int n;//转换进制 while (cin >> M >>
  • 题目内容:将十进制整数转换成二进制数。 输入描述:输入数据中含有不多于50个的整数n(-231”,再然后输出二进制数。每个整数n的输出,独立占一行。 题目分析:将某个数从十进制转为二进制的具体方法是,该数对2取余...
  • C++进制转换(10进制→2~36进制)

    千次阅读 2020-02-19 20:53:17
    被除数除以除数,余数一定小于除数。 如果除数大于10,余数就有可能大于9,但表示的时候要输出字母表示。如16进制中"A"表示"10",“F"表示"15”。如36进制中“Z”表示"35"。... //n表示要转换的数...
  • 使用C++语言实现十进制转换为二进制的运算方法,可正负互转
  • 进制转换为十六进制,也就是 采用 除k取余法 ,直接让10处以16,再对 数据如果小于10和大于10进行处理,代码如下: #include<iostream> #include<string> using namespace std; int main() { ...
  • c++进制转换n进制

    2021-06-15 10:33:43
    利用这段代码可以实现10进制转换为36进制下的任意进制。 代码的思路很简单,利用一段函数,将每一次取余得到的结果存入数组,最后利用for循环和switch语句将得到的数组反响输出,就得到了转换后的结果。 以下是代码...
  • 进制转换代码

    2013-04-14 21:26:24
    介绍各进制之间的转换,是初学者的学习实例
  • C++2~36进制转换代码

    2021-08-14 09:20:19
    2~36进制转10进制,10进制转2~36进制
  • 进制转二进制:   //十进制转二进制 #include&lt;iostream&gt; using namespace std; void printbinary(const unsigned int val) { for(int i = 16; i &gt;= 0; i--) { if(val &amp; (1 ...
  • C++实现一个简单的进制转换程序(包含小数) 话不多说先上代码 ```cpp #include <iostream> #include <string> #include "temple.h" using namespace std; int main() { long double a=1000; int...
  • 进制转十进制代码

    2018-12-27 14:54:04
    进制转十进制,首先讲一下“权重”的概念 数字中某位的权重:2的(该位所在的位数(从右至左)-1)次方 比如:10 0的权重为:2^(1-1)=1 1的权重为:2^(2-1)=2 二进制转十进制:数字中所有位*本位的权重...
  • C++实现十进制转换二进制 二进制转换十进制 C++实现二进制转换十进制 十进制与二进制之间的转换 十进制转换二进制 十进制对2整除,得到的余数的倒序即为转换而成的二进制 十进制转换二进制 C++实现十进制...
  • 该资源主要解决进制转换问题 十进制转换十二进制

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 115,265
精华内容 46,106
关键字:

c++进制转换代码

c++ 订阅