问题标题: 酷町堂:2183 数的2的表示法

0
0

0
已采纳
张睿杰
张睿杰
初级天翼
初级天翼

此题不想多讲,核心代码

void digui(int n)
{
    int y;
    if(n==0) return;
    for(int i=0;i<=15;i++)
    {
        y=i;
        if(cf(2,i)>n)
        {
            y--;
            break;
        }
    }
    if(y==0) cout<<"2(0)";
    if(y==1) cout<<"2";
    if(y>1)
    {
        cout<<"2(";
        digui(y);
        cout<<")";
    }
    if(n!=cf(2,y))
    {
        cout<<"+";
        digui(n-cf(2,y));
    } 
} 

剩下不会我用QQ发给你

0
0
0
张舒斌
张舒斌
中级光能
中级光能
void f(int n)
{
    int y;
    for(int i=0;i<18;i++)//这一题要看准数据范围,n最大20000,而20000大概是2的15次方。保险起见,大一点。用y记录2的几次方。
    {
        y=i;
        if(n<pow(2,i))//如果n小于2的i次方,则n里面就一定有2的i-1次方。当然,y存储的是第一次的i-1的数据
        {
            y--;
            break;//所以break
        }
    }
    if(y==0) cout<<"2(0)";//如果y=0,根据题目意思,输出2(0)
    if(y==1) cout<<"2";//如果y=1,根据题意,输出2
    if(y>1)//如果y>1,则y可以再次进行分解
    {
        cout<<"2(";//先输出一半
        f(y);//递归,对y进行再次分解
        cout<<")";//输出另一半
    }
    if(n!=pow(2,y))//因为n不一定是2的次方数,所以还要考虑剩下一点的情况
    {
        cout<<"+";//输出加号
        f(n-pow(2,y));//递归,对n-pow(2,y),也就是还剩下一点进行分解
    }
}

如:

1025=2(10)+2(0)

=2(2(3)+2)+2(0)

=2(2(2+2(0))+2)+2(0)

我要回答