韩信点兵
#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;
}