首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

一路考研题,求大神指教

2013-12-29 
一道考研题,求大神指教请指教这两题的区别,以及思路。[解决办法]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,得到的结果和人工分析的结果是一样的

热点排行