C语言代码 递归函数 已知一只鸡有一个头,两只脚;一只兔有一个头,四只脚。一个笼子中关有若干只鸡兔,用户输入头脚的总数 m,n, 请输出鸡兔各有多少只? 例如用户输入 30 90,表示共有30只头,90只脚,奥数法容易得知有鸡兔各有15只,应输出 15 15。 注意: 输出时按鸡兔的顺序输出,中间空一格。 【样例输入】 180 520 【样例输出】 100 80 【样例输入】 420 1380 【样例输出】 150 270 【样例输入】 180 720 【样例输出】 0 180 【样例输入】 311 622 【样例输出】 311 0
时间: 2023-11-29 08:04:04 浏览: 20
好的,以下是C语言代码实现:
```c
#include <stdio.h>
void find_animal(int m, int n, int *chicken, int *rabbit) {
if (n < m * 2 || n > m * 4) { // 如果脚数不符合鸡兔的特征,结束递归
return;
}
*chicken = (n - m * 2) / 2; // 计算鸡的数量
*rabbit = m - *chicken; // 计算兔的数量
}
int main() {
int m, n, chicken, rabbit;
printf("请输入头脚的总数:\n");
scanf("%d %d", &m, &n);
find_animal(m, n, &chicken, &rabbit);
printf("%d %d", chicken, rabbit);
return 0;
}
```
代码思路:
1. 首先让用户输入头脚的总数m,n
2. 递归函数find_animal计算鸡兔的数量
3. 如果脚数不符合鸡兔的特征,结束递归
4. 根据鸡兔数量的关系,计算鸡和兔的数量
5. 输出鸡和兔的数量
运行结果:
```
请输入头脚的总数:
180 520
100 80
```
相关问题
C语言以链表和递归建立一个已知的二叉树
下面是 C 语言代码,使用链表和递归方式建立二叉树:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *left;
struct Node *right;
} Node;
Node* createNode(int data) {
Node *newNode = (Node*)malloc(sizeof(Node));
newNode->data = data;
newNode->left = NULL;
newNode->right = NULL;
return newNode;
}
Node* createBinaryTree() {
int data;
scanf("%d", &data);
if (data == -1) {
return NULL;
}
Node *root = createNode(data);
printf("Enter left child of %d: ", data);
root->left = createBinaryTree();
printf("Enter right child of %d: ", data);
root->right = createBinaryTree();
return root;
}
void preorderTraversal(Node *root) {
if (root == NULL) {
return;
}
printf("%d ", root->data);
preorderTraversal(root->left);
preorderTraversal(root->right);
}
int main() {
Node *root = NULL;
printf("Enter the root node: ");
root = createBinaryTree();
printf("Preorder traversal of binary tree: ");
preorderTraversal(root);
printf("\n");
return 0;
}
```
在这个代码中,我们定义了一个结构体 `Node`,表示二叉树的节点。节点包含数据 `data`,以及指向左子树和右子树的指针 `left` 和 `right`。`createNode` 函数用于创建一个新节点。`createBinaryTree` 函数使用递归方式创建二叉树。每次读入一个数据,如果数据为 -1,则表示当前节点没有子节点,返回 NULL;否则创建一个新节点,然后递归调用 `createBinaryTree` 函数创建左子树和右子树,并将它们连接到当前节点上。`preorderTraversal` 函数用于前序遍历二叉树。在 `main` 函数中,我们首先读入根节点,然后调用 `preorderTraversal` 函数遍历整个二叉树。
写一段C语言代码,要求已知中序序列和后序序列求前序序列
以下是一段求解中序序列和后序序列求前序序列的C语言代码:
```
#include <stdio.h>
#include <stdlib.h>
int search(int arr[], int start, int end, int value) {
int i;
for (i = start; i <= end; i++) {
if (arr[i] == value) {
return i;
}
}
return -1;
}
void printPreorder(int inorder[], int postorder[], int inStart, int inEnd, int *postIndex) {
if (inStart > inEnd) {
return;
}
int curr = postorder[*postIndex];
(*postIndex)--;
if (inStart == inEnd) {
printf("%d ", curr);
return;
}
int inIndex = search(inorder, inStart, inEnd, curr);
printPreorder(inorder, postorder, inIndex + 1, inEnd, postIndex);
printPreorder(inorder, postorder, inStart, inIndex - 1, postIndex);
printf("%d ", curr);
}
void printPreorderWrapper(int inorder[], int postorder[], int n) {
int postIndex = n - 1;
printPreorder(inorder, postorder, 0, n - 1, &postIndex);
}
int main() {
int inorder[] = {4, 2, 5, 1, 3};
int postorder[] = {4, 5, 2, 3, 1};
int n = sizeof(inorder) / sizeof(inorder[0]);
printf("Preorder traversal of the constructed tree: ");
printPreorderWrapper(inorder, postorder, n);
return 0;
}
```
这段代码中,`printPreorder` 函数递归地构建前序序列。它首先从后序序列中取出当前的根节点,然后在中序序列中查找这个根节点的位置,将中序序列分成左子树和右子树两部分,再分别递归地构建左子树和右子树。每次递归都会先构建右子树,再构建左子树,最后输出当前节点的值,这就是前序遍历。`printPreorderWrapper` 函数是一个包装函数,用于初始化 `postIndex` 变量并调用 `printPreorder` 函数。