第八天学习精要

break语句和continue语句


break语句

  • 可以出现在循环体中(for、 while、 do…while循环均可),其作用是跳出循环。

  • 在多重循环的情况下,break语句只能跳出直接包含它的那一重循环

  • 例题:如果两个不同的正整数,他们的和是他们的积的因子,就称这两个数为兄弟数,小的称为弟数,大的称为兄数。先后输入正整数n和m(n < m),请在n至m这m-n+1个数中,找出一对兄弟数。如果找不到,就输出“NoSolution.”。如果能找到,就找出和最小的那一对;如果有多对兄弟数和相同且都是最小,就找出弟数最小的那一对。

    • 思路:枚举每一对不同的数,看看是不是兄弟数。用两个变量记录当前已经找到的最佳兄弟数,如果发现更佳的,就重新记录。
# include <iostream>
using namespace std;
int main()
{
	int n, m;
	cin >> n >> m;
	if (n >= m)
		cout << "输入不合法" << endl;
	// a,b记录已经找到的最佳兄弟数,a是弟数,b是兄数
	int a = m + 1, b = m + 1;
	for (int i = n; i < m; ++i)	// 取弟数,共m-n种取法
	{
		if (i > (a + b) / 2 + 1)
		{
			break;	// 跳出外重循环
		}
		for (int j = i + 1; j <= m; ++j)	// 取兄数
		{
			if ((i + j) > (a + b))
			{
				break;	// 跳出内重循环
			}
			if ((i * j) % (i + j) == 0)	// 发现兄弟数
			{
				if ((i + j) < (a + b))	// 发现和更小的兄弟数
				{
					a = i;	// 更新已找到的最佳兄弟数
					b = j;
				}
				else if((i + j) == (a + b) && i < a)	// 发现和相同但弟数更小的兄弟数
				{
					a = i;	// 更新已找到的最佳兄弟数
					b = j;
				}
			}
		}
	}
	if (a == m + 1)	// 没找到兄弟数
	{
		cout << "No solution.";
	}
	else
	{
		cout << a << "," << b;
	}
	return 0;
}

continue语句

  • 可以出现在循环体中(for、 while、 do…while循环均可),其作用是立即结束本次循环,并回到循环开头判断是否要进行下一次循环。

  • 在多重循环的情况下,continue只对直接包含它的那重循环起作用

OJ编程题输入数据的处理


scanf表达式的值

  • scanf(…)表达式的值为int,表示成功读入的变量个数。
int n, m;
printf("%d", scanf("%d%d", &n, &m));
  • scanf(…) 值为EOF(即-1)则说明输入数据已经结束。
/*  Windows系统下,不停输入两个整数再敲回车,则不停输出它们的和,
直到输入 Ctrl+Z 然后 回车, 程序结束。*/
int n,m;
while(scanf("%d%d",&n,&m) != EOF) { //EOF是直接能拿来用的符号常量
printf("%d",n+m);
}

cin表达式的值

  • cin >> m >> n … 表达式的值,在成功读入所有变量时为true,否则为false
/* 不停输入两个整数再敲回车,则不停输出它们的和,
直到输入Ctrl+Z 然后回车,程序结束。 */
int n,m;
while(cin >> n >> m ) {
printf("%d",n+m);
}
  • 处理无结束标记的OJ题目输入
    • 输入若干个(不知道多少个)正整数,输出其中的最大值
    • Sample Input:2 3 4 5 6 787 54532 12
    • Sample Output:54532
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
	int n, mx = 0;
	while( cin >> n) 	// 也可以用while(scanf("%d", &n) != EOF)
	{
		if( n > mx )
			mx = n;
	}
	printf("%d",mx);
	return 0;
}
10-06 13:03