目录
一.问题描述
二.答题规范
三.解题思路
四.代码展示_1
五.以文件形式输入输出
六.代码展示_2
七.总结
一.问题描述
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组数据,每组数据包含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
三.解题思路
这道题什么意思呢,就是该军队的人数在10~100范围内。要是以3人一排,那么余数就是a,以5人一排,余数就是b,以7人一排,余数就是c。设有x人,那么x满足等式 x % 3 == a, x % 5 == b, x % 7 == c。在这三个等式全都满足时,就得到了x的值。
那么用代码大概怎么实现呢,可以给x从10到100循环,每次判断(用if)是否满足这三个等式。若满足,直接跳出循环。若循环完仍不满足,那么就报告无解。
四.代码展示_1
#include <stdio.h>int main ()
{ int a,b,c; int i, Kase = 0; // 计数 while(scanf("%d %d %d", &a,&b,&c) != EOF) // 输入多组数据的标志{int temp = 0; // 读入每组数前初始化 for (i = 10; i <= 100; i++){if (i % 3 == a && i % 5 == b && i % 7 == c){printf("Case %d: %d\n\n", ++Kase, i);temp = 1; // 作为找到满足条件数据的标志量 break;} }if (!temp) printf("Case %d:No answer\n\n", ++Kase); // !temp 和 temp == 0 等价 }return 0;
}
输出:
???????
但是不满足题意,没有实现输入,输出的分离。因此引出以下内容:
五.以文件形式输入输出
注意本题的要求,输入包含多组数据,每组数据都要有结果。我们自己输入,题目给的两组还行,要是有十几组呢?
其实并不需要我们手动输入。输入输出的数据如果很多,可以以文本的形式储存的,用的时候调过来就行。这样既节省了时间,也增强了程序的可读性。
六.代码展示_2
建立两个.txt文件。
input.txt用来存输入的数据(数据已填入):
output.txt用来存输出的数据(运行后数据会显示在这里):
以下是代码展示 :
#include <stdio.h>int main ()
{FILE *fin, *fout;fin = fopen("input.txt", "rb");fout = fopen("output.txt", "wb"); // 文件引入 int a,b,c; int i, Kase = 0;while(fscanf(fin,"%d%d%d", &a,&b,&c) != EOF) // 以文件结束标志输入结束 {int temp = 0; // 读入每组数前初始化 for (i = 10; i <= 100; i++){if (i % 3 == a && i % 5 == b && i % 7 == c){fprintf(fout,"Case %d: %d\n\n", ++Kase, i); // ++Kase 先给Kase+1,再代入 temp = 1; // 作为找到满足条件数据的标志量 break;} }if (!temp) fprintf(fout, "Case %d:No answer\n\n", ++Kase); // !temp 和 temp == 0 等价 }return 0;
}
运行后命令框不会显示任何内容,因为数据已经储存到了output.txt中。
??????? ??????? ??
七.总结
以文件输入输出的形式,如果大家暂时不理解也没关系,这里可以作为拓展。比如说,在刷算法题时,出现的许多检验的数字就是存储在文件中。这样的好处就是在写程序时专注于解题的思路而不是在输入输出上浪费时间。有机会我会出一篇关于文件的文章,到时候大家再回头看这篇文章就不难理解啦。