此乃华为上机题
完整题目:
第三题:等式变换
输入一个正整数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;}
第三题:等式变换 输入一个正整数X,在下面的等式左边的数字之间添加+号或者-号,使得等式成立。 1 2 3 4 5 6 7 8 9 = X
最新推荐文章于 2018-04-29 11:09:35 发布