中山大学sicily第1813题

 

下面是我写的1813题的代码,提交结果总是Wrong answer,却怎么也找不错来。请各位帮忙。

中大sicily第1813题题目在http://soj.me/show_problem.php?pid=1813&cid=

#include<iostream>
#include<string>
#include<cstring>
using namespace std;


int mi(int base,int pow);//幂函数
int ctoi(char c);
class Digit
{
public:


    Digit(int base,string s);//用已有的该进制数创建对象
    Digit(int base,int dv);//用十进制数dv创建对象
    int dv();//该进制数的十进制表示
    Digit operator/(Digit &secondDigit);
    Digit operator%(Digit &secondDigit);
    string factor;//所有系数组成的字符串
private:
    int base;//基数
    int msb;//数位数
   
};

 

Digit::Digit(int base,string s)
{
    this->base=base;
    this->msb=s.length();
    this->factor=s;

}

Digit::Digit(int base, int dv)
{

    this->base=base;
    if(dv==0)
    {
        factor="0";
        this->msb=1;
   
   
    }
    else if(dv>0)
    {
        char fa[40];
        for(msb=0;dv!=0;msb++)
        {
            int f=dv/base;
            int r=dv%base;//系数
       
            if(r>=0&&r<=9)
            {
               
                fa[msb]=r+48;
            }
            else if((r>9)&&(r<35))
            {
                fa[msb]=r+55;
            }
            else
            {
                cout<<"本程序不支持此进制数!"<<endl;
                break;
            }//1-16 Only
           
            dv=f;
        }
        for(int i=msb-1;i>=0;i--)
        {
            factor+=fa[i];
        }

    }
    else if(dv<0)
    {
        char fa[40];
        fa[0]='-';
        dv=-dv;
        for(msb=1;dv!=0;msb++)
        {
            int f=dv/base;
            int r=dv%base;
           
            if(r>=0&&r<=9)
            {
                fa[msb]=r+48;

            }
            else if((r>9)&&(r<35))
            {
                fa[msb]=r+55;
            }
            else
            {
                cout<<"本程序不支持此进制数!"<<endl;
                break;
            }
            dv=f;
        }
        for(int i=msb-1;i>0;i--)
        {
            factor+=fa[i];
        }
        factor.insert(0,1,'-');

    }

}

 

int Digit::dv()
{
    int dv=0;
    if(factor[0]=='-')
    {
        for(int i=1;i<msb;i++)
            dv+=(ctoi(factor[i]))*mi(base,(msb-i-1));//^!!!!!!!!!!
        dv=-dv;
    }
    else
    {
        for(int i=0;i<msb;i++)
            dv+=(ctoi(factor[i]))*mi(base,(msb-i-1));
    }
   

 

    return dv;

}


Digit Digit::operator/(Digit &secondDigit)
{
    int q=(dv()/secondDigit.dv());
    return Digit(base,q);
}
Digit Digit::operator%(Digit &secondDigit)
{
    int r=(dv()%secondDigit.dv());
    return Digit(base,r);
}


int ctoi(char c)
{
    int integer;
    //char array[1];
    //array[0]=c;
    if(c>47&&c<58)integer=c-48;
    else if((c>64)&&(c<91))integer=c-55;

    return (integer);
}

int mi(int base,int pow)
{
    int res=1;//result
    for ( int cnt=1; cnt<= pow; cnt++)
        res = res * base;  
   
    return res;
}

int main()
{
    int num;
    cin>>num;
    for(int i=0;i<num;i++)
    {
        int base;
        cin>>base;
        string A,B;
        cin>>A>>B;
        Digit a(base,A);
        Digit b(base,B);

        string d1=(a/b).factor;
        string d2=(a%b).factor;
        cout<<d1<<endl;
        cout<<d2<<endl;
 
    }
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值