韩信点兵

本文解析了一道经典的算法竞赛题目——韩信点兵,通过C语言实现,介绍了如何利用循环和条件判断找到满足特定余数条件下的人数最小值。输入为三组余数,输出为满足条件的最小人数或无解提示。
#include <stdio.h>
#include <math.h>
// 算法竞赛的目标是编程对任意输入均得到正确的结果。
// 请先独立完成,如果有困难可以翻阅本书代码仓库中的答案,但一定要再次独立完成。
// “抓住主要矛盾”——始终把学习、实验的焦点集中在最有趣的部分。如果直观地解决方案行得通,就不必追究其背后的原理。

/**
【题目】韩信点兵(hanxin)
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人
一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组
数据,每组数据包含3个非负整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c<
7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100。输入到文件
结束为止。
样例输入:
2 1 6
2 1 3
样例输出:
Case 1: 41
Case 2: No answer
*/


/**
【分析】定义总数n,循环处理,n>=10,n<100。只要有第一个值,就输出。
*/


int main()
{
    int n;
    int a,b,c;
    scanf("%d%d%d",&a,&b,&c);

    for (n=10;n<100;n++) {
        if ((n%3==a) && (n%5==b) && (n%7==c)) {
            printf("%d\n",n);
            break; // 跳出当前最近的循环,对你这个例子来说就是跳出for
        }
    }

    if (n==100) {
        printf("No answer\n");
    }

    return 0;
}

点评:有时候思路很重要,思路来了,代码就快了。用计算机的思维去解决问题,不是韩信的思维。

增加多组数据处理。

#include <stdio.h>
#include <math.h>
// 算法竞赛的目标是编程对任意输入均得到正确的结果。
// 请先独立完成,如果有困难可以翻阅本书代码仓库中的答案,但一定要再次独立完成。
// “抓住主要矛盾”——始终把学习、实验的焦点集中在最有趣的部分。如果直观地解决方案行得通,就不必追究其背后的原理。

/**
【题目】韩信点兵(hanxin)
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人
一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组
数据,每组数据包含3个非负整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c<
7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100。输入到文件
结束为止。
样例输入:
2 1 6
2 1 3
样例输出:
Case 1: 41
Case 2: No answer
*/


/**
【分析】定义总数n,循环处理,n>=10,n<100。只要有第一个值,就输出。
*/

int main()
{
    int n;
    int a,b,c;

    while (scanf("%d%d%d",&a,&b,&c) != EOF) { // 多组数据输入处理,Linux中,在新的一行的开头,按下Ctrl-D,就代表EOF(如果在一行的中间按下Ctrl-D,则表示输出"标准输入"的缓存区,所以这时必须按两次Ctrl-D);Windows中,Ctrl-Z表示EOF。
        for (n=10;n<100;n++) {
            if ((n%3==a) && (n%5==b) && (n%7==c)) {
                printf("%d\n",n);
                break; // 跳出当前最近的循环,对你这个例子来说就是跳出for
            }
        }

        if (n==100) {
            printf("No answer\n");
        }
    }

    return 0;
}

422101-20180309140804308-792150194.png

转载于:https://www.cnblogs.com/jiqing9006/p/8533519.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值