飞行的猪哼哼

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

计算组合数

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;
}
posted on 2018-09-08 10:10  飞行的猪哼哼  阅读(42)  评论(0)    收藏  举报