求解一道C语言基础编程题。
有3堆火柴共48根,现在做如下操作:从第1堆火柴中拿出和第2堆相同的火柴并入第2堆,再从第2堆中拿出与第3堆相同的火柴数并入第3堆,最后从第3堆拿出与现在第1堆相同的火柴...
有3堆火柴共48根,现在做如下操作:从第1堆火柴中拿出和第2堆相同的火柴并入第2堆,再从第2堆中拿出与第3堆相同的火柴数并入第3堆,最后从第3堆拿出与现在第1堆相同的火柴数并入第1堆。经过这样的操作后,现在这样的3堆都是16根,问开始操作之前的3堆火柴分别是几根?
展开
2个回答
展开全部
#include <stdio.h>
void GetNums(const int n[3], int res[3]) {
if (NULL == n || NULL == res) {
return;
}
memmove(res, n, sizeof(int) * 3);
#define BACK_MOVE(src, dst) (src) += (dst >>= 1);
BACK_MOVE(res[2], res[0]);
BACK_MOVE(res[1], res[2]);
BACK_MOVE(res[0], res[1]);
#undef BACK_MOVE
}
int main(int argc, const char* const argv[]) {
int n[3] = { 16, 16, 16 };
GetNums(n, n);
for (int i = 0; i < 3; i++) {
printf("%d ", n[i]);
}
printf("\n");
return 0;
}
void GetNums(const int n[3], int res[3]) {
if (NULL == n || NULL == res) {
return;
}
memmove(res, n, sizeof(int) * 3);
#define BACK_MOVE(src, dst) (src) += (dst >>= 1);
BACK_MOVE(res[2], res[0]);
BACK_MOVE(res[1], res[2]);
BACK_MOVE(res[0], res[1]);
#undef BACK_MOVE
}
int main(int argc, const char* const argv[]) {
int n[3] = { 16, 16, 16 };
GetNums(n, n);
for (int i = 0; i < 3; i++) {
printf("%d ", n[i]);
}
printf("\n");
return 0;
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询