一路考研题,求大神指教
一道考研题,求大神指教请指教这两题的区别,以及思路。[解决办法]m24 n4 s4m24+4/226/213 n13 s13-1
一道考研题,求大神指教 请指教这两题的区别,以及思路。 [解决办法] 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中打印(栈里的内容)
[解决办法] 引用: 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; } 这是第二题的,第一题逻辑和第二题是不一样的,但我没看出啥技巧,只能你看懂代码后死算。附上的程序是我的测试程序,我用了预编译头,所以你要自己加上头文件。已经编译并运行过了,用得vs2012,得到的结果和人工分析的结果是一样的