【学习笔记】算法竞赛:chapter 2 循环结构程序设计

对于大部分人来说这部分都不陌生,我也就不再赘述,只写出一些本书中提到的编写循环结构程序时的需要注意的地方。

1、for循环的格式为:for( 初始化;条件;调整 )    循环体;

2、尽管for循环反复执行相同的语句,但这些语句每次的执行效果往往不同。

3、编写程序时,要特别留意“当前行”的跳转和变量的改变。

4、不拘一格的使用伪代码来思考和描述算法是一种值得推荐的做法。

5、把伪代码改成代码时,一般先选择较为容易的任务来完成。

6、浮点运算可能存在误差。在进行浮点数比较时,应考虑到浮点误差。

7、while循环的格式为“while( 条件 ) 循环体 ;  ”

8、当需要统计某件事物的个数时,可以用一个变量来充当计数器。

9、不要忘记测试。一个看上去正确的程序可能隐含错误。

寻找错误的方法:

(1)利用IDE设置断点,跟踪调试,单步执行

(2)输出中间结果                            

10、在循环体开始处定义的变量,每次执行循环体时会重新声明并初始化。

11、要计算只含有加法、减法和乘法的整数表达式除以正整数n的余数,可以在每步计算之前对n取余,结果不变。

12、可以使用<ctime>和clock()函数获得程序运行时间。常数CLOCK_PER_SEC和操作系统相关;不要直接使用clock()的返回值,而应总是除以CLOCK_PER_SEC之后得到的值为以“秒”为单位。

13、很多程序的运行时间与规模n存在着近似的简单关系。可以通过计时函数来发现或验证这一关系。

计时函数:c/c++中的<time.h>中的clock();


14、对于输入参数不确定个数的情况:

while( scanf ( " %d ", &x ) == 1 )

//当输入结束时,scanf无法再次读取x,将返回0

{

  循环体;

  }

while( scanf("%d %d", &a , &b) ==2

{

   循环体;

}

while( cin>> a>> b 

{

循环体;

}

15、变量在未赋值之前的值是不确定的。特别的,它不一定等于0。

16、int类型是32位整数,long long类型是64位整数。

long long 输出形式:%I64d(gcc) ;%lld (vs2010)

#include <cstdio>
#include <iostream>
using namespace std;
int main(){
    long long s;
    cin>>s;
    <strong><span style="color:#6600cc;">printf("%I64d",s);</span></strong>
	return 0;
}

17、 要在C++程序中使用c语言头文件,请去掉拓展名.h,并在最前面加上小写字母c。例如:<stdio.h> 在c++中应该是:<cstdio>

18、标准输入流cin比文件流fin慢很多很多。




7744问题

例:aabb
输出所有形如aabb的四位完全平方数(前两位数字相等、后两位数字相等)。


参考代码:

//7744问题
#include<iostream>
#include<cmath>
using namespace std;
int main(){
	int a,b,n;
	double m;
	for( a=1;a<=9;a++){
		for(b=0;b<=9;b++ ){
			n=a*1100+b*11;
			m=sqrt(n);
			//floor(x)函数返回x的整数部分,浮点数的运算可能存在误差
			//为了减小误差的影响,改为四舍五入,即floor(x+0.5) 
			if(floor(m+0.5)==m)
			    cout<<n<<endl;
		}
	}
	return 0;
} 


3n+1问题

考虑一下数列的生成办法.由n开始.   如果   n是偶数除以2.   如果是奇数,   除以3加1.   这样产生一个新的n,   长此以往,直到n   =   1.   例如   n   =   22:   

22   11   34   17   52   26   13   40   20   10   5   16   8   4   2   1   
历史证明:0~1000   000无所例外 


输入n,输出变换的次数。n小于等于10^9。

样例输入:3

样例输出:7


参考代码:

//3n+1问题
#include<iostream>
using namespace std;
int main(){
	int n,count=0;
	cin>>n;
	while(n>1){
		if(n%2==1)
			n=3*n+1;
		else
			n/=2;
			count++;
	}
	cout<<count<<endl;
	return 0;
} 


阶乘之和

输入n,计算s=1!+2!+....+n!的末6位(不含前导0)

参考代码:

#include<iostream>
using namespace std;
int main(){
	int n,sum=0;
	cin>>n;
	for(int i=1;i<=n;i++){
		int temp=1;
		for(int j=1;j<=i;j++){
			temp*=j;
		}
		sum+=temp;
	}
	cout<<sum%100000<<endl;
	return 0;
}

文件操作:数据统计

#include<cstdio>
#define INF 0xffffff0;
int main(){
	FILE *fin,*fout;
	fin=fopen("data.in","rb");
	fout=fopen("data.out","wb");
	int x;
	int n=0;
	int min=INF;
	int max=-INF;
	int s=0;
	while(fscanf(fin,"%d",&x)==1){
		s+=x;
		if(x<min) min=x;
		if(x>max) max=x;
		n++;
	}
	fprintf(fout, "%d %d %3.1f\n", min, max, (double)s/n);
	fclose(fin);
	fclose(fout);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值