一路考研题,求大神指教
一道考研题,求大神指教


请指教这两题的区别,以及思路。
------解决方案--------------------
m=24 n=4 s=4
m=24+4/2=26/2=13 n=13 s=13-1=12 k=75 rt 26+75=101
m=13+13/2=19/2=9 n=9+3=12 s=null k=56 rt 19+56=75
m=9+12/2=15/2=7 n=7+3=10 s=null k=41 rt 15+41=56
m=7+10/2=12/2=6 n=6 s=6-1=5 k=29 rt 12+29=41
m=6+6/2=9/2=4 n=4+3=7 s=null k=20 rt 9+20=29
m=4+7/2=7/2=3 n=3+3=6 s=null k=13 rt 7+13=20
m=3+6/2=6/2=3 n=3 s=3-1=2 k=7 rt 6+7=13
m=3+3/2=4/2=2 n=2 s=2-1=1 k=3 rt 4+3=7
m=2+2/2=3 rt 3;
所以最后打印
/*k*/ 3 7 13 20 29 41 56 75 /*s*/ 1 2 5 12 4
------解决方案--------------------
第一个程序执行
m=30 n=4 初值
1. n=4 m=30+4/2=32
n=16
2.
n=15 m=16+15/2=23
n=11
3.
n=15 m=11+15/2=18
n=9
4.
n=15 m=9+15/2=16
n=8
5.
n=7 m=9+17/2=11
n=5
6.
n=7 m=5+7/2=8
n=4
7.
n=3 m=4+3/2=5
n=2
8.
n=3 m=2+3/2=3返回
打印:
3 5 8 11 16 18 23(m)
3 7 15 4在Findout中打印(栈里的内容)
------解决方案--------------------
这是第二题的,第一题逻辑和第二题是不一样的,但我没看出啥技巧,只能你看懂代码后死算。附上的程序是我的测试程序,我用了预编译头,所以你要自己加上头文件。已经编译并运行过了,用得vs2012,得到的结果和人工分析的结果是一样的
请指教这两题的区别,以及思路。
------解决方案--------------------
m=24 n=4 s=4
m=24+4/2=26/2=13 n=13 s=13-1=12 k=75 rt 26+75=101
m=13+13/2=19/2=9 n=9+3=12 s=null k=56 rt 19+56=75
m=9+12/2=15/2=7 n=7+3=10 s=null k=41 rt 15+41=56
m=7+10/2=12/2=6 n=6 s=6-1=5 k=29 rt 12+29=41
m=6+6/2=9/2=4 n=4+3=7 s=null k=20 rt 9+20=29
m=4+7/2=7/2=3 n=3+3=6 s=null k=13 rt 7+13=20
m=3+6/2=6/2=3 n=3 s=3-1=2 k=7 rt 6+7=13
m=3+3/2=4/2=2 n=2 s=2-1=1 k=3 rt 4+3=7
m=2+2/2=3 rt 3;
所以最后打印
/*k*/ 3 7 13 20 29 41 56 75 /*s*/ 1 2 5 12 4
using namespace std;
queue<int> Q;
stack<int> S;
int finding(int n);
void findout(int m, int n)
{
Q.push(m);
S.push(n);
finding(n);
while (!S.empty())
{
int tmp = S.top();
S.pop();
cout << tmp << endl;
}
}
int finding(int n)
{
int m, k;
m = Q.back() + n/2;
Q.pop();
if (m > 3)
{
n = m/2;
Q.push(n);
if ((n << 1) == m)
{
S.push(n-1);
k = finding(n);
}
else
{
k = finding(n+3);
}
}
else
{
return m;
}
cout << k << " ";
return m + k;
}
int main()
{
findout(24,4);
return 0;
}
------解决方案--------------------
第一个程序执行
m=30 n=4 初值
1. n=4 m=30+4/2=32
n=16
2.
n=15 m=16+15/2=23
n=11
3.
n=15 m=11+15/2=18
n=9
4.
n=15 m=9+15/2=16
n=8
5.
n=7 m=9+17/2=11
n=5
6.
n=7 m=5+7/2=8
n=4
7.
n=3 m=4+3/2=5
n=2
8.
n=3 m=2+3/2=3返回
打印:
3 5 8 11 16 18 23(m)
3 7 15 4在Findout中打印(栈里的内容)
------解决方案--------------------
这是第二题的,第一题逻辑和第二题是不一样的,但我没看出啥技巧,只能你看懂代码后死算。附上的程序是我的测试程序,我用了预编译头,所以你要自己加上头文件。已经编译并运行过了,用得vs2012,得到的结果和人工分析的结果是一样的