第三题:等式变换 输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。 1 2 3 4 5 6 7 8 9 = X

此乃华为上机题

完整题目:

第三题:等式变换
输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。1 2 3 4 5 6 7 8 9 = X比如:12-34+5-67+89 = 51+23+4-5+6-7-8-9 = 5请编写程序,统计满足输入整数的所有整数个数。输入:       正整数,等式右边的数字输出:       使该等式成立的个数样例输入:5

样例输出:21


代码行数较多,但思路清晰。即采用递归处理,分‘+’‘-’和无操作三种情况,从9到1进行递归计算。

正确性在vs2010上测试过,由于没有其他测试数据,所以只测试了输入为5的情况。

#include <stdio.h>#include <iostream>using namespace std;int n,count=0;struct  information{    int total;    int to_number;    float continuous_number;};
void distract(information info){    //the situation of end    information info_temp=info;    if(info.to_number==1)    {        if(info_temp.continuous_number>1)//if there are continuious number        {            for(int i=0;i<info.continuous_number;i++)                     info.total+=(info.to_number+i)*pow(10,info.continuous_number-i-1);          }         else        {            info.total++;        }        if(info.total==n)            count++;        return;    }
    //the situation of add     info_temp=info;    if(info_temp.continuous_number>1)//if there are continuious number    {        for(int i=0;i<info_temp.continuous_number;i++)        {            info_temp.total+=(info_temp.to_number+i)*pow(10,info_temp.continuous_number-i-1);        }
    }    else    {        info_temp.total+=info_temp.to_number;    }    info_temp.to_number--;    info_temp.continuous_number=1;    distract(info_temp);    
    //the situation of subract    info_temp=info;    if(info_temp.continuous_number>1)//if there are continuious number    {        for(int i=0;i<info_temp.continuous_number;i++)        {            info_temp.total-=(info_temp.to_number+i)*pow(10,info_temp.continuous_number-i-1);        }
    }    else    {        info_temp.total-=info_temp.to_number;    }    info_temp.to_number--;    info_temp.continuous_number=1;    distract(info_temp);

    //the situation of no operator     info_temp=info;    info_temp.to_number--;    info_temp.continuous_number++;    distract(info_temp);

}
int main(){    information a={0,9,1};    cin>>n;    distract(a);    cout<<count<<endl;}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值