《算法竞赛入门经典》(第二版)第二章笔记

第二章 循环结构程序设计

笔记

for循环的格式为:for(初始化;条件;调整) 循环体;
尽量缩短变量的定义范围,在for循环的初始化部分定义循环变量,尽量不要定义名字相同的内外层变量。
break:直接跳出循环,往整体循环的下一步走
continue:跳回for循环的开始,执行调整语句并判断循环条件(即“直接进行下一次循环”,可以不必求出循环的起始点即“偷懒”)
while循环的格式:初始化;while(条件){循环体;调整;}
在观察无法找出错误时,可以用“输出中间结果”的方法查错!!!
在循环体开始定义的变量(例如累加器和累乘器),每次执行循环时会重新声明并初始化!!!!!啊啊啊不要忘记有时候要清零啊啊啊啊啊!!!!!
long long int的范围是-2的63次方~2的63次方-1(输入输出要改为%lld,有时有时%I64d)
le-6代表10的-6次方,即0.000001
要计算只包含加法、减法和乘法的整数表达式除以正整数n的余数,可以在每步计算之后对n取余,防止溢出,结果不变。
(double)a/b强制类型转换为双精度变量,%d有时候可以用来只输出整数部分。
分母有乘法的时候可以写成分子连除两个分母防止溢出,一定要注意结果没溢出但是中间计算结果溢出的情况!!
用乘10或除10来向右或向左移动小数点,有时候扩大之后的数在用完之后还要记得复原给下一次用……
单层的循环很少,一般都是双层循环来写,思路不要太局限,我怎么这么笨……
可以用数组来存放标记的数,后面也经常用到。

代码

这次的有参考大佬的

程序2-1 输出1,2,3,…,n的值

int n;
	scanf("&d",&n);
	for(int i=1;i<=n;i++)
		printf("%d\n",i);

程序2-2 aabb问题(1)

	for(int a=1;a<=9;a++)
		for(int b=0;b<=9;b++)
		{
			int n=a*1100+b*11;
			int m=floor(sqrt(n)+0.5);
			if(m*n==n)
				printf("%d\n",n);	
		}

程序2-3 aabb问题(2)

	for(int x=1;;x++)
	{
		int n=x*x;
		if(n<1000) continue;
		if(n>9999) break;
		int hi=n/100;int lo=n%100;
		if(hi/10==hi%10&&lo/10==lo%10)
			printf("%d\n",n);
	}

程序2-5 3n+1问题

int n2,count=0;
	scanf("%d",&n2);
	long long n=n2;
	while(n>1)
	{
		if(n%2!=0)
		{n=3*n+1;count++;}
		else
		{n=n/2;count++;}
	}
	printf("%d",count);

程序2-6 近似计算

double sum=0;
	for(int i=0;;i++)
	{
		double term=1.0/(2*i+1);//注意规律
		if(i%2==0)sum+=term;
		else sum-=term;
		if(term<0.000001) break;
	}
	printf("%.6f\n",sum);

程序2-7 阶乘之和(1)

	int n,s;
	scanf("%d",&n);
	int sum=0;
	for(int i=1;i<=n;i++)
	{
		int z=1;
		for(int j=1;j<=i;j++)
			z=j*z;
			sum=z+sum;
	}
	printf("%d",sum % 1000000);

程序2-12 数据统计(改掉bug版)

	int x,n=0,kase=0;
	while(scanf("%d",&n)==1&&n) 
	{
		while(n--)
		{
			int s=0,min=INF,max=-INF;
			for(int i=0;i<n;i++)
			{
				scanf("%d",&x);
				s+=x;
				if(x<min) min=x;
				if(x>max) max=x;
			}
			if(kase)
				printf("\n");
				printf("Case %d:%d %d %.3f\n",++kase,min,max,(double)s/n);
		}
	}

习题2-1 水仙花数

//2-1
	int a,b,c,i;
	for(i=100;i<=999;i++)
	{
		a=i/100;
		b=i/10%10;
		//b=i%100/10; 
		c=i%10;//这里是对10取余....... 怪不得只输出407 
		if(i==a*a*a+b*b*b+c*c*c)
			printf("%d\n",i);
	}

习题2-2 韩信点兵

//2-2
	int a,b,c,count=0,i;
	while(scanf("%d %d %d",&a,&b,&c)!=EOF)
	{
		count++;
		for(i=10;i<=100;i++)
		{  
			if(i%3==a&&i%5==b&&i%7==c)
				printf("Case %d:%d\n",count,i);
			else
				if(i==101)
				printf("Case %d:no.answer\n",count);
		}
	}

习题2-3 倒三角形

//2-3
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		for(int t=1;t<i;t++)
		{
			printf(" ");
		}
		for(int j=1;j<=2*(n-i)+1;j++)
			printf("#");
			printf("\n");
	}

习题2-4 子序列的和

//2-4
	int n,m,count=0;
	while(scanf("%d %d",&n,&m)!=-1&&n&&m)
	{
		count++;
		double sum=0;
		for(int i=n;i<=m;i++)
		sum=1.0/i/i+sum;
		printf("Case %d:%.5lf",count,sum);	
	}

习题2-5 分数化小数

//2-5
	int a,b,c,count=0,x;
	double d;
	while(scanf("%d %d %d",&a,&b,&c)!=-1&&a&&b&&c)
	{
		count++;
		printf("Case %d:%d.",count,a/b);
		d=(double)a/b-a/b;
		for(int i=1;i<=c;i++)
		{
			d=d*10;
			x=(int)d;
			if(c==i) 
				if(x>=5)
					x++;
			printf("%d",x);
			d=d-x;
		}
	}

习题2-6 排列

//2-6 
	int a[9]={0},i,n,z,y,flag;
	for(i=123;i<=329;i++)
	{
		flag=1;
		y=i;
		a[0]=y/100;a[1]=y/10%10;a[2]=y%10;
		n=y*2;
		a[3]=n/100;a[4]=n/10%10;a[5]=n%10;
		z=y*3;
		a[6]=z/100;a[7]=z/10%10;a[8]=z%10;
		for(int j=0;j<9;j++)
		{
			for(int k=0;k<9;k++)
			{
				if(j==k) continue;
				if(a[j]==a[k])
				{
				 	flag=0;break;
				}
				else
					continue;
			} 
			if(flag==0)
			break;
		}
		if(flag==1&&a[1]&&a[2]&&a[3]&&a[4]&&a[5]&&a[6]&&a[7]&&a[8])
			printf("%d %d %d\n",i,n,z);
		else 
			continue;
	}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值