(代码非原创)
解题思路:
对于1、2、3、4、5、6、7、8、9这9个数字,获取所有可能的排列组合,每得到一种组合便对当前字符串进行拆分,拆分成3个部分:整数部分;分数分子;分数分母。不难想到,整数部分的位数可以为0、1、2、3、4、5、6、7,分子和分母的位数则都是1~7,而且当整数部分获得前i个数字后,分子则获得从i到j之间的字符串,分母则获得j之后的字符串。因此i、j相当于2个断点,对字符串进行了分割。范围分别是(0, i)、(i, j)、(j, strlen()+1),这个范围可以根据substr()函数参数的特点来理解。
值得学习的地方
next_permutation()函数:可以是对字符串使用,也可以是对数组使用。传入参数为(字符串首地址, 字符串最后一个有效元素的后一个位置地址),当然对于数组也类似。常常和do while 循环连用,如果存在下一个排列组合则返回true,否则返回false
atoi将一个数字字符组成的字符串转换成int值
string类的某个对象调用 .c_str()成员函数则将string类型字符串转化成char[]类型字符串
参考代码:
#includeusing namespace std; int main() { int n; int count = 0; string s = "123456789"; cin >> n; do { for(int i = 0; i = n) break; for(int j = 1; j <= 9-i-1; j++) { string b = s.substr(i, j); string c = s.substr(i+j, 9); int intb = atoi(b.c_str()); int intc = atoi(c.c_str()); if(inta + intb/intc == n && intb % intc == 0) count++; } } } while(next_permutation(s.begin(), s.end())); cout << count << endl; }
0.0分
1 人评分