考研算法设计题(交大2010年试题)1、请编写程序,利用随机函数模拟投币结果,设共投币100次,求"两个正面"、"两个反面"、"一正一反"三种情况各出现几次。
2、由用户输入出生日期和当前日期,请编写程序计算实际年龄。
3、试编写程序求Hermite函数值:H0(x)=1H1(x)=2xHn(x)=2xHn-1(x)-2(n-1)Hn-2(x) n>14、试求某个三位数ABC,要求满足以下条件:a)A>B>C>0b)交换A、C位置得到的新数比原数少495c)对ABC作全排列得到的6个三位数之和为28865、请编写程序,从键盘接收一个字符串,然后按照字符顺序从小到大进行排序,并删除重复的字符。
6、编写程序,从键盘输入若干行,输入后把它们存储到一个磁盘文件中,再从该文件中读取这些数据,将其中的小写字母转换成对应的大写字母后在屏幕上显示出来。
7、A、B、C、D、E、F这6个人参加百米决赛,甲、乙、丙、丁4人猜测谁是冠军:甲:冠军不是A就是B乙:冠军决不是C丙:冠军是C、D、E、F中的一位丁:冠军就B或D这4人所说的话只有一句是正确的,编写程序求谁是百米冠军。
8、有一磁盘文件"gstudent"内存放研究生(研究生数<10)数据,包括学号、姓名、性别、年龄、专业。
试编写程序完成以下功能:将学号、专业单独抽出来另建一个简明的研究生专业文件。
参考答案://1、请编写程序,利用随机函数模拟投币结果,设共投币100次,求"两个正面"、"两个反面"、"一正一反"三种情况各出现几次。
#include <stdio.h>#include <stdlib.h>#include <time.h>#define N 100void main(){int a1,a2,i,liangzheng,yizhyifan,liangfan;liangzheng=yizhyifan=liangfan=0;srand(time(NULL));for(i=1;i<=N;i++){a1=rand()%2;a2=rand()%2;if(a1*a2)liangzheng++;elseif(a1+a2==1)yizhyifan++;elseliangfan++;}printf("两正:%d 两反:%d 一正一反:%d\n",liangzheng,liangfan,yizhyifan); }//2、由用户输入出生日期和当前日期,请编写程序计算实际年龄。
//说明:计算出实际天数#include <stdio.h>int leapyear(int year){if((year%400==0)||((year%4==0)&&(year%100!=0)))return 1;elsereturn 0;}void main(){unsigned nian1,yue1,ri1,nian2,yue2,ri2,days=0,i;char yue[12]={31,28,31,30,31,30,31,31,30,31,30,31};nian1=999;yue1=10;ri1=12;nian2=2010;yue2=8;ri2=7;printf("出生日期:%d年%d月%d日\n",nian1,yue1,ri1); printf("当前日期:%d年%d月%d日\n",nian2,yue2,ri2); for(i=nian1+1;i<nian2;i++)if(leapyear(i))days+=366;elsedays+=365;for(i=12;i>yue1;i--)if(leapyear(nian1)&&i==2)days+=yue[i-1]+1;elsedays+=yue[i-1];if(leapyear(nian1)&&i==2)i=yue[yue1-1]+1;elsei=yue[yue1-1];for(;i>=ri1;i--)days++;for(i=1;i<yue2;i++)if(leapyear(nian2)&&i==2)days+=yue[i-1]+1;elsedays+=yue[i-1];for(i=1;i<=ri2;i++)days++;printf("共%d天\n",days-1);}//3、试编写程序求Hermite函数值://H0(x)=1//H1(x)=2x//Hn(x)=2xHn-1(x)-2(n-1)Hn-2(x) n>1//用递归算法实现#include <stdio.h>double f(int n,double x){if(n==0)return 1;elseif(n==1)return 2*x;elsereturn 2*x*f(n-1,x)-2*(n-1)*f(n-2,x); }void main(){double x;int n;printf("请输入x:");scanf("%lf",&x);do{printf("请输入要计算的项数(>=0):"); scanf("%d",&n);}while(n<0);printf("n=%4d,H(x)=%f\n",n,f(n,x));printf("\n");}//4、试求某个三位数ABC,要求满足以下条件://a)A>B>C>0//b)交换A、C位置得到的新数比原数少495//c)对ABC作全排列得到的6个三位数之和为2886 #include <stdio.h>void main(){unsigned a,b,c,data1,data2,data3;for(c=1;c<=9;c++)for(b=c+1;b<=9;b++)for(a=b+1;a<=9;a++){data1=a*100+b*10+c;data2=c*100+b*10+a;data3=(a*100+b*10+c)+(a*100+c*10+b)+(b*100+a*10+c)+(b*100+c*10+a)+(c*100+a*10+b)+(c*100+b*10+a );if((data2+495==data1)&&(data3==2886))printf("%d%d%d\n",a,b,c);}}//另一参考答案//4、试求某个三位数ABC,要求满足以下条件://a)A>B>C>0//b)交换A、C位置得到的新数比原数少495//c)对ABC作全排列得到的6个三位数之和为2886#include <stdio.h>#include <math.h>#define N 3void main(){int a[N],b,c,data1,data2,data3,i,j;for(a[0]=1;a[0]<=9;a[0]++)for(a[1]=a[0]+1;a[1]<=9;a[1]++)for(a[2]=a[1]+1;a[2]<=9;a[2]++){//以下代码求原数及逆置后两数的值data1=data2=0;for(i=0;i<N;i++){data1+=a[i]*(int)pow(10,N-i-1);data2+=a[i]*(int)pow(10,i);}//以下代码求全排列之和data3=0;for(i=0;i<N;i++)for(j=0;j<N;j++)data3+=(int)pow(10,j)*a[i];data3*=2;//判断是否符合条件,若符合条件则输出if((data2-495==data1)&&(data3==2886)){for(i=N-1;i>=0;i--)printf("%d",a[i]);printf("\n");}}}//5、请编写程序,从键盘接收一个字符串,然后按照字符顺序从小到大进行排序,并删除重复的字符。
#define N 80#include <stdio.h>#include <stdlib.h>#include <string.h>void main(){char str[N+1],i,j,ch;printf("请输入一个字符串,按回车键结束(长度不超过%d):\n",N); scanf("%80s",str);printf("原字符串为:\n");puts(str);for(i=1;i<strlen(str);i++)//排序for(j=0;j<strlen(str)-i;j++)if(str[j]>str[j+1]){ch=str[j+1];str[j+1]=str[j];str[j]=ch;}//消除重复字符ch='\0';i=j=0;while(str[j]!='\0'){if(str[j]!=ch){str[i]=str[j];ch=str[i++];}j++;}str[i]='\0';//给新串末尾置结束标志printf("新字符串为:\n");puts(str);}//6、编写程序,从键盘输入若干行,输入后把它们存储到一个磁盘文件中,再从该文件中读取这些数据,//将其中的小写字母转换成对应的大写字母后在屏幕上显示出来。
#include <stdio.h>#include <stdlib.h>#define N 80void main(){FILE *fp;char str[N+1],i,n,ch;do{printf("请输入行数:");scanf("%d",&n);}while(n<0);fp=fopen("data.txt","w");if(fp==NULL)printf("文件打开失败!\n");else{printf("请输入%d行文字,每行不超过%d个字符:\n",n,N); for(i=1;i<=n;i++){scanf("%80s",str);fprintf(fp,"%s",str);}fclose(fp);}fp=fopen("data.txt","r");if(fp==NULL)printf("文件打开失败!\n");else{fscanf(fp,"%c",&ch);while(!feof(fp)){if(ch>='a'&&ch<='z')putchar(ch-32);fscanf(fp,"%c",&ch);}fclose(fp);}printf("\n");}//7、A、B、C、D、E、F这6个人参加百米决赛,甲、乙、丙、丁4人猜测谁是冠军://甲:冠军不是A就是B//乙:冠军决不是C//丙:冠军是C、D、E、F中的一位//丁:冠军就B或D//这4人所说的话只有一句是正确的,编写程序求谁是百米冠军。