※ 引述《lensfill (undo)》之铭言:
: 输入一个数字
: 解一个答案
: https://photos.app.goo.gl/rhQLYra1P2QJR6h8A
: 要怎样思维关键在哪?
第一题的程式码如下:
#include <stdio.h>
int bar(int value){
static int tmp=0;
tmp++;
value++;
return value + tmp;}
int main(void) {
int x=5;
printf("%d\n",bar(x));
printf("%d\n",bar(bar(x)));
}
说明:
bar 副程式的 tmp 为 static 型态,
也就是说 tmp 这一个变量要等程式结束后才会归还内存。
printf("%d\n",bar(x)); ←印出7,说明如下
int bar(int value){ ←这里的value带入5
static int tmp=0;
tmp++; ←此时这里的tmp是1 (后++)
value++; ←value是6
return value + tmp;←传回7}
printf("%d\n",bar(bar(x)));←印出12,说明如下
先解内部的bar(x)
int bar(int value){ ←这里的value带入5
static int tmp=0; ←这里的tmp是1
tmp++; ←此时这里的tmp是2 (后++)
value++; ←value是6
return value + tmp;← 6+2 = 8 ,传回8}
再算外部的bar(bar(x)),内部的bar(x)是8,
因此bar(bar(x))等同bar(8),
int bar(int value){ ←这里的value带入8
static int tmp=0; ←这里的tmp是2
tmp++; ←此时这里的tmp是3 (后++)
value++; ←value是9
return value + tmp;← 9+3=12, 传回12}
第二题的程式码如下:
(键盘输入100)
#include <stdio.h>
int foo(int v)
{return (v/10+v%10);}
int main(void) {
int v1,v2;
scanf("%d",&v1);
v2=foo(foo(foo(v1)));
printf("%d\n",v2);
}
这一题的思维跟上一题一样,
v2=foo(foo(foo(v1)));
printf("%d\n",v2);←印出 1 ,理由如下
先拆解,先解最内层的foo(v1),
最内层解完后再代入第二层的foo(),
第二层解完后再代入最外层的foo(),
最内层的foo(v1)
int foo(int v)←v代入100
{return (v/10+v%10);} ← 10+0 = 10,传回 10
第二层的foo(10) ←将内部层的结果代入第二层
int foo(int v)←带入10
{return (v/10+v%10);} ← 1+0 = 1,传回 1
最外层的foo(1) ←将第二层的结果代入最外层
int foo(int v)←带入1
{return (v/10+v%10);} ← 0+1 = 1,传回 1
结论,只要拆开分析计算就很快解决了...
以上如果说明有误,烦请各位先进留言补充,谢谢。