第八天学习精要
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;
}