蓝桥杯——数组、函数问题典例一(2017.1.17)

1. 输入一个正整数n(n<1000),用筛选法求n之内的素数

源代码:

#include <stdio.h>
#include <math.h>
#define maxn 1000
int main()
{
	int i,j,n;
	int num,a[maxn];
	while(scanf("%d",&n)!=EOF)
	{
		num=0;
		for(i=0;i<n;i++)
		{
			a[i]=i+1;                      //数组中的每个数赋值1~n 
			for(j=2;j<=sqrt(a[i]);j++)     //"挖掉"非素数:从2~sqrt(a[i])依次作为除数,若能整除,将其值置为0 
			{
				if(a[i]%j==0)
				{
					a[i]=0;
					break;
				}
			}
			if(a[i]!=0 && i!=0)            //a[i]不为0且不为1时,这个数是经筛选后的素数 
			{
				num++;
				printf("%d ",a[i]);
				if(num%10==0)              //控制每10个素数换一行 
					printf("\n");
			}
		}
		printf("\n");
	}
	return 0;
}

程序截图:


2. 有一个已排好序的数组,要求输入一个数后,按原来排序的规律将它插入数组中

源代码:

#include <stdio.h>
#define maxn 1000
void InsertElement(int a[],int e,int n)  //插入输入的数 
{
	int i,tmp=n;                         //记录元素下标,初值为n 
	for(i=0;i<n;i++)                     //对数组中已有元素逐个扫描 
	{
		if(e<a[i])                       //发现e比a[i]小,tmp记录下标并退出循环 
		{
			tmp=i;
			break;
		}
	}
	for(i=n;i>tmp;i--)                   //元素依次后移(类似于顺序表操作) 
		a[i]=a[i-1];
	a[tmp]=e;                            //在腾出的“空位”处将e插入 
}
void Disp(int a[],int n)                 //输出 
{
	int i;
	for(i=0;i<n-1;i++)
		printf("%d ",a[i]);
	printf("%d\n",a[n-1]);
}
int main()
{
	int a[maxn],e,i,n;
	while(scanf("%d",&n)!=EOF)
	{
		for(i=0;i<n;i++)
			scanf("%d",&a[i]);
		scanf("%d",&e);
		InsertElement(a,e,n);
		Disp(a,n+1);                     //输出时元素个数+1 
	}
	return 0;
}

程序截图:


3. 打印杨辉三角形前n行

源代码:

#include <stdio.h>
#define maxn 50
int main()
{
	int i,j,n;
	int a[maxn][maxn];
	for(i=0;i<maxn;i++)                     //各行第一个和最后一个数都是1,这里对所有元素置初值1 
	{
		for(j=0;j<=i;j++)
			a[i][j]=1;
	}
	for(i=2;i<maxn;i++)                     //从第3行开始,除上面指出的第一个和最后一个数外,其余各数是上一行同列和前一列两个数之和 
	{
		for(j=1;j<i;j++)
			a[i][j]=a[i-1][j]+a[i-1][j-1];
	}
	while(scanf("%d",&n)!=EOF)
	{
		for(i=0;i<n;i++)
		{
			for(j=0;j<i;j++)
				printf("%d ",a[i][j]);
			printf("%d\n",a[i][i]);
		}
	}
	return 0;
}

程序截图:


4. 折半查找法的应用:输入一个数,用折半查找法找出该数在一个按递减有序、已存放15个元素的数组中的位置,找到则输出其逻辑序号(1~n),找不到则输出“无此数”

源代码:

#include <stdio.h>
void Find(int a[],int n)
{
	int low=0,high=14,mid;
	int flag=0;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(a[mid]==n)
		{
			printf("%d\n",mid+1);
			flag=1;
			break;
		}
		else if(a[mid]>n)
			low=mid+1;
		else
			high=mid-1;
	}
	if(flag==0)
		printf("无此数\n");
}
int main()
{
	int i,n,a[15];
	while(scanf("%d",&a[0])!=EOF)
	{
		for(i=1;i<15;i++)
			scanf("%d",&a[i]);
		scanf("%d",&n);
		Find(a,n);
	}
	return 0;
}

程序截图:


5. 求方程ax^2+bx+c=0的根,从主函数输入a,b,c的值(注意对a的讨论)

源代码:

#include <stdio.h>
#include <math.h>
void fun1(double a,double b,double c,double flag)   //flag>0:两个不相等实根或单根 
{
	double x1,x2;
	if(a==0)
	{
		x1=-c/b;
		printf("%.2lf\n",x1);
	}
	else
	{
		x1=((-b)+sqrt(flag))/(2*a);
		x2=((-b)-sqrt(flag))/(2*a);
		printf("%.2lf %.2lf\n",x1,x2);
	}
}
void fun2(double a,double b,double c,double flag)   //flag=0:两个相等实根 
{
	double x1,x2;
	x1=x2=(-b)/(2*a);
	printf("%.2lf %.2lf\n",x1,x2);
}
void fun3(double a,double b,double c,double flag)   //flag<0:两个共轭复根 
{
	double m,n;
	m=(-b)/(2*a);
	n=sqrt(-flag)/(2*a);                            //特别注意此时flag<0,开方时对flag取绝对值 
	printf("%.2lf+%.2lfi %.2lf-%.2lfi\n",m,n,m,n);
}
int main()
{
	double a,b,c;
	double flag;
	while(scanf("%lf %lf %lf",&a,&b,&c)!=EOF)
	{
		flag=b*b-4*a*c;                             //根的判别式 接下来分flag>0 =0 <0三种情况讨论 
		if(flag>0)
			fun1(a,b,c,flag);
		else if(flag==0)
			fun2(a,b,c,flag);
		else
			fun3(a,b,c,flag);
	}
	return 0;
}

程序截图:


6. 输入10个学生的姓名5门课的成绩,用函数求出每个学生的平均分、每门课的平均分、所有分数中最高分数对应的学生姓名和课程、平均分方差

源代码:

#include <stdio.h>
#include <math.h>
struct student
{
	char name[32];
	double sc[5];
	double sum,aver;
}stu[10];
void Stuaver(struct student stu[],int n)
{
	int i,j;
	for(i=0;i<n;i++)
	{
		stu[i].sum=0;
		for(j=0;j<5;j++)
			stu[i].sum+=(stu[i].sc[j]);
		stu[i].aver=stu[i].sum/5;
		printf("stu%d:aver=%.2lf\n",i+1,stu[i].aver);
	}
	printf("\n");
}
void Classaver(struct student stu[],int n)
{
	int i,j;
	double clasum[5],claaver[5];
	for(i=0;i<5;i++)
	{
		clasum[i]=0;
		for(j=0;j<n;j++)
		{
			clasum[i]+=(stu[j].sc[i]);
			claaver[i]=clasum[i]/n;
		}
	}
	for(i=0;i<5;i++)
		printf("class%d:aver=%.2lf\n",i+1,claaver[i]);
	printf("\n");
}
void FindMax(struct student stu[],int n)
{
	int i,j;
	double scoremax=stu[0].sc[0];
	for(i=0;i<n;i++)
	{
		for(j=0;j<5;j++)
		{
			if(stu[i].sc[j]>scoremax)
				scoremax=stu[i].sc[j];
		}
	}
	for(i=0;i<n;i++)
	{
		for(j=0;j<5;j++)
		{
			if(stu[i].sc[j]==scoremax)
			{
				printf("%s class%d\n",stu[i].name,j+1);
				break;
			}
		}
	}
	printf("\n");
}
void Avfc(struct student stu[],int n)
{
	int i;
	double fc,sum1=0,sum2=0;
	for(i=0;i<n;i++)
	{
		sum1+=pow(stu[i].aver,2);
		sum2+=stu[i].aver;
	}
	fc=sum1/n-pow(sum2/n,2);
	printf("Fc=%.2lf\n",fc);
}
int main()
{
	int i,j;
	for(i=0;i<10;i++)
	{
		scanf("%s",stu[i].name);
		for(j=0;j<5;j++)
			scanf("%lf",&stu[i].sc[j]);
	}
	Stuaver(stu,10);
	Classaver(stu,10);
	FindMax(stu,10);
	Avfc(stu,10);
	return 0;
}

程序截图:


7. 用函数实现:

①输入10个职工的姓名和职工号

②按职工号递增排序,姓名顺序随之调整

③输入一个职工号(主函数输入),用折半查找法找出该职工姓名(调用函数输出)

源代码:

#include <stdio.h>
#include <string.h>
struct worker
{
	char name[32];
	int num;
}wk[10];
void Input(struct worker wk[],int n)
{
	int i;
	for(i=0;i<n;i++)
		scanf("%s %d",wk[i].name,&wk[i].num);
	printf("\n");
}
void Output(struct worker wk[],int n)
{
	int i;
	for(i=0;i<n;i++)
		printf("%s %d\n",wk[i].name,wk[i].num);
	printf("\n");
}
void Sort(struct worker wk[],int n)
{
	int i,j;
	struct worker t;
	for(i=0;i<n-1;i++)
	{
		for(j=0;j<n-1-i;j++)
		{
			if(wk[j].num>wk[j+1].num)
			{
				t=wk[j];
				wk[j]=wk[j+1];
				wk[j+1]=t;
			}
		}
	}
	printf("\n");
}
void Find(struct worker wk[],int num,int n)
{
	int low=0,high=n-1,mid;
	int flag=0;
	while(low<=high)       //注意临界条件 
	{
		mid=(low+high)/2;
		if(wk[mid].num==num)
		{
			printf("%s\n",wk[mid].name);
			flag=1;
			break;
		}
		else if(wk[mid].num<num)
			low=mid+1;
		else
			high=mid-1;
	}
	if(flag==0)
		printf("Not found!\n");
}
int main()
{
	int num;
	Input(wk,10);
	Sort(wk,10);
	Output(wk,10);
	scanf("%d",&num);
	Find(wk,num,10);          //已保证职工号递增有序 
	return 0;
}

程序截图:


8. 输入一个十六进制数,输出相应的十进制数

源代码:

#include <stdio.h>
#include <math.h>
#include <string.h>
#define maxlen 10
void Turn(char num16[])
{
	int i,num10=0;
	int wei;                           //十六进制数对应数位 
	int flag=1;                        //判断标志:0-输入错误 1-输入正确 
	for(i=0;i<strlen(num16);i++)
	{
		if(!((num16[i]>='0' && num16[i]<='9') || (num16[i]>='A' && num16[i]<='F') || (num16[i]>='a' && num16[i]<='f')))
		{
			flag=0;
			break;
		}
	}
	if(flag==1)
	{
		for(i=0;i<strlen(num16);i++)
		{
			if(num16[i]=='A' || num16[i]=='a')
				wei=10;
			else if(num16[i]=='B' || num16[i]=='b')
				wei=11;
			else if(num16[i]=='C' || num16[i]=='c')
				wei=12;
			else if(num16[i]=='D' || num16[i]=='d')
				wei=13;
			else if(num16[i]=='E' || num16[i]=='e')
				wei=14;
			else if(num16[i]=='F' || num16[i]=='f')
				wei=15;
			else
				wei=(num16[i]-'0');
			num10+=(wei*pow(16,strlen(num16)-i-1));
		}
		printf("%d\n",num10);
	}
}
int main()
{
	char num16[maxlen];
	while(scanf("%s",num16)!=EOF)
		Turn(num16);
	return 0;
}

程序截图:


9. 输入年月日,计算该日是该年的第几天

源代码:

#include <stdio.h>
void GetDay(int y,int m,int d)
{
	int day=0;
	while(m)
	{
		m--;
		switch(m)
		{
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12:day+=31;break;
			case 4:
			case 6:
			case 9:
			case 11:day+=30;break;
			case 2:
			{
				if((y%4==0 && y%100!=0) || (y%400==0))
					day+=29;
				else
					day+=28;
				break;
			}
		}
	}
	day+=d;
	printf("%d\n",day);
}
int main()
{
	int year,month,day;
	while(scanf("%d %d %d",&year,&month,&day)!=EOF)
		GetDay(year,month,day);
	return 0;
}

程序截图:


10. 用递归法将一个整数n转换成字符串

源代码:

#include <stdio.h>
void InttoString(int n)
{
	char c;
	int i;
	if((i=n/10)!=0)             //i记录n除以10取整的结果,不是最高位时,递归进行该过程 
		InttoString(i);
	c=(n%10)+'0';               //取出n的最高位,并转换为字符 
	printf("%c ",c);
}
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		if(n<0)                 //n为负数时,预先打印负号,并对n取相反数后调用InttoString(n)函数 
		{
			printf("- ");
			n=-n;
		}
		InttoString(n);
		printf("\n");
	}
	return 0;
}

程序截图:

11. 用递归法求n阶勒让德多项式的值

源代码:

#include <stdio.h>
double Cal(int n,int x)
{
	double result;
	if(n==0)
		result=1;
	else if(n==1)
		result=x;
	else
		result=(2*n-1)*x*Cal((n-1),x)-(n-1)*Cal((n-2),x)/n;
	return result;
}
int main()
{
	int n,x;
	while(scanf("%d %d",&n,&x)!=EOF)
		printf("%.2lf\n",Cal(n,x));
	return 0;
}

程序截图:


12. 汉诺塔问题:递归求解盘子移动路径

源代码:

#include <stdio.h>
void move(char x,char y)
{
	printf("%c->%c\n",x,y);
}
void hanoi(int n,char one,char two,char three)
{
	if(n==1)
		move(one,three);
	else
	{
		hanoi(n-1,one,three,two);
		move(one,three);
		hanoi(n-1,two,one,three);
	}
}
int main()
{
	int m,time=0;
	while(scanf("%d",&m)!=EOF)
	{
		hanoi(m,'A','B','C');
	}
	return 0;
}

程序截图:


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值