【c语言】算法竞赛入门篇

【c语言】算法竞赛入门篇

书送给好朋友了,暂时被迫停更
标记位:记录文章更新到哪里了
3-1 逆序输出

引言

参考书为刘汝佳编著的算法竞赛入门经典(第二版),开始立足从c语言学习算法。

:此文不再像Java语言或框架的学习一样,补充很多语句帮助理解
此处对于简单的算法一笔带过,对于较难的算法更多的是提供思路。

在这里插入图片描述

目录

一:程序设计入门

- 算术表达式

1-1 计算并输出1+2的值

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

1-2 计算并输出8/5的值

#include<stdi.h>
int main(){
	printf("8/5=%.1f\n",8.0/5.0);
	return 0;
}

1-3 复杂的表达式计算

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

- 变量及其输入

1-4 a+b问题

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

1-5 圆柱体表面积

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

- 顺序结构程序设计

1-6 三位数反转

#include<Stdio.h>
int main(){
	int n;
	scanf("%d",&n);
	while(n>0){
		printf("%d",n%10);
		n/=10;
	}
	return 0;
}

1-7 变量交换-普通版本

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

1-8 变量交换-无中转变量版

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

1-9 变量交换-大一学生吃瓜版

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

- 分支结构程序设计

1-10 鸡兔同笼

#include<stdio.h>
int main(){
	int chicken,rabbit,head,root;
	scanf("%d,%d",&head,&root);
	if(m-2*n<0||4*2-m<0)
		printf("errors:No answer sout");
	else
		printf("chicken=%d,rabbit=%d",(head*4-root)/2),(root-2*head)/2,;
	
}

1-11 三个整数排序-直接求解版

#include<stdio.h>
int main(){
	int num1,num2,num3;
	scanf("%d,%d,%d",&num1,&num2,&num3);
	if(num1>=num2&&num2>=num3)
			printf("%d,%d,%d",num1,num2,num3);
	if(num1>=num2&&num3>=num2)
			printf("%d,%d,%d",num1,num3,num2);
	if(num2>=num1&&num1>=num3)
			printf("%d,%d,%d",num2,num1,num3);
	if(num2>=num1&&num3>=num1)
			printf("%d,%d,%d",num2,num3,num1);
	if(num3>=num1&&num2>=num1)
			printf("%d,%d,%d",num3,num2,num1);
	if(num3>=num1&&num1>=num2)
			printf("%d,%d,%d",num3,num1,num2);
	return 0;
}

1-12 三个整数排序-仿冒泡排序

#include<stdio.h>
int main(){
	int num1,num2,num3,temp;
	scanf("%d,%d,%d",&num1,&num2,&num3);
	if(num2<num1){
		temp=num1;
		num1=num2;
		num2=temp;
	}
	if(num3<num1){
		temp=num1;
		num1=num3;
		num3=temp;
	}
	if(num2<num3){
		temp=num2;
		num2=num3;
		num3=temp;
	}
	printf("num1=%d,num2=%d,num3=%d",num1,num2,num3);
	return 0;
}

- 注解与练习题

1-15 输入输出实验

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

习题1-1 平均数
输入三个整数,输出他们的平均数,保留三位小数

#include<stdio.h>
int main(){
	int num1,num2,num3;
	double ave;
	scanf("%d,%d,%d",&num1,&num2,&num3);
	ave=(num1+num2+num3)/3;
	printf("ave=%.3f",ave);
	return 0;
}

习题1-2 温度
输入华氏温度f,输出对应的摄氏温度c,保留三位小数。c=5(f-32)/9

#include<stdio.h>
int main(){
	double f,c;
	scanf("%f",f);
	printf("f=%.3f",5*(f-32)/9);
	return 0;
}

习题1-3 连续和
输入正整数n,输出1+2+…+n的值。

#include<Stdio.h>
int main(){
	int n;
	scanf("%d",&n);
	printf("%d",n*(n+1)/2)
	return 0;
}

习题1-4 正弦和余弦
输入正整数n,输出n度的正弦,余弦函数值。

#include<stdio.h>
#include<math.h>
int main(){
	const double pi=acos(-1.0);
	int n;
	printf("cos(%d)=%f,sin(%d)=%f",cos(x/180.0*pi),sin(x/180.0*pi));
	return 0;
}

习题1-5 打折
一件衣服95元,若消费满300元可打八五折。输入购买衣服件数,输出需要支付的金额。

#include<strdio.h>
int main(){
	int n;
	double sum;
	scanf("%d",&n);
	sum=n>3?n*95*0.85:n*95;
	printf("%f",sum);
	return 0;
}

习题1-6 三角形
输入三角形3条边长度值,判断是否能为直角三角形的3个边长,如果可以,则输出yes,如果不能,则输出no。如果根本无法构成三角形,则输出not a triangle。

#include<Stdio.h>
int main(){
	int a,b,c;
	scanf("%d,%d,%d",&a,&b,&c);
	if(a+b<=c||a+c<=b||b+c<=a){
		ptintf("not a triangle");
		return;
	}
	if(a*a+b*b=c*c||c*c+b*b=a*a||a*a+c*c=b*b) 		   
	printf("yes");
	else  printf("no");
	return 0;
}

习题1-7 年份
输入年份,判断是否是闰年,如果是,则输出yes,如果不是,则输出no。

#include<Stdio.h>
int main(){
	int year;
	scanf("%d",&year);
	if((year%100!=0&&year%4==0)||year%400==0)
	printf("yes");
	else
	printf("no");
	return 0;
}

二:循环结构程序设计

- for循环

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

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

- while循环和do-while循环

2-2 3n+1问题

#include<stdio.h>
int main(){
	int i,count=0;
	scanf("%d",&i);
	while(i>1){
		if(i%2==1) n=n3+1;
		else n/=2;
		count++;
	}
	printf("%d",count);
	
}

- 循环的代价

2-3 阶乘之和

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

- 注解与练习题

习题2-1 水仙花数

#include<stdio.h>
int main(){
	for(int i=100;i<1000;i++){
		if(i==(i%10)*(i%10)*(i%10)+(i/10%10)*(i/10%10)*(i/10%10)+(i/100)*(i/100)*(i/100)) 
		    printf("%d\n",i);
	}
}

习题2-2 韩信点兵
韩信让士兵三人一排,五人一排,七人一排,看一眼排尾人数便知道总人数。输入三个非负数代表每种排尾人数,输出总人数的最小值。总人数不少于10人,不多于一百人。

#include<stdio.h>
int main(){
	int a,b,c;
	scanf("%d,%d,%d",&a,&b,&c);
	int lock=0;
	for(i=10;i<101;i++){
		if(i%3==a&&i%5==b&&i%7==c){
			printf("%d",i);
			lock=1;
			return;
		}
	}
	if(lock==0)printf("no answer");
	return 0;
}

习题2-3 倒三角形

#include<stdio.h>
int main(){
	int n;
	scanf("%d",&n);
	9 7 5 3 1
	for(int j=0;j<n;j++){
		for(int i=0;i<n;i++)
			printf(" ");
		for(int i=0;i<2*n-2*j+1;i++){
			printf("*");
		}
	}
	
}

三:数组和字符串

- 数组

3-1 逆序输出

#include<stdio.h>
#define MaxSize 100
int a[MaxSize];
int main(){
	int x=0,n,m;
	scanf("%d",&n);
	while(n>0){
		scanf("%d",&m);
		a[x++]=m;
	}
	for(int i=n;i>=0;i--){
		printf("%d",a[i]);
	}
	return 0;
}

- 字符数组

3-2

- 竞赛题目

- 练习

四:函数和递归

- 自定义函数和结构体

- 函数调用与参数传递

- 递归

- 竞赛题目

- 练习

五:c++和STL入门

- 从c到c++

- STL初步

- 大整数类

- 竞赛题目

- 练习

六:数据结构基础

- 再谈栈和队列

- 链表

- 树和二叉树

- 图

- 竞赛题目

- 练习

七:暴力求解法

- 简单枚举

- 枚举排列

- 子集生成

- 回溯法

- 路径寻找问题

- 迭代加深搜索

- 竞赛题目

- 练习

八:高效算法设计

- 算法分析初步

- 再谈排序与检索

- 递归与分治

- 贪心法

- 算法设计与优化策略

- 竞赛题目

- 练习

九:动态规划初步

- 数字三角形

- DAG上的动态规划

- 多阶段决策问题

- 经典模型

- 竞赛题目

- 练习

十:数学概念与方法

- 数论初步

- 计数与概率基础

- 数学专题

- 竞赛题目

- 练习

十一:图论模型与算法

- 再谈图

- 最小生成树

- 最短路径问题

- 网络流初步

- 竞赛题目

- 练习

- 总结与展望

十二:高级专题

- 选讲专题

- 难题选解

- 练习

附录A:开发环境与方法

- 命令行

- OS脚本编程入门

- 编译器和调试器

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君问归期魏有期

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值