第四周
1.循环结构之break语句
- 可以出现在循环体中(for、while、do…while循环均可),其作用是跳出循环。
- 在多重循环的情况下,break语句只能跳出直接包含它的那一重循环。
2.循环结构之continue语句
- 可以出现在循环体中(for、while、do…while循环均可), 其作用是立即结束本次循环,并回到循环开头判断是否要进行下一次循环。
- 在多重循环的情况下,continue只对直接包含它的那重循环起作用。
3.OJ数据处理
1.scanf表达式的值
- scanf(…)表达式的值为int,表示成功读入的变量个数。
- scanf(…) 值为EOF(即-1)则说明输入数据已经结束。
2.cin表达式的值
- cin >> m >> n … 表达式的值,在成功读入
所有变量时为true,否则为false。
Windows系统下,直接输入 Ctrl+Z 然后 回车,程序结束。
3.处理无结束标记OJ题目输入
1.scanf操作
int n,m;
printf("%d",scanf("%d%d",&n,&m));
//返回值为读入的整数变量个数
int n,m;
//EOF即-1
while(scanf("%d%d",&n,&m)!=EOF){
printf("%d",n+m);
}
//等价于
int n,m;
while(scanf("%d%d",&n,&m) == 2) {
printf("%d",n+m);
}
2.cin操作
//等价于
int n,m;
while(cin >> n >> m ) {
printf("%d",n+m);
}
3.综合实例
输入若干个(不知道多少个)整数,输出其中的最大值。
#include<iostream>
using namespace std;
int main(){
int MAX,a;
cin>>MAX;
while(cin>>a){
if(a>MAX) MAX=a;
}
cout<<MAX;
}
4.经典例题选讲
1.break兄弟数
例题:如果两个不同的正整数,他们的和是他们的积的因子,就称这两个数为兄弟数,小的称为弟数,大的称为兄数。先后输入正整数n和m(n < m) , 请在n至m这m-n+1个数中,找出一对兄弟数。如果找不到,就输出“No Solution.”。如果能找到,就找出和最小的那一对;如果有多对兄弟数和相同且都是最小,就找出弟数最小的那一对。
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
int didi=m+1,gege=m+1;
for(int i=n;i<m;i++){//外循环,更新弟数
if(i>(didi+gege)/2+1) break;/*弟数已经大于找到兄弟数一半,那么兄数也必然大于找到兄弟数的一半,所以没有必要再找下去。跳出外循环!*/
for(int j=i+1;j<=m;j++){//内循环,更新兄数
if(i+j>didi+gege) break;/*其和大于找到的兄弟数,已经没有必要确认其是否是新的兄弟数,因为要的是最小兄弟数。跳出内循环!*/
if(i*j%(i+j)==0){
if(i+j<didi+gege){
didi=i;
gege=j;
}
else if(i+j==didi+gege&&i<didi){
didi=i;
gege=j;
}
}
}
}
if(didi==m+1) cout<<"No Solution."
else cout<<didi<<" "<<gege;
return 0;
}
思路:枚举每一对不同的数,看看是不是兄弟数。用两个变量记录当前已经找到的最佳兄弟数,如果发现更佳的,就重新记录。
反思:break其实去掉也没有什么问题,它主要作用是,提高程序效率,节省时间。
2.continue 10以内偶数
#include<iostream>
using namespace std;
int main(){
for(int i=1;i<=10;i++){
if(i%2)
continue;
cout<<i<<" ";
}
return 0;
}
3.乘方计算
给出一个整数a和一个正整数n,求乘方an 。
#include<iostream>
using namespace std;
int main(){
int a,n;
int result=1;
cin>>a>>n;
for(int i=1;i<=n;i++){
result*=a;
}
cout<<result;
}
4.输入若干个整数求最大值
思路:由特殊到一般。
5. 输入至少2个整数,求最大值和第二大值
#include<iostream>
using namespace std;
int main(){
int n,MAX1,MAX2,num=0;
while(cin>>n){
num+=1;
if(num==1) MAX1=n;
else if(num==2){
if(n>MAX1){
MAX2=MAX1;
MAX1=n;
}
else MAX2=n;
}else{
if(n>MAX1){
MAX2=MAX1;
MAX1=n;
}
if(n>MAX2){
MAX2=n;
}
}
}
cout<<MAX1<<" "<<MAX2;
return 0;
}
从一般到特殊,从特殊到一般。
6.斐波那契数列
#include<iostream>
using namespace std;
int main(){
int a=1,b=1,k,sum;
cin>>k;
if(k<3) cout<<1;
for(int i=3;i<=k;i++){
sum=a+b;
a=b;
b=sum;
}
cout<<sum;
retun 0;
}
7.求阶乘的和
给定正整数n,求不大于n的正整数的阶乘的和(即求1!+2!+3!+…+n!)
#include<iostream>
using namespace std;
int main(){
int n,sum=1,result=0;
cin>>n;
for(int i=1;i<=n;i++){
sum*=i;
result+=sum;
}
cout<<result;
return 0;
}
8. 输入正整数n(n>=2),求不大于n的全部质数
//原解
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
for(int i=2;i<=n,i++){
for(int j=2;j<i,j++){
if(i%j==0) break;
}
if(j==i) cout<<i<<endl;
}
return 0;
}
//此解法做了没必要的尝试, k 大于 i的平方根后就不必再试
//改进
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
cout << 2 << endl;
for(int i = 3; i <= n; i+=2) { //每次判断i是否是质数
int k;
for(k = 3; k < i; k+=2) {
if( i % k == 0)
break;
if( k*k > i)
break;
}
if( k*k > i) cout << i << endl;
}
return 0;
}