10进制到任意进制的转换

1.任意进制转换(why sometimes it won't shift to Chinese?)

好气哦,怎么有时候会变不成中文呢,这个网站和我的浏览器之间可能有点什么问题。
任意进制转换(2~36)核心在于连除,
while(q!=0)
    {
        q = q / base;
        a[j]=trans(q%base);
        j--;
    }

an the trans function is a transition from number to char.(A~Z)will represent (10~35)if needed.

BUT in my code i put a flag for first not zero number.Only when start with not zero,will be output.So there is something wrong when you enter 0.So,I should take zero special.

 
if(number==0)
    cout<<"0"<<endl;


2.transfer ffff to 65535,and ffffffffffff is the limit.

well first time,i didn't thing about the limit cituation.I used int .but I should use long long.here's my code. 

    long long a;
    scanf("%X",&a);
    cout<<a<<endl;

Again ,01.

(装了一个输入法好了,以前都是用系统自带的输入法)

然后我用正常方法做了,用的是阿斯科码转换,不是switch,其中要注意的就是对每一位要乘以16的n次方,这个数我是用连乘,要注意也要用long long。

 
 
#include <iostream>
#include <stdio.h>
using namespace std;
int trans( char a)
{
    if(a>=48&&a<=57)
    {
        return a-48;
    }
    else
 //       cout<<(int)a<<"   "<<a-55;
        return a-55;
}
int main()
{
   char a[20];
    gets(a);
   long long out=0;
   int i=0;
    while(a[i]!='\0')
    {
        i++;
    }
    i--;
    long long j=1;
    for(;i>=0;i--)
    {
        out = out + trans(a[i]) * j;
        j = j * 16;
    }
    cout<<out<<endl;
    return 0;
}


还可以用

bits[count]=(n%p-10)+'A';这种公式,用10去换A,实质也是阿斯科码。

bits[count]=n%p+'0';小于A时。bits存的是char



3.规模在100000的16进制转换为8进制

3.1首先呢,我现在用的是codeblocks,codeblocks使用的minGW沿用linux习惯,strlen声明放在 string.h 中(linux系统中可以通过man strlen来查看其帮助和所在头文件),仅仅 #include <string> 只是引入了 std::string,还需要 #include <string.h>来自百度,所以我用的strlen()编译不通过。

gets(*char)前用cin,scanf都不能正确输入十六进制的字符串,所以我换成了cin输入16进制数组。

3.2有个问题就是大数组,由于本题要求一起输出,所以要设置个二维数组存储转换完成的数,只能动态申请然后别忘了动态释放,而且二维数组请看“:

http://www.cnblogs.com/irvinow/archive/2009/02/21/1395340.html

http://blog.csdn.net/promotercx/article/details/7564562

3.3我选择利用二进制做中间的转化,十六进制正好四位,八进制每次取三位。

3.4由此要注意,八进制要从低位开始转换,并且有可能不是三的倍数,剩余的两位或者一位需要单独处理。

3.5本题要求输出时不带前面的零比防说1(十六)->0001(二)->01(八),我用了一个flag记录有没有遇到非零的数字,但是此时注意需要在每输出一行就要重置flag回false

3.6我直接用bitset把十六进制转换成二进制的。

还有0单独处理,上面提到过。

这道题细节真多啊,虽然本身算法不难,可是代码起来总出错。最麻烦的就是它的规模。至于别人的代码由于不能直接复制粘贴看是否能运行,所以我也没看有没有更简洁的方法,很多回复的代码都是不能ac的。

我的代码放下面仅供参考:

#include <iostream>
#include <bitset>
#include <stdio.h>
#include <string>
#include <string.h>
using namespace std;
int main()
{
    char six[100003];
    short **eight;
    eight=new short *[11];
    int len[11];
    for(int i=0; i<=10; i++)
    {
        eight[i]=new short [400000];
    }
    bool two[400009];
    int m=0;
    scanf("%d",&m);
    for(int o=0; o<m; o++)
    {




        //gets(six);
        cin>>six;
        if(six[0]=='0'&&six[1]=='\0')
            cout<<0;
        int n = strlen(six);
        int k = 0;
        for(int i=0; i<n; i++)
        {
            int r=0;
            if(six[i]>=65)
                r=six[i]-55;
            else
            {
                r=six[i]-48;
                //     cout<<(int)six[i]<<" ";
                //    cout<<r<<" "<<six[i]-48<<" ";
            }
            bitset<4>b(r);
            //  cout<<b;
            // cout<<b[0]<<b[1]<<b[2]<<b[3]<<endl;
            for(int j=3; j>=0; j--)
            {
                two[k]=b[j];
                //  cout<<b[j];
                k++;
            }
        }




        int j=0;
        int i;
        //    cout<<k;
        for(i=k-1; i>=2; i=i-3)
        {
            // cout<<two[i]<<two[i-1]<<two[i-2];
            eight[o][j]=two[i] + two[i-1] * 2 + two[i-2]*4;
            j++;
            // cout<<i<<endl;
            //  cout<<eight[j];
        }
        if(i==1)
        {
            eight[o][j]=two[i]+two[i-1]*2;
            j++;
        }
        else if(i==0)
        {
            eight[o][j]=two[i];
            j++;
        }
        // cout<<j;
        len[o]=j;




    }
    bool flag;
    flag=false;
    int u=0;
    for(int o=0; o<m; o++)
    {
        for(int p=len[o]-1; p>=u; p--)
        {
            if(eight[o][p]!=0&&flag==false)
                flag=true;
            if(flag==true)
                cout<<eight[o][p];
        }
        flag=false;
        cout<<endl;
    }
    for(int i=0; i<=10; i++)
    {
        delete []eight[i];
    }
    return 0;
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值