【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