郭炜-C语言程序设计-程序设计与算法(一)-第四周

第四周

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值