九数组分数(作业/来源:2015年蓝桥杯省赛第5题)
/*****************************************************
题目:九数组分数1,2,3...9 这九个数字组成一个分数,其值恰好为1/3,如何组法?
下面的程序实现了该功能,请填写划线部分缺失的代码。
*****************************************************/
我看到这种跟数学相关的题整个人都要晕了。
吃一堑长一智,上次那道蓝桥杯的题自我感觉很简单其实也是有很多坑
让我来瞧瞧他有什么厉害的地方 =-=
#include <stdio.h>
void test(int x[])
{
int a = x[0] * 1000 + x[1] * 100 + x[2] * 10 + x[3];
int b = x[4] * 10000 + x[5] * 1000 + x[6] * 100 + x[7] * 10 + x[8];
if (a * 3 == b)
{
printf("%d / %d\n", a, b);
}
}
void f(int x[], int k)
{
int i, t;
if (k >= 9)
{
test(x);
return;
}
for (i = k; i < 9; i++)
{
{
t = x[k];
x[k] = x[i];
x[i] = t;
}
f(x, k + 1);
________________ // 填空处
}
}
int main()
{
int x[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
f(x, 0);
return 0;
}
运行发现注释掉填空行之后,程序没有输出,所以填空处应该是对输出结果很重要的一行代码
程序用递归方法去不断地进行“123456789”的排列
※123456789 ※123456789
123456798 ※123456798
123456879 ※123456978
123456897 ※123456987
123456987 123456789
123456978 123456798
·······················································
进入新的回溯点时,应该是在原来顺序的基础上进行位置交换,然后再搜索下一个位置
如果此时在进入新的回溯点之前没有恢复原位,则是按交换位置后的字符串再进行一次位置交换,得到的结果会有重复,而且排列结果不能覆盖所有的搜索结果
因此填空处应该是填入恢复原排列顺序的代码
t=x[k],x[k]=x[i],x[i]=t;