【C语言趣味算法】

汉诺塔

汉诺塔问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从上往下按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新排在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

#include <stdio.h>

void move(char x, char y)
{
    static int cnt = 0;
    printf("%d %c => %c\n", ++cnt, x, y);
}

void hanno(int n, char a, char b, char c)
{
    if ( n == 1 )
        move(a, c);
    else {
        hanno(n-1, a, c, b);
        move(a, c);
        hanno(n-1, b, a, c);
    }
}

int main( void )
{
    hanno(3, 'A', 'B', 'C');
    return 0;
}

百鸡百钱

今有鸡翁一,值钱伍;鸡母一,值钱三;鸡鶵三,值钱一。凡百钱买鸡百只,问鸡翁、母、鶵各几何?

#include <stdio.h>

int main( void )
{
    int x;
    int y;
    int z;

    for (x=0; x<=100; x++)
    {
        for (y=0; y<=100; y++)
        {
            z = 100-x-y;
            if (z%3==0 && 5*x+3*y+z/3==100)
            {
                printf("公鸡%d,母鸡%d,小鸡%d\n",
                    x, y, z);
            }
        }
    }

    return 0;
}

常胜将军

现有21根火柴,两人轮流取,每人每次可以取走1至4根,不可多取,也不能不取,谁取最后一楰火柴谁输。请编写一个程序进行人机对弈,要求人先取,计算机后取;计算机一方为“常胜将军”

#include <stdio.h>

int main( void )
{
    int last = 21;
    int user;
    int computer;

    for ( ; ; ) {
        printf("还剩%d根火柴!\n", last);
        printf("用户取几根? ");
        scanf("%d", &user);
        if ( user<1 || user>4 || user>last)
            continue;
        printf("你取了%d根火柴!\n", user);
        last -= user;
        if ( last == 0) {
          printf("你取走了最后一支火柴,你失败!\n");
          break;
        }

        computer = 5 - user;
        printf("计算机取了%d根火柴!\n", computer);
        last -= computer;
    }

    return 0;
}

约瑟夫环

已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列

#include<stdio.h>
int main( void ) {
    int i = -1;
    int j = 0;
    int kill = 0; //跳海的人数,用于控制循环结束
    int a[8] = {1,2,3,4,5,6,7,8};

    while ( kill < 8 ) {

        //for用于找到第三个离开的人
        for (j=0; j<=2; ) {
            i = (i+1)%8; //让i在0-7之间找下一个
            if (a[i] != -1 )
                j++;
        }

        printf("%d ", a[i]);
        a[i] = -1; //离开后位置用-1表示
        kill ++; //跳海人数+1
    }
    printf("\n");

    return 0;
}

最大公约数

#include <stdio.h>

int main( void )
{
    int m;
    int n;
    int r;

    printf("求最大公约数!\n");
    printf("请输入两个数:");
    scanf("%d%d", &m, &n);

    r = m%n;
    while ( r != 0 )
    {
        m = n;
        n = r;
        r = m%n;
    }

    printf("最大公约数是%d\n", n);

    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

补漏砖匠

班德尔四缺一

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值