C语言算法入门练习【算法竞赛入门经典】

1.1 C语言输出

#include<stdio.h>
int main()
{
	printf("%d\n",1+2);
	return 0;
}

1.2 C计算与输出基础

#include <stdio.h>
#include <math.h>
int main()
{
	printf("%.1f\n",8.0/5.0);
	printf("%.8f\n",1+2*sqrt(3)/(5-0.1));
	return 0;
}

1.3 a+b

#include<stdio.h>
int main()
{
	int a,b;
	scanf("%d%d",&a,&b);
	printf("%d\n",a+b);
	return 0;
}

1.4 圆柱体面积

#include <stdio.h>
#include <math.h>
int main()
{
	const double pi=acos(-1.0);
	double r,h,s1,s2,s;
	scanf("%1f%1f",&r,&h);
	s1=pi*r*r;
	s2=2*pi*r*h;
	s=s1*2.0+s2;
	printf("Area=%.3f\n",s);
	return 0;
}

1.5 三位数翻转

//输入一个三位数,分离出百位、十位、个位,反转后输出。
#include <stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	printf("%d%d%d\n",n%10,n/10%10,n/100);
	/*第一个n%10是个位数,如123除10后取余得3。
	  第二个n/10%10,是十位数,如123除10为12.3再除10取余为2。
	  第三个n/100是百位数,如123除100后得1.23,而%d输出为整数,所以为1。 
	 */
	return 0;
}

1.6 三位数翻转-2

#include<stdio.h>
int main()
{
	int n,m;
	scanf("%d",&n);
	m=(n%10)*100+(n/10%10)*10+(n/100);
	printf("%03d\n",m);		//%03d若不足3位在左边用0补齐
	return 0;
}

1.7 交换变量(赋值法)

#include<stdio.h>
int main()
{
	int a,b,t;
	scanf("%d%d",&a,&b);
	t=a;
	a=b;
	b=t;
	printf("%d %d",a,b);
	return 0;
}

1.8 交换变量(输出法)

#include <stdio.h>
int main()
{
	int a,b;
	scanf("%d%d",&a,&b);
	printf("%d %d\n",b,a);
	return 0;
}

1.9 鸡兔同笼

/*鸡a,兔b,n只,m腿;
a+b=n,2a+4b=m,联立得
a=(4n-m)/2
b=n-a
*/
#include<stdio.h>
int main()
{
	int a,b,n,m;
	scanf("%d%d",&n,&m);
	a=(4*n-m)/2;
	b=n-a;
	if(m%2==1||a<0||b<0)		//m是奇数,或者a小于0,或者b小于0
		printf("No answer\n");
	else
		printf("%d %d\n",a,b);
	return 0;
}

2.1 循环输出

#include<stdio.h>
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		printf("%d\n",i);
	return 0;
}

2.2 aabb完全平方数

/*形如aabb的四位完全平方数(前两位数字相等,后两位数字相等) 
完全平方数:一个数如果是另一个整数的完全平方,称此数为完全平方数 
如:0,1,4,9,16等 3*3=9 9为完全平方数*/
#include <stdio.h>
#include <math.h>
int main()
{
	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);		//floor(x)返回不超过的大整数,此处+0.5为减小浮点数运算存在的误差
			if(m*m==n) printf("%d\n",n);
		}
}

2.3 aabb完全平方数-2

/*形如aabb的四位完全平方数(前两位数字相等,后两位数字相等) 
完全平方数:一个数如果是另一个整数的完全平方,称此数为完全平方数 
如:0,1,4,9,16等 3*3=9 9为完全平方数*/
#include <stdio.h>
#include <math.h>
int main()
{
	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);		//floor(x)返回不超过的大整数,此处+0.5为减小浮点数运算存在的误差
			if(m*m==n) printf("%d\n",n);
		}
}

2.4 3n+1问题

/*大于1的自然数n,
若n为奇数,将n变为3n+1
否则变为n/2,变换若干次后最终变为1.
求变换次数n*/
#include <stdio.h>
int main()
{
	int n,count=0;
	scanf("%d",&n);
	while(n>1)
	{
		if(n%2==1)
			n=n*3+1;
		else 
			n/=2;
		count++;
	}
	printf("%d\n",count);
	return 0;
}
/*此时存在溢出问题
可改为
int n2,count=0;
scanf("%d",&n2);
long long n=n2;
*/

2.5 近似计算

/*计算
π/4=1-1/3+1/5-1/7+....
直到最后一项小于10的-6次方
*/
#include<stdio.h>
int main()
{
	double sum=0;
	for(int i=0;;i++)
	{
		double term=1.0/(i*2+1);
		if(i%2==0) sum+=term;
		else sum-=term;
		if(term<1e-6) break;
	}
	printf("%.6f\n",sum);
	return 0;
}

2.6 阶乘之和

#include<stdio.h>
int main()
{
	int n,s=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int factorial=1;
		for(int j=1;j<=i;j++)
			factorial*=j;
		s+=factorial;
	}
	printf("%d\n",s%1000000);
}
//累乘器factorial

2.7 阶乘之和-2

#include<stdio.h>
#include<time.h>
int main()
{	const int MOD=1000000;
	int n,S=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int factorial=1;
		for(int j=1;j<=i;j++)
			factorial=(factorial*j%MOD);
		S=(S+factorial)%MOD;
	}
	printf("%d\n",S);
	printf("Time used=%.2f\n",(double)clock()/CLOCKS_PER_SEC);
	return 0;
}

2.8 数据统计

#include<stdio.h>
#include<time.h>
int main()
{	const int MOD=1000000;
	int n,S=0;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		int factorial=1;
		for(int j=1;j<=i;j++)
			factorial=(factorial*j%MOD);
		S=(S+factorial)%MOD;
	}
	printf("%d\n",S);
	printf("Time used=%.2f\n",(double)clock()/CLOCKS_PER_SEC);
	return 0;
}

3.1 逆向输出

#include<stdio.h>
#define maxn 105
int a[maxn];					//数组a被声明再外面时,才可开的很大,若在main内,稍大就会异常退出
int main()
{
	int x,n=0;
	while(scanf("%d",&x)==1)
		a[n++]=x;				//等同于先赋值a[n]=x,再执行n=n+1,可写成{a[n]=x;n=n+1;}
	for(int i=n-1;i>=0;i--)
		printf("%d ",a[i]);		//用空格隔开数据时要在%d后加空格
	
	/*为何不用
	for(int i=n-1;i>=0;i--)
		printf("%d\n",a[i]);
	因为相邻两个数据间要用空格隔开而非换行,所以分两条语句输出*/
	return 0;
}

3.2 开关灯问题

/*memset:作用是在一段内存块中填充某个给定的值,它是对较大结构体或数组进行清零操作的一种最快方法。*/
#include<stdio.h>
#include<string.h>
#define maxn 1010
int a[maxn];
int main()
{
	int n,k,first=1;				//n为灯编号,k为人数
	memset(a,0,sizeof(a));			//快速数组清零,此时所有灯为0及false,all灯关
	scanf("%d%d",&n,&k);
	for(int i=1;i<=k;i++)
		for(int j=1;j<=n;j++)
			if(j%i==0) a[j]=!a[j];
/*第一个人经过n盏灯时,因为是n%1所以均等于0,非关赋值后全为true,全部打开
  第二个人经过n盏灯时,因为是n%2所以只有n为2的倍数时才等于0,此时2的倍数的灯非关赋值,全部打开
  第三个人经过n盏灯时,因为是n%3所以只有n为3的倍数时才等于0,此时3的倍数的灯,若为关则非关赋值灯打开,若为开则非开赋值灯关闭
  以此类推*/
	for(int t=1;t<=n;t++)
		if(a[t])					//此时判断真假,若为真(开灯)的序号,直接进入if大循环,若为假(关灯)排除。
		{
			if(first)	first=0;	//因为first=1,则真(开)灯进入if,然后first=0,输出灯序号。因为改变first为假所以之后序号灯,均进入else
			else printf(" ");		//之后进入else的灯都先输出空格,再输出序号
			printf("%d",t);
		}
	printf("\n");
	return 0;
}
//first的作用就是使第一个输出的序号不带空格,之后每输出一个序号前面加个空格

3.3 蛇形填数

/*
n*n方阵填入1-n*n.例n=4时方阵为
10	11  12	1
9	16	13	2
8	15  14  3
7	6	5	4
*/
#include<stdio.h>
#include<string.h>
#define maxn 20
int a[maxn][maxn];
int main()
{
	int n,x,y,tot=0;
	scanf("%d",&n);
	memset(a,0,sizeof(a));						//注意,已将所有元素初始化为0及false
	tot=a[x=0][y=n-1]=1;
	while(tot<n*n)
	{
		while(x+1<n && !a[x+1][y]) a[++x][y] = ++tot;  
		while(y-1>=0 && !a[x][y-1]) a[x][--y] = ++tot;
		while(x-1>=0 && !a[x-1][y]) a[--x][y] = ++tot;
		while(y+1<n && !a[x][y+1]) a[x][++y] = ++tot;
	}
	for(x=0;x<n;x++)
	{
		for(y=0;y<n;y++)
			printf("%3d",a[x][y]);				//%3d表示以3位固定宽度输出整型数
		printf("\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44730560/article/details/89387829