《算法笔记》01

1. 比较交换3个实数值,并按序输出

从键盘输入3个实数a, b, c,通过比较交换,将最小值存储在变量a中,最大值存储在变量c中,中间值存储在变量b中,并按照从小到大的顺序输出这三个数a, b, c。末尾输出换行。

#include<stdio.h>
int main(){
    double a,b,c,t;
    scanf("%lf %lf %lf",&a,&b,&c);
    if(a>b){
        t=a;
        a=b;
        b=t;
        }
    if(a>c){
        t=a;
        a=c;
        c=t;
        }
    if(b>c){
        t=b;
        b=c;
        c=t;
        }
    printf("%.2f %.2f %.2f\n",a,b,c);
    return 0;
}
2. 三个整数求最大值

有3个整数a, b, c,由键盘输入,输出其中最大的数。

#include<stdio.h>
#define DA(a,b) ((a)>(b)?(a):(b))
int main(){
	int a,b,c,t,m;
	scanf("%d %d %d",&a,&b,&c);
	t=DA(a,b);
	m=DA(t,c);
	printf("%d\n",m);
	return 0;
}
3. 求圆周率pi的近似值

在这里插入图片描述
求圆周率PI的近似值,直到发现某一项的绝对值小于10-6为止(该项不累加)。

要求输出的结果总宽度占10位,其中小数部分为8位。

程序中使用浮点型数据时,请定义为双精度double类型。

#include <stdio.h>
#include <math.h>
int main() {
	double PI, i, n=0, sum=0;
	for(i=1; ; i++) {
		n = 1/(2*i-1); //第 i 项的值
		if(n <= pow(10,-6)) {
			printf("PI=%10.8f", PI);
			return 0;
		}
		sum = sum-pow(-1,i)*n; // i项累加的结果
		PI = sum * 4.0; // PI的值
	}
	return 0;
}

4. Fibonacci数列

输入一个正整数n,求Fibonacci数列的第n个数。Fibonacci数列的特点:第1,2个数为1,1。从第3个数开始,概述是前面两个数之和。要求输入的正整数n不超过50.

#include <stdio.h>
#include <math.h>

int fib(int n){
	if(n<0||n>50) return 0;
	if(n==1||n==2){
		return 1;
	}
	int a=1,b=1;
	int sum=2;
	for(int i=3;i<=n;i++){
		sum=a+b;
		a=b;
		b=sum;	
	}
	return sum;
}
	
int main() {
	int n;
	scanf("%d",&n);
	int f=fib(n);
	printf("%d\n",f);
	return 0;
}

5. 分数序列求和

在这里插入图片描述
求出次数列的前20项之和。
请将结果的数据类型定义为double类型。

#include <stdio.h>
#include <math.h>
	
int main() {
	double a[21]={1,2};
	double sum=0.0;
	for(int i=2;i<21;i++){
		a[i]=a[i-1]+a[i-2];
	}
	for(int j=0;j<20;j++){
		sum+=(a[j+1]/a[j]);
	}
	printf("%.6f\n",sum);
	return 0;
}

6. 有序插入

有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入到数组中。
假设数组长度为10,数组中前9个数(这9个数要求从键盘上输入,输入时要满足自小到大的输入顺序)已经按从小到大进行排序。
然后再从键盘上输入一个整数,将此整数插入到前有序的9个数中,使得最终的10个数依然是从小到大有序的。

#include <stdio.h>
	
int main() {
	int a[10];
	int n;
	for(int w=0;w<9;w++){
		scanf("%d ",&a[w]);
	}
	scanf("%d",&n);
	int i=0,j;
	for(;i<10;i++){  //位于a[j]
		if(n>a[i]) continue;
		j=i;
		break;
	}
	for(int t=8;t>=j;t--){
		a[t+1]=a[t];
	}
	a[j]=n;
	for(int q=0;q<10;q++){
		printf("%d\n",a[q]);
	}
	return 0;
}

7. 数组元素逆置

将一个长度为10的整型数组中的值按逆序重新存放。
如:原来的顺序为1,2,3,4,5,6,7,8,9,0,要求改为0,9,8,7,6,5,4,3,2,1

#include <stdio.h>

int main() {
	int a[10]={0};
	for(int w=0;w<10;w++){
		scanf("%d",&a[w]);  //%d后不能有空格!
	}
	for(int j=0;j<5;j++){
		int temp=a[j];
		a[j]=a[9-j];
		a[9-j]=temp;
	}
	for(int i=0;i<10;i++){  //位于a[j]
		printf("%d\n",a[i]);
	}
	
	return 0;
}

#include <cstdio>
#include <cstring>
int main()
{
	int a[10];
	for(int i=0;i<=9;i++){
		scanf("%d",&a[i]);
	}
	for(int b=9;b>=0;b--){   //直接倒着输出
		printf("%d\n",a[b]);
	}
	return 0;
}
8. 杨辉三角
#include <cstdio>

int main(){
  int n;
  scanf("%d",&n);
  int i,j,a[n][n];

  for (i=0;i<n;i++){			
	 a[i][i]=1;
     a[i][0]=1;
  }

  for (i=2;i<n;i++){				
    for (j=1;j<=i-1;j++) 
       a[i][j]=a[i-1][j-1]+a[i-1][j];
  }
  
  for (i=0;i<n;i++){			
	 for (j=0;j<=i;j++){
	 	printf("%d ",a[i][j]);
	 }		
     printf("\n");  
  }
  return 0;
}

9. 解密

65–90:A–Z
97–122:a–z
相差32

#include <cstdio>
#include <cstring>
int main()
{
	char a[20];
	scanf("%s",a);
	for(int i=0;i<strlen(a);i++) 
	{
		if(a[i]>=65&&a[i]<=90)  //A--Z
			a[i]=26-(a[i]-65)+64;
		else if(a[i]>=97&&a[i]<=122)  //a--z
			a[i]=26-(a[i]-97)+96;
	}
	printf("%s",a);
	return 0;
}
10. 字符串比较
#include <cstdio>
#include <cstring>
int main()
{
	char a[20],b[20];
	gets(a); //输入字符串,会换行
	gets(b);
	int sum=0;
	int min=strlen(a)>strlen(b)?strlen(b):strlen(a);  //strlen
	for(int i=0;i<=min;i++)
		sum+=a[i]-b[i];
	printf("%d",sum);
	return 0;
}
11. 冒泡排序
#include <cstdio>
#include <cstring>
#include <cmath>
int main()
{
	int str[10]={};
	for(int i=0;i<10;i++){
		scanf("%d",&str[i]);
	}
	for(int a=1;a<=9;a++){   //9趟排序 
		for(int b=0;b<=9-a;b++){
			if(str[b]>=str[b+1]){
				int temp=str[b];
				str[b]=str[b+1];
				str[b+1]=temp;
			}
		}
	}
	for(int j=0;j<10;j++){
		printf("%d\n",str[j]);
	}
	return 0;
}
12. 字符串求最大值

当s1<s2时,返回为负数;
当s1=s2时,返回值= 0;
当s1>s2时,返回正数。
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。

#include <cstdio>
#include <cstring>
#include <cmath>
int main()
{
	char a[3][10];
	for(int i=0;i<3;i++)
		gets(a[i]);
	int max=0;
	for(int i=1;i<3;i++)
		if(strcmp(a[max],a[i])<=0)
			max=i;
	printf("%s",a[max]);

	return 0;
}
13. 输入3个字符串,按从小到大的顺序输出。要求使用指针的方法进行处理
#include <cstdio>
#include <cstring>
#include <cmath>

int main()
{
	char a[20],b[20],c[20];
	char *p=a,*q=b,*r=c;
	scanf("%s%s%s",a,b,c);
	printf("%s\n%s\n%s\n",strcmp((strcmp(p,q)>0?q:p),r)<0?(strcmp(p,q)>0?q:p):r,
		strcmp((strcmp(p,q)>0?p:q),r)>0?(strcmp((strcmp(p,q)>0?q:p),r)>0?(strcmp(p,q)>0?q:p):r):(strcmp(p,q)>0?p:q),
		strcmp((strcmp(p,q)>0?p:q),r)>0?(strcmp(p,q)>0?p:q):r);
	return 0;
}

14. 输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。要求用3个函数实现,分别为输入10个数、进行处理、输出10个数。要求使用指针的方法进行处理。
#include <iostream>
using namespace std;
int a[10]={0};int i;
void get(int a[10])
{
	for(i=0;i<10;i++)
		cin>>a[i];
}
void change(int a[10])  //设置min max变量,与10个数依次比较大小
{
	int max,min,temp;min=a[0];max=a[0];int t=0;
	for(i=0;i<10;i++)
	{
		if(min>=a[i])
		{
			min=a[i];
			t=i;
		}
	}
	temp=a[t];
	a[t]=a[0];
	a[0]=temp;            //a[0]已是最小值 
	for(i=0;i<10;i++)
	{
		if(max<=a[i])
		{
			max=a[i];
			t=i;
		}
	}
	temp=a[t];
	a[t]=a[9];
	a[9]=temp;       //a[9]已是最大值 
}
void out(int a[10])
{
	for(i=0;i<10;i++)
		cout<<a[i]<<" ";

}
int main()
{
	get(a);
	change(a);
	out(a);

}

15. 完成一个对候选人得票的统计程序。假设有3个候选人,名字分别为Li,Zhang和Fun。使用结构体存储每一个候选人的名字和得票数。记录每一张选票的得票人名,输出每个候选人最终的得票数。

类型为 double 的包含 10 个元素的数组 balance double balance[10];
现在 balance 是一个可用的数组,可以容纳 10 个类型为 double 的数字。

#include <cstdio>
#include <cstring>
struct person 
{
	char name[20];
	int count;
}leader[3] = {"Li", 0, "Zhang", 0, "Fun", 0};
int main()
{			
	int n;
	scanf("%d",&n);
	char name[100][10];     //明白要用二维数组,但不知道为什么name[100][1]也正确?
	for(int i=0;i<n;i++)
		scanf("%s",name[i]);
	for(int i=0;i<n;i++)
		if(strcmp(name[i],leader[0].name)==0)
			leader[0].count++;
		else if(strcmp(name[i],leader[1].name)==0)
			leader[1].count++;
		else if(strcmp(name[i],leader[2].name)==0)
			leader[2].count++;
	for(int i=0;i<3;i++)
		printf("%s:%d\n",leader[i].name,leader[i].count);
	return 0;
}
16. 定义一个结构体student,存储学生的学号、名字、性别和年龄,读入每个学生的所有信息,保存在结构体中,并输出。本题要求使用指向结构体数组的指针进行输入和输出。
#include<stdio.h>
#include<string.h>
struct student {
    int num;
    char name[20];
    char sex;
    int age;
};

int main()
{
	int n;
	scanf("%d",&n);
	student stu[20];
	for(int i=0;i<n;i++)
		scanf("%d %s %c %d",&stu[i].num,stu[i].name,&stu[i].sex,&stu[i].age);
	struct student *p=&stu[0];
	for(int i=0;i<n;i++)
		printf("%d %s %c %d\n",(p+i)->num,(p+i)->name,(p+i)->sex,(p+i)->age);
		
	return 0;
} 


17. 有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩。读入这10个学生的数据,要求输出3门课程的总平均成绩,以及个人平均分最高的学生的数据(包括学号、姓名、3门课程成绩、平均分数)。
#include<stdio.h>
#include<string.h>

struct student{
    int num;
    char name[10];
    int grade[3];
    double average;
}stu[10];

void input(){
	for(int i=0;i<10;i++){
		scanf("%d %s %d %d %d",&stu[i].num,stu[i].name,&stu[i].grade[0],&stu[i].grade[1],&stu[i].grade[2]);
		stu[i].average=(stu[i].grade[0],stu[i].grade[1],stu[i].grade[2])/3;
	}

}
void output(){
	double a=0,b=0,c=0;
	int max=0;
	for(int i=0;i<10;i++){
		a+=double(stu[i].grade[0]);
		b+=double(stu[i].grade[1]);
		c+=double(stu[i].grade[2]);
		if(i!=0)
			{if(stu[i].average>stu[max].average)
				max=i-1;  //并不知道为什么要-1,猜测是因为数组,目前还没搞懂
			}
	}
	printf("%.2f %.2f %.2f\n",a/10,b/10,c/10);
	printf("%d %s %d %d %d\n",stu[max].num,stu[max].name,stu[max].grade[0],stu[max].grade[1],stu[max].grade[2]);
	
}
int main()
{
	input();
	output();
	return 0;
} 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值