| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4953 人关注过本帖
标题:任意进制数之间的转换
取消只看楼主 加入收藏
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
结帖率:93.33%
收藏
已结贴  问题点数:10 回复次数:8 
任意进制数之间的转换
程序代码:
#include<iostream>
#include<string>
using namespace std;
//任意进制之间的转换
/**
* s1  转换之前的数
* s2  转换之后的数
* d1  原进制数
* d2  需要转到的进制数
*     高于9的位数用大写'A'~'Z'表示,2~16位进制通过验证
*/
void conversion(string s1,string &s2,long d1,long d2){
    long i, j, t, num;
    char c;
    num = 0;
    for ( i = 0; i < s1.size(); i++){
        if (s1[i] >= '0'&&s1[i] <= '9'){
            t = s1[i] - '0';
        }
        else t = s1[i] - 'A' + 10;
            num = num*d1 + t;
     }
    i = 0;
    s2 = "";
    while (1){
        t = num%d2;
        num /= d2;
        if (t <= 9)s2 = to_string(t)+ s2;
        else s2 = (char)((t - 10 + 'A')) + s2;
        if (num == 0)break;
    }
}
int main(){
    string str1, str2;
    long d1, d2;
    while (cin >> str1 >> d1 >> d2){
        conversion(str1, str2,d1, d2);
        cout << str2 << endl;
    }
    return 0;
}

论坛还没有这样的东西,俺整了个试试,有点不对,是哪呢?
搜索更多相关主题的帖子: 任意 进制 转换 string num 
2018-05-19 20:17
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
不考虑复杂了,需要转换的数,我们只考虑整数范围,小数暂时不作为考虑对象。这里我说的是任意进制的数,它可以是不小于2的任何数,比如可以是2进制数,可以是3进制数,可以是4进制数,可以是5进制数,等等。当然说明见下:
进制     所需符号
2进制数  0 1
3进制数  0 1 2
4进制数  0 1 2 3
5进制数  0 1 2 3 4
6进制数  0 1 2 3 4 5
7进制数  0 1 2 3 4 5 6
8进制数  0 1 2 3 4 5 6 7
9进制数  0 1 2 3 4 5 6 7 8  
10进制数 0 1 2 3 4 5 6 7 8 9
11进制数 0 1 2 3 4 5 6 7 8 9 A
12进制数 0 1 2 3 4 5 6 7 8 9 A B
13进制数 0 1 2 3 4 5 6 7 8 9 A B C
14进制数 0 1 2 3 4 5 6 7 8 9 A B C D
15进制数 0 1 2 3 4 5 6 7 8 9 A B C D E 
16进制数 0 1 2 3 4 5 6 7 8 9 A B C D E F
17进制数 0 1 2 3 4 5 6 7 8 9 A B C D E F G
18进制数 0 1 2 3 4 5 6 7 8 9 A B C D E F G H
19进制数 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I
.。。。。。
100进制数  ???????????????????????????????????????????????????????????
2018-05-19 22:31
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
回复 9楼 lin5161678
你在定义数据时,可以把小写字母加进去,还可以罗马字母加进去,还可以
把希腊字母加进去,但是一定要说明清楚,不然就会乱了套。
2018-05-19 23:37
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
回复 11楼 lin5161678
这只是为了说明一个道理,就可以了。并不一定要写到好多为止。有这种思路就行。
2018-05-19 23:45
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
回复 14楼 lin5161678
对于你的问题,我用12楼的话来回答你,另外再加一句:编程是思想,
不是任务。有那个意思就行了。不一定要弄到100啊。
2018-05-20 06:20
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
回复 16楼 lin5161678
你的思路是:
进制数A<>进制数10<>进制数B
你把进制数10作为了中间桥梁,能不能这样考虑:
需要转换的进制数    转换后的进制数
2进制数            2进制数
3进制数            3进制数
4进制数            4进制数
5进制数            5进制数
6进制数            6进制数
7进制数            7进制数
8进制数            8进制数
9进制数            9进制数
10进制数           10进制数
11进制数           11进制数
12进制数           12进制数
。。。            。。。
直接从左边的进制数转换到右边的进制数(同进制数除外),中间不用别的进制数做桥梁起渡过的作用。
2018-05-20 11:19
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
回复 18楼 lin5161678
    你说的不行,我理解,我不反对,同时也反对;理由如下:
    我对程序的理解是:程序分两步走:
    1:编写程序。
    2:使用程序。
  第一步是为第二步服务的,在编写程序时,你说的用十进制作为渡过的桥梁是必须的,我在没找到不用它作为桥梁时,我支持你的观念,但是这只是限定于编写程序的范围内。在第二步里,程序的使用过程中,我们(指的是使用程序的人)只关心的是进制A如何转换为进制B的数,至于它是如何转换的,或者你的程序编写了好多行(甚至1000行或者10000行),都不是我们关心的问题,我们只关心我输入一个数进去,能立马得出我想要的结果就可以了。请看:
程序代码:
#include<iostream>   
#include<math.h>   
#include<string.h>  
using namespace std;    
int main()    
//任意进制转换为10进制  
{  char q[100];//定义q为字符串保存原数  
   long n=0;//定义转换成的十进制数为n  
   int i,l,r=0,p,c,m=0,s[100];  
//i为原进制数,l为字符串长度,r为次方数,p为转换后的任意进制数,c为余数,m,l用于计数,s存入转换后的数组  
   cout<<"输入要转化的数:"<<endl;  
   cin>>q;  
   cout<<"输入原数进制:"<<endl;  
   cin>>i;  
   cout<<"转换后的进制:"<<endl;  
   cin>>p;  
   l=strlen(q);  
   strupr(q);//把字符串中字母全部大写,方便下一步计算  
//将任意进制数转化为十进制数  
   for(l=l-1;l>=0;l--)  
      {if(q[l]<='9')n=n+(q[l]-48)*pow(i,r++);  
          else n=n+(q[l]-55)*pow(i,r++);}  
//十进制转换为任意进制  
   while(n!=0)//数制转换,结果存入数组s[m]    
   {  c=n%p;    
      n=n/p;    
      m++;  
      s[m]=c;   //将余数按顺序存入数组s[m]中     
    }      
   for(int k=m;k>=1;k--)//输出转换后的序列    
      {    
         if(s[k]>=10) //若为十六进制等则输出相对应的字母    
            cout<<(char)(s[k]+55);    
         else         //否则直接输出数字    
            cout<<s[k];  
      }   
   cout<<endl;  
   return 0;
   } 

你说用这段代码能反驳你吗??如果能反驳,是反驳你的第一点呢,还是亮点都反驳呢??
2018-05-21 10:29
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
你的代码从使用者的角度出发。看不出是啥?输出结果就是:4R。没了。至少不完善,有待改进。
2018-05-21 11:08
自学的数学
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:46
帖 子:967
专家分:4146
注 册:2017-11-15
收藏
得分:0 
所以,代码还有待完善,希望脱离过渡用的十进制数。
2018-05-21 11:38
快速回复:任意进制数之间的转换
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023435 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved