九数组分数
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;
}
拿到这道题后,我首先的是分析程序的执行过程
在第一个函数的test中是对分子和分母是否满足关系的验证
在函数 f()中if判断语句也是对函数的验证 以及关注对于局部变量的定义,我发现 i 是用作循环的实体,而 t 是在交换数中产生一个中间变量,接着又是一个递归调用 f(x,k+1)。由于前期 k的值始终没有大于等于9,所以不执行,而对于大于9的不满足条件的直接return 出去,由于始终是递归调用,我们采用调试,分别在参数改变的地方加入断点,观察当大于9之后,会开始减小,也就是退栈(数据结构中的栈),并且控制没有满足的数值输出
数值再次减小但是之前每次在 t 交换的参数的变量并不属于之前的变量的值,所以我们应该将之前的值再次恢复,即再次swap(x[i],x[k]),此时Debug发现控制台由数值输出,表示我们成功
答案
填空处填写 t = x[i]; x[i] = x[k]; x[k] = t;
5832 / 17496
5823 / 17469
5823 / 17469
总结:
首先对于我们知道其工作意图的代码片段,拿到程序后我们首先分析每段代码的不同意义,以及所起的作用
再观察定义的变量所起的范围,在进栈和退栈时保证参数的不改变才能保证之后每一次的正常运行