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

来源:互联网 发布:上网流量统计软件 编辑:程序博客网 时间:2024/06/03 15:52

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

源代码:

#include <stdio.h>#include <math.h>#define maxn 1000int 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 1000void 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 50int 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;elsehigh=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);elsefun3(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;elsehigh=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 10void 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;elsewei=(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;elseday+=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;elseresult=(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;}

程序截图:


0 0
原创粉丝点击