任何基地转换为任何基地(2-16)出错

时间:2015-11-26 20:21:32

标签: c++

将数字从任何基数转换为任何其他基数: UVA 355

我分两部分完成:首先转换十进制数,然后将十进制数转换为所需的基数。 但是在下面的代码中,在第1部分中,有时答案是错误的,例如总和小于代码中的实数总和。

#include<stdio.h>
#include<iostream>
using namespace std;
#include<stdlib.h>
#include<math.h>

int check(long long int f[],long long int b,long long int l);


int main()
{
    while(1)
    {
       long long int i,j,k,l,b1,b2,n,m,f[20],x=0,f1[20],sum=0,ans[20];
       char a[20];

    cin>>b1>>b2;
    if(b1<10) //int input
    {
        cin>>n;
        m=n;
        i=0;
        while(m!=0)
        {
            f1[i]=m%10;
            m=m/10;
            i++;
        }
        i--;
        k=i;
        for(j=0;k>=0;k--,j++)
        {
            f[j]=f1[k];
        }
    //check
        long long int chk;
        chk=check(f,b1,i);
        if(chk==1)
            {
                printf("%lld is an illegal base %lld number\n",n,b1);
                x=1;
            }
    }
    else
    {
        cin>>a; //char input

        for(i=0;a[i]!='\0';i++)
        {
            if(a[i]=='A')
                f[i]=10;
            else if(a[i]=='B')
                f[i]=11;
            else if(a[i]=='C')
                f[i]=12;
            else if(a[i]=='D')
                f[i]=13;
            else if(a[i]=='E')
                f[i]=14;
            else if(a[i]=='F')
                f[i]=15;
            else
                f[i]=a[i]-'0';

        }
        i--;
//check
        long long int chk;
        chk=check(f,b1,i);
        if(chk==1)
            {
                printf("%s is an illegal base %lld number\n",a,b1);
                x=1;
            }
    }
    //convert to dec

if(x==0)
{

 for(k=i,j=0;k>=0;j++,k--)
 {
     sum=sum+(f[j]*pow(b1,k)); //shows sum=sum-1 sometimes
 }

}
//convert dec to desired base

j=0;
while(sum!=0)
{
    ans[j]=sum%b2;

    sum=sum/b2;
    j++;

}
j--;
char c[20]={};
for(k=0;j>=0;j--,k++)
{
    if(ans[j]==10)
        c[k]='A';
    else if(ans[j]==11)
        c[k]='B';
    else if(ans[j]==12)
        c[k]='C';
        else if(ans[j]==13)
        c[k]='D';
        else if(ans[j]==14)
        c[k]='E';
        else if(ans[j]==15)
        c[k]='F';
        else
        c[k]=ans[j]+'0';
}
cout<<c;
}

    return 0;
}


 //check validity
int check(long long int f[],long long int b,long long int l)
{
     int chk=0,j;
    for(j=0;j<=l;j++)
    {
        if(f[j]>=b)
            chk=1;

    }
    return chk;
}

输入样式:(given_base)(desired_base)(数字).....

ex:  in: 10 10 100
output 99 (should be 100)

来自UVA网站:

  

示例输入

2 10 10101
5 3 126
15 11 A4C
     

示例输出

10101 base 2 = 21 base 10 
126 is an illegal base 5 number 
A4C base 15 = 1821 base 11

1 个答案:

答案 0 :(得分:2)

运行代码时,一切都很好。但如果你遇到任何问题,那应该是因为内置的pow功能。你必须编写自己的pow函数,或者你可以使用power函数的值。

我一直在使用这个功能:

long long POW(long long b, long long p)
{
     if(p == 0LL)
         return 1LL;
     long long t = POW(b, p >> 1);
         return p & 1LL ? t * t * b : t * t;
}