Mike 发表于 2021-7-31 14:17:39

计算组合数 汉诺塔 喵帕斯之天才算数少女 神奇的函数

计算组合数
Time Limit: 1000 ms Memory Limit: 32768 KiB
Submit Statistic
Problem Description
计算组合数。C(n,m),表示从n个数中选择m个的组合数。
计算公式如下:
若:m=0,C(n,m)=1
否则, 若 n=1,C(n,m)=1
否则,若m=n,C(n,m)=1
否则 C(n,m) = C(n-1,m-1) + C(n-1,m).
Input
第一行是正整数N,表示有N组要求的组合数。接下来N行,每行两个整数n,m (0 <= m <= n <= 20)。
Output
输出N行。每行输出一个整数表示C(n,m)。
Sample Input
3
2 1
3 2
4 0
Sample Output
2
3
1
#include<stdio.h>
#include<stdlib.h>
int f(int n,int m)
{
    if(m==0)return 1;
    else
    {
      if(n==1)return 1;
      else
      {
            if(m==n)return 1;
            else return f(n-1,m-1)+f(n-1,m);
      }
    }
}
int main()
{
    int n,t,m;
    scanf("%d",&t);
    while(t--)
    {
      scanf("%d %d",&n,&m);
      printf("%d\n",f(n,m));
    }汉诺塔
Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic
Problem Description
汉诺塔(又称河内塔)问题是印度的一个古老的传说。
开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒A、B和C,A上面套着n个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从A棒搬到C棒上,规定可利用中间的一根B棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。
僧侣们搬得汗流满面,可惜当n很大时这辈子恐怕就很搬完了。
聪明的你还有计算机帮你完成,你能写一个程序帮助僧侣们完成这辈子的夙愿吗?
Input
输入金片的个数n。这里的n<=10。
Output
输出搬动金片的全过程。格式见样例。
Sample Input
2
Sample Output
Move disk 1 from A to B
Move disk 2 from A to C
Move disk 1 from B to C
#include <stdio.h>
void mov(int n,char A,char B,char C)
{
   if(n==1)
      printf("Move disk %d from %c to %c\n",n,A,C);
   else
   {
       mov(n-1,A,C,B);
       printf("Move disk %d from %c to %c\n",n,A,C);
       mov(n-1,B,A,C);
   }
}
int main()
{
    int n;
    scanf("%d", &n);
    mov(n,'A','B','C');
    return 0;
}
汉诺塔的思路:从第三步往上,每次都需要将n-1个先用到B上,然后再把第n个移动到C上;最后把B上的n-1;个再移动到C上
莲酱要上一年级了,但是老师给他出了一个特别难的算术题。
老师给出了一个函数
F(m, n)的定义是:
若m=0,返回n+1。
若m>0且n=0,返回F(m-1,1)。
若m>0且n>0,返回F(m-1,F(m,n-1))。
给出 m 和 n,计算 F(m, n) 的值。
Input
多组输入直到EOF结束。(数据组数小于 10)
每组数据输入一行,包含两个非负整数 m,n。(0 <= m <= 3, 0 <= n <= 10)
Output
每组数据输出一行,为 F(m, n) 的答案
Sample Input
3 2
3 10
2 1
Sample Output
29
8189
5
#include<stdio.h>
#include<stdlib.h>
int F(int m,int n)
{
      if(m==0)
      return n+1;
      if(m>0&&n==0)
      return F(m-1,1);
      if(m>0&&n>0)
      return F(m-1,F(m,n-1));
}
int main()
{
    int m,n;
    while(scanf("%d %d",&m,&n)!=EOF)
    {
      printf("%d\n",F(m,n));
    }

    return 0;
}
神奇的函数
Time Limit: 1000 ms Memory Limit: 65536 KiB
Submit Statistic
Problem Description
神奇的函数是这样被定义的:
F(n, m) = {
if(n == 1 || m == 1)
F(n, m) = 1;
else
F(n, m) = F(n-1, m) + F(n, m-1);
}
Input
多组输入。
每组两个以空格分隔的整数 n, m (1 <= n, m <= 10)。
Output
对于每组数据,输出一个整数表示 F(n, m) 的值。
Sample Input
1 2
Sample Output
1
#include<stdio.h>
#include<stdlib.h>
int F(int n,int m)
{
    if(n==1||m==1)
      return 1;
    else
      return
            F(n-1,m)+F(n,m-1);
}
int main()
{

int n,m;
while(scanf("%d %d",&n,&m)!=EOF)
{
    printf("%d\n",F(n,m));
}
    return 0;
}


文档来源:51CTO技术博客https://blog.51cto.com/u_15317888/3231869
页: [1]
查看完整版本: 计算组合数 汉诺塔 喵帕斯之天才算数少女 神奇的函数