蓝桥杯习题
蓝桥杯练习系统习题加答案更新新地址(已更新200左右习题)
http://blog.csdn.net/rodestillfaraway
目录
算法训练(详见 算法-蓝桥杯习题(一))Go
算法训练(详见 算法-蓝桥杯习题(二))Go
算法提高(waiting...)
历届试题(详见 算法-蓝桥杯习题(六))Go
历届试题(详见 算法-蓝桥杯习题(七))Go
蓝桥杯练习系统评测数据
链接:
http://pan.baidu.com/s/1mhophTQ
密码: m2pa
算法训练(111题)
1 /* 2 算法训练 明明的随机数 3 4 问题描述 5 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。 6 输入格式 7 输入有2行,第1行为1个正整数,表示所生成的随机数的个数: 8 N 9 第2行有N个用空格隔开的正整数,为所产生的随机数。 10 输出格式 11 输出也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。 12 样例输入 13 10 14 20 40 32 67 40 20 89 300 400 15 15 样例输出 16 8 17 15 20 32 40 67 89 300 400 18 题目来源 19 计13李震摘编自NOIP06PJ01 20 */ 21 #include <stdio.h> 22 #define MaxSize 100+5 23 24 void printArray(int array[],int lenth) 25 { 26 int i; 27 28 printf("%d ",lenth); 29 for(i=0;i<lenth;i++) 30 { 31 printf("%d ",array[i]); 32 } 33 printf(" "); 34 35 return ; 36 } 37 38 void sortArray(int array[],int lenth) 39 { 40 int i,j; 41 42 for(i=0;i<lenth;i++) 43 { 44 for(j=lenth-1;j>i;j--) 45 { 46 if(array[j]<array[j-1]) 47 { 48 int temp; 49 temp=array[j]; 50 array[j]=array[j-1]; 51 array[j-1]=temp; 52 } 53 } 54 } 55 56 return ; 57 } 58 59 main() 60 { 61 int N,m,i,j; 62 int array[MaxSize]; 63 64 scanf("%d",&N); 65 m=N; 66 for(i=0;i<m;i++) 67 { 68 scanf("%d",&array[i]); 69 for(j=0;j<i;j++) 70 { 71 if(array[i]==array[j]) 72 { 73 i--; 74 m--; 75 continue; 76 } 77 } 78 } 79 80 sortArray(array,m); 81 82 printArray(array,m); 83 84 return 0; 85 }
1 /* 2 算法训练 字符串的展开 3 4 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母获数字串替代其中的减号,即,将上面两个子串分别输出为“defgh”和“45678”。在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活。具体约定如下: 5 (1) 遇到下面的情况需要做字符串的展开:在输入的字符串中,出现了减号“-”,减号两侧同为小写字母或同为数字,且按照ASCII码的顺序,减号右边的字符严格大于左边的字符。 6 (2) 参数p1:展开方式。p1=1时,对于字母子串,填充小写字母;p1=2时,对于字母子串,填充大写字母。这两种情况下数字子串的填充方式相同。p1=3时,不论是字母子串还是数字字串,都用与要填充的字母个数相同的星号“*”来填充。 7 (3) 参数p2:填充字符的重复个数。p2=k表示同一个字符要连续填充k个。例如,当p2=3时,子串“d-h”应扩展为“deeefffgggh”。减号两边的字符不变。 8 (4) 参数p3:是否改为逆序:p3=1表示维持原来顺序,p3=2表示采用逆序输出,注意这时候仍然不包括减号两端的字符。例如当p1=1、p2=2、p3=2时,子串“d-h”应扩展为“dggffeeh”。 9 (5) 如果减号右边的字符恰好是左边字符的后继,只删除中间的减号,例如:“d-e”应输出为“de”,“3-4”应输出为“34”。如果减号右边的字符按照ASCII码的顺序小于或等于左边字符,输出时,要保留中间的减号,例如:“d-d”应输出为“d-d”,“3-1”应输出为“3-1”。 10 输入格式 11 输入包括两行: 12 第1行为用空格隔开的3个正整数,一次表示参数p1,p2,p3。 13 第2行为一行字符串,仅由数字、小写字母和减号“-”组成。行首和行末均无空格。 14 输出格式 15 输出只有一行,为展开后的字符串。 16 输入输出样例1 17 输入格式 18 输出格式 19 1 2 1 20 abcs-w1234-9s-4zz 21 abcsttuuvvw1234556677889s-4zz 22 输入输出样例2 23 输入格式 24 输出格式 25 2 3 2 26 a-d-d 27 aCCCBBBd-d 28 输入输出样例3 29 输入格式 30 输出格式 31 3 4 2 32 di-jkstra2-6 33 dijkstra2************6 34 数据规模和约定 35 40%的数据满足:字符串长度不超过5 36 100%的数据满足:1<=p1<=3,1<=p2<=8,1<=p3<=2。字符串长度不超过100 37 */ 38 #include<stdio.h> 39 #include<stdlib.h> 40 #include<string.h> 41 void fill(char a) 42 { 43 } 44 int main() 45 { 46 char s[120]={0}; 47 memset(s,0,sizeof(s)); 48 int p1,p2,p3,i,j,k; 49 scanf("%d%d%d",&p1,&p2,&p3); 50 scanf("%s",s); 51 for(i=0;i<strlen(s);i++) 52 { 53 if(s[i]=='-') 54 { 55 if(s[i-1]>='a' && s[i-1]<='z' && s[i+1]>='a' && s[i+1]<='z' && s[i+1]>s[i-1] 56 || s[i-1]>='0' && s[i-1]<='9' && s[i+1]>='0' && s[i+1]<='9' && s[i+1]>s[i-1]) 57 { 58 if(p1==3) 59 { 60 for(j=1;j<=p2*(s[i+1]-s[i-1]-1);j++) 61 { 62 printf("*"); 63 } 64 } 65 else 66 { 67 if(s[i-1]>='0' && s[i-1]<='9' && s[i+1]>='0' && s[i+1]<='9') 68 { 69 if(p3==1) 70 { 71 for(j=s[i-1]+1;j<=s[i+1]-1;j++) 72 { 73 for(k=1;k<=p2;k++) 74 { 75 printf("%c",j); 76 } 77 } 78 } 79 else 80 { 81 for(j=s[i+1]-1;j>=s[i-1]+1;j--) 82 { 83 for(k=1;k<=p2;k++) 84 { 85 printf("%c",j); 86 } 87 } 88 } 89 } 90 else 91 { 92 if(p3==1) 93 { 94 for(j=s[i-1]+1;j<=s[i+1]-1;j++) 95 { 96 for(k=1;k<=p2;k++) 97 { 98 printf("%c",p1==1?j:j-32); 99 } 100 } 101 } 102 else 103 { 104 for(j=s[i+1]-1;j>=s[i-1]+1;j--) 105 { 106 for(k=1;k<=p2;k++) 107 { 108 printf("%c",p1==1?j:j-32); 109 } 110 } 111 } 112 } 113 } 114 } 115 else 116 { 117 printf("%c",s[i]); 118 } 119 } 120 else 121 { 122 printf("%c",s[i]); 123 } 124 } 125 return 0; 126 }
1 /* 2 算法训练 貌似化学 3 4 问题描述 5 现在有a,b,c三种原料,如果他们按x:y:z混合,就能产生一种神奇的物品d。 6 当然不一定只产生一份d,但a,b,c的最简比一定是x:y:z 7 现在给你3种可供选择的物品: 8 每个物品都是由a,b,c以一定比例组合成的,求出最少的物品数,使得他们能凑出整数个d物品(这里的最少是指三者个数的总和最少) 9 输入格式 10 第一行三个整数,表示d的配比(x,y,z) 11 接下来三行,表示三种物品的配比,每行三个整数(<=10000)。 12 输出格式 13 四个整数,分别表示在最少物品总数的前提下a,b,c,d的个数(d是由a,b,c配得的) 14 目标答案<=10000 15 如果不存在满足条件的方案,输出NONE 16 样例输入 17 3 4 5 18 1 2 3 19 3 7 1 20 2 1 2 21 样例输出 22 8 1 5 7 23 */
1 /* 2 算法训练 最大体积 3 4 问题描述 5 每个物品有一定的体积(废话),不同的物品组合,装入背包会战用一定的总体积。假如每个物品有无限件可用,那么有些体积是永远也装不出来的。为了尽量装满背包,附中的OIER想要研究一下物品不能装出的最大体积。题目保证有解,如果是有限解,保证不超过2,000,000,000 6 如果是无限解,则输出0 7 输入格式 8 第一行一个整数n(n<=10),表示物品的件数 9 第2行到N+1行: 每件物品的体积(1<= <=500) 10 输出格式 11 一个整数ans,表示不能用这些物品得到的最大体积。 12 样例输入 13 3 14 3 15 6 16 10 17 样例输出 18 17 19 */ 20 #include <stdio.h> 21 int n; 22 int a[510]; 23 int f[100001]; 24 void swap(int *a,int *b) 25 { 26 int c; 27 c=*a; 28 *a=*b; 29 *b=c; 30 } 31 int gcd(int a,int b) 32 { 33 if(a>b) 34 swap(&a,&b); 35 if(a==0) 36 return b; 37 return gcd(b%a,a); 38 } 39 int main() 40 { 41 int i,j,t; 42 scanf("%d",&n); 43 for(i=1;i<=n;i++) 44 scanf("%d",&a[i]); 45 t=a[1]; 46 for(i=2;i<=n;i++) 47 t=gcd(t,a[i]); 48 if(t!=1) 49 { 50 printf("0 "); 51 return 0; 52 } 53 else 54 { 55 f[0]=1; 56 for(i=1;i<=n;i++) 57 { 58 for(j=a[i];j<=65536;j++) 59 f[j] |= f[j-a[i]]; 60 } 61 for(i=65536;i>=0;i--) 62 { 63 if(!f[i]) 64 { 65 printf("%d ",i); 66 return 0; 67 } 68 } 69 printf("0 "); 70 return 0; 71 } 72 }
1 /* 2 算法训练 9-7链表数据求和操作 3 4 读入10个复数,建立对应链表,然后求所有复数的和。 5 样例输入 6 1 2 7 1 3 8 4 5 9 2 3 10 3 1 11 2 1 12 4 2 13 2 2 14 3 3 15 1 1 16 样例输出 17 23+23i 18 */ 19 #include <stdio.h> 20 21 main() 22 { 23 int i,j,k,time=10,m=0,n=0; 24 25 for(k=0;k<time;k++) 26 { 27 scanf("%d%d",&i,&j); 28 m+=i; 29 n+=j; 30 } 31 32 printf("%d+%di ",m,n); 33 34 return 0; 35 } 36 /* 37 #include <stdio.h> 38 #include <malloc.h> 39 typedef struct linknode 40 { 41 int x; 42 int y; 43 struct linknode *next; 44 }node; 45 46 int main() 47 { 48 node *begin=(node *)malloc(sizeof(node)); 49 node *q=begin,*p; 50 int m=0,n=0; 51 scanf("%d%d",&q->x,&q->y); 52 int i; 53 for(i=1;i<10;i++) 54 { 55 p=(node *)malloc(sizeof(node)); 56 scanf("%d%d",&p->x,&p->y); 57 q->next=p; 58 q=p; 59 } 60 p->next=NULL; 61 while(begin!=NULL) 62 { 63 m+=begin->x; 64 n+=begin->y; 65 begin=begin->next; 66 } 67 printf("%d+%di",m,n); 68 return 0; 69 } 70 */
1 /* 2 算法训练 6-3判定字符位置 3 4 返回给定字符串s中元音字母的首次出现位置。英语元音字母只有‘a’、‘e’、‘i’、‘o’、‘u’五个。 5 若字符串中没有元音字母,则返回0。 6 只考虑小写的情况。 7 样例输入 8 and 9 样例输出 10 1 11 */ 12 #include <stdio.h> 13 #include <string.h> 14 #define MaxSize 1000 15 16 main() 17 { 18 char str[MaxSize]; 19 int lenth,i; 20 21 gets(str); 22 lenth=strlen(str); 23 24 for(i=0;i<lenth;i++) 25 { 26 if(str[i]=='a'||str[i]=='e'||str[i]=='i'||str[i]=='o'||str[i]=='u') 27 { 28 printf("%d ",i+1); 29 return 0; 30 } 31 } 32 printf("0 "); 33 34 return 0; 35 }
1 /* 2 算法训练 黑色星期五 3 4 问题描述 5 有些西方人比较迷信,如果某个月的13号正好是星期五,他们就会觉得不太吉利,用古人的说法,就是“诸事不宜”。请你编写一个程序,统计出在某个特定的年份中,出现了多少次既是13号又是星期五的情形,以帮助你的迷信朋友解决难题。 6 说明:(1)一年有365天,闰年有366天,所谓闰年,即能被4整除且不能被100整除的年份,或是既能被100整除也能被400整除的年份;(2)已知1998年1月1日是星期四,用户输入的年份肯定大于或等于1998年。 7 输入格式:输入只有一行,即某个特定的年份(大于或等于1998年)。 8 输出格式:输出只有一行,即在这一年中,出现了多少次既是13号又是星期五的情形。 9 输入输出样例 10 样例输入 11 1998 12 样例输出 13 3 14 */ 15 #include <stdio.h> 16 17 int getWeekOfFirstDay(int year) 18 { 19 //已知1998年1月1日是星期四 20 int i=1998,week=3; 21 int days=0; 22 23 for(i=1998;i<year;i++) 24 { 25 if(i%400==0||(i%4==0&&i%100!=0)) 26 days+=366; 27 else 28 days+=365; 29 } 30 31 return (days+week)%7; 32 } 33 34 void printBlackFridayTimes(int year) 35 { 36 int day[2][12]={{31,28,31,30,31,30,31,31,30,31,30},{31,29,31,30,31,30,31,31,30,31,30}}; 37 int week=getWeekOfFirstDay(year),flag=year%400==0||(year%4==0&&year%100!=0)?1:0; 38 int times=0,i,days=0; 39 40 //遍历12个月 41 for(i=0;i<12;i++) 42 { 43 //判断每个月13号是否是黑色星期五 44 if((days+12+week)%7==4) 45 times++; 46 47 days+=day[flag][i]; 48 } 49 50 printf("%d ",times); 51 return ; 52 } 53 54 main() 55 { 56 int year; 57 58 scanf("%d",&year); 59 printBlackFridayTimes(year); 60 61 return 0; 62 }
1 /* 2 算法训练 阿尔法乘积 3 4 问题描述 5 计算一个整数的阿尔法乘积。对于一个整数x来说,它的阿尔法乘积是这样来计算的:如果x是一个个位数,那么它的阿尔法乘积就是它本身;否则的话,x的阿尔法乘积就等于它的各位非0的数字相乘所得到的那个整数的阿尔法乘积。例如:4018224312的阿尔法乘积等于8,它是按照以下的步骤来计算的: 6 4018224312 → 4*1*8*2*2*4*3*1*2 → 3072 → 3*7*2 → 42 → 4*2 → 8 7 编写一个程序,输入一个正整数(该整数不会超过6,000,000),输出它的阿尔法乘积。 8 输入格式:输入只有一行,即一个正整数。 9 输出格式:输出相应的阿尔法乘积。 10 输入输出样例 11 样例输入 12 4018224312 13 样例输出 14 8 15 */ 16 #include <stdio.h> 17 18 void getResult(long long int num) 19 { 20 long long int n=1; 21 int i; 22 23 //出口设计 24 if(num<10) 25 { 26 printf("%I64d ",num); 27 28 return ; 29 } 30 31 //相似设计 32 do 33 { 34 i=num%10; 35 num/=10; 36 if(i) 37 { 38 n*=i; 39 } 40 } 41 while(num); 42 43 //递归调用 44 getResult(n); 45 46 } 47 48 main() 49 { 50 long long int num; 51 52 scanf("%I64d",&num); 53 getResult(num); 54 55 return 0; 56 }
1 /* 2 算法训练 完数 3 4 问题描述 5 一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1、2、3,而6=1+2+3,因此6就是“完数”。又如,28的因子为1、2、4、7、14,而28=1+2+4+7+14,因此28也是“完数”。编写一个程序,判断用户输入的一个数是否为“完数”。 6 输入格式:输入只有一行,即一个整数。 7 输出格式:输出只有一行,如果该数为完数,输出yes,否则输出no。 8 输入输出样例 9 样例输入 10 6 11 样例输出 12 yes 13 */ 14 #include <stdio.h> 15 16 void getResult(int num) 17 { 18 int i,sum=0; 19 20 for(i=1;i<num;i++) 21 { 22 if(num%i==0) 23 { 24 sum+=i; 25 } 26 } 27 28 if(sum==num) 29 { 30 printf("yes "); 31 } 32 else 33 { 34 printf("no "); 35 } 36 37 } 38 39 main() 40 { 41 int num; 42 43 scanf("%d",&num); 44 getResult(num); 45 46 return 0; 47 }
1 /* 2 算法训练 数对 3 4 问题描述 5 编写一个程序,该程序从用户读入一个整数,然后列出所有的数对,每个数对的乘积即为该数。 6 输入格式:输入只有一行,即一个整数。 7 输出格式:输出有若干行,每一行是一个乘法式子。(注意:运算符号与数字之间有一个空格) 8 输入输出样例 9 样例输入 10 32 11 样例输出 12 1 * 32 = 32 13 2 * 16 = 32 14 4 * 8 = 32 15 8 * 4 = 32 16 16 * 2 = 32 17 32 * 1 = 32 18 */ 19 #include <stdio.h> 20 21 void getResult(int num) 22 { 23 int i; 24 25 for(i=1;i<=num;i++) 26 { 27 if(num%i==0) 28 { 29 printf("%d * %d = %d ",i,num/i,num); 30 } 31 } 32 33 return ; 34 } 35 36 main() 37 { 38 int num; 39 40 scanf("%d",&num); 41 42 getResult(num); 43 44 return 0; 45 }
1 /* 2 算法训练 整除问题 3 4 问题描述 5 编写一个程序,输入三个正整数min、max和factor,然后对于min到max之间的每一个整数(包括min和max),如果它能被factor整除,就把它打印出来。 6 输入格式:输入只有一行,包括三个整数min、max和factor。 7 输出格式:输出只有一行,包括若干个整数。 8 输入输出样例 9 样例输入 10 1 10 3 11 样例输出 12 3 6 9 13 */ 14 #include <stdio.h> 15 16 void getResult(int min,int max,int factor) 17 { 18 int i; 19 20 for(i=min;i<=max;i++) 21 { 22 if(i%factor==0) 23 { 24 printf("%d ",i); 25 } 26 } 27 printf(" "); 28 29 return ; 30 } 31 32 main() 33 { 34 int min,max,factor; 35 36 scanf("%d%d%d",&min,&max,&factor); 37 getResult(min,max,factor); 38 39 return 0; 40 }
1 /* 2 算法训练 薪水计算 3 4 问题描述 5 编写一个程序,计算员工的周薪。薪水的计算是以小时为单位,如果在一周的时间内,员工工作的时间不超过40 个小时,那么他/她的总收入等于工作时间乘以每小时的薪水。如果员工工作的时间在40 到50 个小时之间,那么对于前40 个小时,仍按常规方法计算;而对于剩余的超额部分,每小时的薪水按1.5 倍计算。如果员工工作的时间超过了50 个小时,那么对于前40 个小时,仍按常规方法计算;对于40~50 个小时之间的部分,每小时的薪水按1.5 倍计算;而对于超出50 个小时的部分,每小时的薪水按2 倍计算。请编写一个程序,输入员工的工作时间和每小时的薪水,然后计算并显示他/她应该得到的周薪。 6 输入格式:输入只有一行,包括一个整数和一个实数,分别表示工作时间和每小时薪水。 7 输出格式:输出只有一个实数,表示周薪,保留小数点后2位。 8 输入输出样例 9 样例输入 10 40 50 11 样例输出 12 2000.00 13 */ 14 #include <stdio.h> 15 16 main() 17 { 18 int time; 19 float money,sum; 20 21 scanf("%d%f",&time,&money); 22 if(time<=40) 23 { 24 sum=time*money; 25 printf("%.2f ",sum); 26 } 27 else 28 { 29 time-=40; 30 if(time<=10) 31 { 32 sum=time*money*1.5+40*money; 33 printf("%.2f ",sum); 34 } 35 else 36 { 37 time-=10; 38 sum=time*money*2+10*money*1.5+40*money; 39 printf("%.2f ",sum); 40 } 41 } 42 43 return 0; 44 }
1 /* 2 算法训练 数位分离 3 4 问题描述 5 编写一个程序,输入一个1000 以内的正整数,然后把这个整数的每一位数字都分离出来,并逐一地显示。 6 输入格式:输入只有一行,即一个1000以内的正整数。 7 输出格式:输出只有一行,即该整数的每一位数字,之间用空格隔开。 8 输入输出样例 9 样例输入 10 769 11 样例输出 12 7 6 9 13 */ 14 #include <stdio.h> 15 16 void getResult(int num) 17 { 18 //出口 19 if(num<10) 20 { 21 printf("%d ",num); 22 return ; 23 } 24 //递归 25 getResult(num/10); 26 27 printf("%d ",num%10); 28 } 29 30 main() 31 { 32 int n; 33 34 scanf("%d",&n); 35 getResult(n); 36 printf(" "); 37 38 return 0; 39 }
1 /* 2 算法训练 Hello World! 3 4 描述 5 本题定义本学期作业题的输出格式,请认真阅读。 6 如无特殊说明,开头无空格,间隔符为1个空格,答案最后必须输出换行符(" ")。 7 输入格式 8 无 9 输出格式 10 Hello World! 11 */ 12 #include <stdio.h> 13 14 main() 15 { 16 printf("Hello World! "); 17 18 return 0; 19 }
1 /* 2 算法训练 新生舞会 3 4 问题描述 5 新生舞会开始了。n名新生每人有三个属性:姓名、学号、性别。其中,姓名用长度不超过20的仅由大小写字母构成的字符串表示,学号用长度不超过10的仅由数字构成的字符串表示,性别用一个大写字符‘F’或‘M’表示。任意两人的姓名、学号均互不相同。换言之,每个人可被其姓名或学号唯一确定。给出m对两人的信息(姓名或学号),判断他们是否能共舞。两人能共舞的充要条件为两人性别相异。 6 输入格式 7 第一行一个整数n(2<=n<=1000),表示学生人数。接下来的n行每行依次包含一名新生的姓名、学号、性别,分别用一个空格隔开。 8 之后的一行是一个整数m(1<=m<=1000),表示询问的数目。接着的m行每行包含两个信息(姓名或学号),保证两个信息不属于同一人,中间用一个空格隔开。 9 输出格式 10 对于每个询问输出一行,如果两人可以共舞,输出一个大写字母‘Y’,否则输出一个大写字母‘N’。 11 样例输入 12 4 13 John 10 M 14 Jack 11 M 15 Kate 20 F 16 Jim 21 M 17 3 18 John 11 19 20 Jack 20 Jim Jack 21 样例输出 22 N 23 Y 24 N 25 26 提示 27 可以把名字和学号都当成字符串处理。可以按以下流程实现。 28 29 #include<iostream> 30 #include<cstring> 31 using namespace std; 32 33 struct tstudent 34 { 35 char name[21]; 36 char num[21]; 37 char sex; 38 }; 39 40 void readdata(tstudent student[], int n) 41 { 42 输入N个学生的信息 43 } 44 45 int findstudent(tstudent student[], int n, char* data) 46 { 47 if (data == NULL) return -1; 48 49 判断是否有某个学生的学号或名字等于data,如果有,函数返回该学生在student数组中的序号,否则返回-1 50 } 51 52 void solve(tstudent student[], int n, int m) 53 { 54 char x[21], y[21]; 55 for (int i=0; i<m; i++) { 56 输入两个人的信息X、Y。通过调用findstudent函数判断这两个人能否成为舞伴 57 } 58 } 59 60 int main() 61 { 62 int n, m; 63 tstudent student[1010]; 64 65 cin>>n; 66 67 readdata(student, n); 68 cin>>m; 69 solve(student, n, m); 70 } 71 */ 72 #include <stdio.h> 73 #include <string.h> 74 #define MaxSize 1000+5 75 76 typedef struct 77 { 78 char name[21]; 79 char num[21]; 80 char sex; 81 }tstudent; 82 83 void readdata(tstudent student[], int n) 84 { 85 int i; 86 //输入N个学生的信息 87 for(i=0;i<n;i++) 88 { 89 scanf("%s %s %c",student[i].name,student[i].num,&student[i].sex); 90 } 91 } 92 93 int findstudent(tstudent student[], int n, char* data) 94 { 95 int i; 96 97 if (data == NULL) 98 { 99 return -1; 100 } 101 //判断是否有某个学生的学号或名字等于data,如果有,函数返回该学生在student数组中的序号,否则返回- 102 for(i=0;i<n;i++) 103 { 104 if(!strcmp(data,student[i].name)||!strcmp(data,student[i].num)) 105 return i; 106 } 107 108 return -1; 109 } 110 111 void solve(tstudent student[], int n, int m) 112 { 113 char x[21], y[21]; 114 int i,a,b; 115 116 for (i=0; i<m; i++) 117 { 118 //输入两个人的信息X、Y。通过调用findstudent函数判断这两个人能否成为舞伴 119 scanf("%s %s",x,y); 120 if((a=findstudent(student,n,x))!=-1&&(b=findstudent(student,n,y))!=-1) 121 { 122 if(student[a].sex!=student[b].sex) 123 printf("Y "); 124 else 125 printf("N "); 126 } 127 else 128 { 129 printf("N "); 130 } 131 } 132 } 133 134 int main() 135 { 136 int n, m; 137 tstudent student[MaxSize]; 138 139 scanf("%d",&n); 140 readdata(student, n); 141 142 scanf("%d",&m); 143 solve(student, n, m); 144 145 return ; 146 }
1 /* 2 算法训练 反置数 3 4 问题描述 5 一个整数的“反置数”指的是把该整数的每一位数字的顺序颠倒过来所得到的另一个整数。如果一个整数的末尾是以0结尾,那么在它的反置数当中,这些0就被省略掉了。比如说,1245的反置数是5421,而1200的反置数是21。请编写一个程序,输入两个整数,然后计算这两个整数的反置数之和sum,然后再把sum的反置数打印出来。要求:由于在本题中需要多次去计算一个整数的反置数,因此必须把这部分代码抽象为一个函数的形式。 6 输入格式:输入只有一行,包括两个整数,中间用空格隔开。 7 输出格式:输出只有一行,即相应的结果。 8 输入输出样例 9 样例输入 10 435 754 11 样例输出 12 199 13 */ 14 #include <stdio.h> 15 #include <math.h> 16 17 int getTheNumber(int num) 18 { 19 int number=1,i,j=1,flag=0; 20 21 if(!num) 22 return 0; 23 24 while(num) 25 { 26 i=num%10; 27 if(i||flag) 28 { 29 if(!flag) 30 { 31 number=i; 32 } 33 else 34 { 35 number=number*10+i; 36 } 37 flag=1; 38 } 39 num/=10; 40 } 41 42 return number; 43 } 44 45 main() 46 { 47 int n,m; 48 49 scanf("%d%d",&n,&m); 50 51 printf("%d ",getTheNumber(getTheNumber(n)+getTheNumber(m))); 52 53 return 0; 54 }
1 /* 2 算法训练 字符删除 3 4 问题描述 5 编写一个程序,先输入一个字符串str(长度不超过20),再输入单独的一个字符ch,然后程序会把字符串str当中出现的所有的ch字符都删掉,从而得到一个新的字符串str2,然后把这个字符串打印出来。 6 输入格式:输入有两行,第一行是一个字符串(内部没有空格),第二行是一个字符。 7 输出格式:经过处理以后的字符串。 8 输入输出样例 9 样例输入 10 123-45-678 11 - 12 样例输出 13 12345678 14 */ 15 #include <stdio.h> 16 #include <string.h> 17 #define MaxSize 20+5 18 19 void printResult(char str[],char ch) 20 { 21 int i; 22 for(i=0;i<strlen(str);i++) 23 { 24 if(str[i]!=ch) 25 { 26 printf("%c",str[i]); 27 } 28 } 29 printf(" "); 30 } 31 32 main() 33 { 34 char ch,str[MaxSize]; 35 36 //if(scanf("%s %c",str,&ch)!=EOF) 37 if(gets(str)!=NULL) 38 { 39 scanf("%c",&ch); 40 printResult(str,ch); 41 } 42 43 return 0; 44 }
1 /* 2 算法训练 字串统计 3 4 问题描述 5 给定一个长度为n的字符串S,还有一个数字L,统计长度大于等于L的出现次数最多的子串(不同的出现可以相交),如果有多个,输出最长的,如果仍然有多个,输出第一次出现最早的。 6 输入格式 7 第一行一个数字L。 8 第二行是字符串S。 9 L大于0,且不超过S的长度。 10 输出格式 11 一行,题目要求的字符串。 12 13 输入样例1: 14 4 15 bbaabbaaaaa 16 17 输出样例1: 18 bbaa 19 20 输入样例2: 21 2 22 bbaabbaaaaa 23 24 输出样例2: 25 aa 26 数据规模和约定 27 n<=60 28 S中所有字符都是小写英文字母。 29 30 提示 31 枚举所有可能的子串,统计出现次数,找出符合条件的那个 32 */ 33 #include<stdio.h> 34 #include<string.h> 35 char b[60][60]; 36 int c[60]; 37 int main() 38 { 39 int l,i1,max=1,now=0,maxn=1,i2,weizhi=0,i3,i4,weizhi1,changdu1=-1; 40 41 char a[10000]; 42 scanf("%d",&l); 43 getchar(); 44 gets(a); 45 int n=strlen(a); 46 47 for(i1=n;i1>=l;i1--)//长度 48 { 49 weizhi=0; 50 for(i3=0;i3<n-i1;i3++) 51 c[i3]=0; 52 for(i2=0;i2<n;i2++)//开始位置 53 { 54 if(i2+i1>n) 55 break; 56 int ok=1; 57 58 59 for(i3=0;i3<weizhi;i3++)//b的位置 60 { int ko=1; 61 for(i4=0;i4<i1;i4++) 62 { 63 if(b[i3][i4]!=a[i2+i4]) 64 ko=0; 65 66 } 67 if(ko) 68 { ok=0; 69 c[i3]++; 70 if(c[i3]>max) 71 {max=c[i3]; 72 changdu1=i1; 73 weizhi1=i2; 74 } 75 break; 76 } 77 78 } 79 80 if(ok) 81 { 82 for(i4=0;i4<i1;i4++) 83 { 84 b[weizhi][i4]=a[i2+i4]; 85 } 86 c[weizhi]=1; 87 weizhi++; 88 } 89 90 91 } 92 93 94 95 } 96 97 for(i1=weizhi1;i1<weizhi1+changdu1;i1++) 98 printf("%c",a[i1]); 99 printf(" "); 100 return 0; 101 }
1 /* 2 算法训练 进制转换 3 4 问题描述 5 编写一个程序,输入一个二进制的字符串(长度不超过32),然后计算出相应的十进制整数,并把它打印出来。 6 输入格式:输入为一个字符串,每个字符都是’0’或’1’,字符串的长度不超过32。 7 输出格式:输出一个整数。 8 输入输出样例 9 样例输入 10 1101 11 样例输出 12 13 13 */ 14 #include <stdio.h> 15 #include <math.h> 16 #include <string.h> 17 #define MaxSize 32 18 19 void print2Return10(char str[]) 20 { 21 long long int num=0; 22 int lenth=strlen(str),i; 23 24 for(i=0;i<lenth;i++) 25 { 26 if(str[i]!='0') 27 { 28 num+=pow(2,lenth-i-1); 29 } 30 } 31 32 printf("%lld ",num); 33 34 return ; 35 } 36 37 main() 38 { 39 char str[MaxSize]; 40 41 gets(str); 42 print2Return10(str); 43 44 return 0; 45 }
1 /* 2 算法训练 阶乘 3 4 问题描述 5 一个整数n的阶乘可以写成n!,它表示从1到n这n个整数的乘积。阶乘的增长速度非常快,例如,13!就已经比较大了,已经无法存放在一个整型变量中;而35!就更大了,它已经无法存放在一个浮点型变量中。因此,当n比较大时,去计算n!是非常困难的。幸运的是,在本题中,我们的任务不是去计算n!,而是去计算n!最右边的那个非0的数字是多少。例如,5! = 1*2*3*4*5 = 120,因此5!最右边的那个非0的数字是2。再如:7! = 5040,因此7!最右边的那个非0的数字是4。请编写一个程序,输入一个整数n(n<=100),然后输出n! 最右边的那个非0的数字是多少。 6 输入格式:输入只有一个整数n。 7 输出格式:输出只有一个整数,即n! 最右边的那个非0的数字。 8 输入输出样例 9 样例输入 10 6 11 样例输出 12 2 13 */ 14 #include<stdio.h> 15 16 int main(void) 17 { 18 int n; 19 int i; 20 int sum=1; 21 scanf("%d",&n); 22 23 for(i=n;i>=1;i--) 24 { 25 sum = sum*i; 26 while(sum%10==0) 27 sum=sum/10; 28 if(sum/100>0) 29 sum=sum%100; 30 } 31 32 printf("%d",sum%10); 33 34 return 0; 35 }
1 /* 2 算法训练 输出米字形 3 4 根据输入的正整数n (1 米字形由一个(2n-1)*(2n-1)的矩阵组成,矩阵包含从大写A开始的n个字母 5 例如:n=3时,包含A,B,C;n=4时,包含A,B,C,D。 6 矩阵的正中间为n个字母中字典序最大的那个,从这个字母开始,沿着西北、正北、东北、正西、正东、西南、正南、东南八个方向各有一条由大写字母组成的直线。并且直线上的字母按字典序依次减小,直到大写字母A。 7 矩阵的其它位置用英文句号.填充。 8 9 样例输入一 10 3 11 12 样例输出一 13 A.A.A 14 .BBB. 15 ABCBA 16 .BBB. 17 A.A.A 18 19 样例输入二 20 4 21 22 样例输出二 23 A..A..A 24 .B.B.B. 25 ..CCC.. 26 ABCDCBA 27 ..CCC.. 28 .B.B.B. 29 A..A..A 30 */ 31 #include <stdio.h> 32 int main() 33 { 34 int n,i,j,k,t; 35 scanf("%d",&n); 36 char a[2*n-1][2*n-1]; 37 for(i=0;i<2*n-1;i++) 38 for(j=0;j<2*n-1;j++) 39 a[i][j]=0; 40 k=n; 41 42 for(i=0;i<n-1;i++) //行数 43 { 44 k--; //k为字符间隔 45 t=i; 46 for(j=1;j<=3;j++) 47 { 48 a[i][t]='A'+i; 49 t+=k; 50 } 51 } 52 for(i=0;i<n;i++) //中间一行 53 { 54 a[n-1][i]='A'+i; 55 a[n-1][2*n-2-i]='A'+i; 56 } 57 for(i=0;i<=n-2;i++) //填补句号 58 for(j=0;j<2*n-1;j++) 59 { 60 if(a[i][j]==0) 61 a[i][j]='.'; 62 } 63 64 for(i=0;i<=n-2;i++) //翻转 65 for(j=0;j<2*n-1;j++) 66 a[2*n-2-i][j]=a[i][j]; 67 68 for(i=0;i<2*n-1;i++) 69 { 70 for(j=0;j<2*n-1;j++) 71 printf("%c",a[i][j]); 72 printf(" "); 73 } 74 75 76 return 0; 77 }
1 /* 2 算法训练 整数平均值 3 4 编写函数,求包含n个元素的整数数组中元素的平均值。要求在函数内部使用指针操纵数组元素,其中n个整数从键盘输入,输出为其平均值。 样例输入: (输入格式说明:5为输入数据的个数,3 4 0 0 2 是以空格隔开的5个整数) 5 5 6 3 4 0 0 2 7 样例输出 8 1 9 样例输入 10 7 11 3 2 7 5 2 9 1 12 样例输出 13 4 14 */ 15 #include <stdio.h> 16 int main() 17 { 18 int n,i,j,sum=0; 19 scanf("%d",&n); 20 for(i=0;i<n;i++) 21 { 22 scanf("%d",&j); 23 sum+=j; 24 } 25 printf("%d",sum/n); 26 return 0; 27 }
1 /* 2 算法训练 确定元音字母位置 3 4 输入一个字符串,编写程序输出该字符串中元音字母的首次出现位置,如果没有元音字母输出0。英语元音字母只有‘a’、‘e’、‘i’、‘o’、‘u’五个。 5 样例输入 6 hello 7 样例输出 8 2 9 样例输入 10 apple 11 样例输出 12 1 13 样例输入 14 pmp 15 样例输出 16 0 17 */ 18 #include <stdio.h> 19 #include <string.h> 20 char s[1000]={0}; 21 int isyuanyin(char a) 22 { 23 switch(a) 24 { 25 case 'a':return 1; 26 case 'e':return 1; 27 case 'i':return 1; 28 case 'o':return 1; 29 case 'u':return 1; 30 } 31 return 0; 32 } 33 int main() 34 { 35 int l,i,num=0; 36 scanf("%s",s); 37 l=strlen(s); 38 for(i=0;i<l;i++) 39 if(isyuanyin(s[i])) 40 { 41 num=i+1;break; 42 } 43 printf("%d",num); 44 return 0; 45 }
1 /* 2 算法训练 斜率计算 3 4 输入两个点的坐标,即p1 = (x1, y1)和p2=(x2, y2),求过这两个点的直线的斜率。如果斜率为无穷大输出“INF”。 5 样例输入 6 1 2 7 2 4 8 样例输出 9 2 10 样例输入 11 1 2 12 1 4 13 样例输出 14 INF 15 样例输入 16 1 2 17 3 2 18 样例输出 19 0 20 */ 21 #include <stdio.h> 22 int main(){ 23 int a,b,c,d; 24 scanf("%d %d",&a,&b); 25 scanf("%d %d",&c,&d); 26 if(a==c) 27 printf("INF "); 28 else 29 printf("%d ",(b-d)/(a-c)); 30 31 return 0; 32 }
1 /* 2 算法训练 十进制数转八进制数 3 4 编写函数把一个十进制数输出其对应的八进制数。 5 样例输入 6 9274 7 样例输出 8 22072 9 */ 10 #include<stdio.h> 11 int main() 12 { 13 int r; 14 scanf("%d",&r); 15 printf("%o",r); 16 return 0; 17 }
1 /* 2 算法训练 筛选号码 3 4 问题描述 5 有n个人围成一圈,顺序排号(编号为1到n)。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子。从下一个人开始继续报数,直到剩下最后一个人,游戏结束。 6 问最后留下的是原来第几号的那位。 7 举个例子,8个人围成一圈: 8 1 2 3 4 5 6 7 8 9 第1次报数之后,3退出,剩下: 10 1 2 4 5 6 7 8 (现在从4开始报数) 11 第2次报数之后,6退出,剩下: 12 1 2 4 5 7 8 (现在从7开始报数) 13 第3次报数之后,1退出,剩下: 14 2 4 5 7 8 (现在从2开始报数) 15 第4次报数之后,5退出,剩下: 16 2 4 7 8 (现在从7开始报数) 17 第5次报数之后,2退出,剩下: 18 4 7 8 (现在从4开始报数) 19 第6次报数之后,8退出,剩下: 20 4 7 (现在从4开始报数) 21 最后一次报数之后,4退出,剩下: 22 7. 23 所以,最后留下来的人编号是7。 24 输入格式 25 一个正整数n,(1<n<10000) 26 输出格式 27 一个正整数,最后留下来的那个人的编号。 28 样例输入 29 8 30 样例输出 31 7 32 数据规模和约定 33 对于100%的数据,1<n<10000。 34 */ 35 #include <stdio.h> 36 #include <malloc.h> 37 typedef struct form{ 38 int num; 39 int date; 40 struct form *link;} 41 del; 42 del *creat(int n){ 43 int i; 44 del *head,*p1,*p2; 45 head=(del *)malloc(sizeof(del)); 46 p1=(del *)malloc(sizeof(del)); 47 head->link=p1; 48 for(i=1;i<=n-2;i++){p2=(del *)malloc(sizeof(del)); 49 p1->link=p2; 50 p1=p2;} 51 p1->link=head; 52 return(head); 53 } 54 void dateop(del *h,int n){ 55 del *p; 56 int i,j=1; 57 p=h; 58 for(i=1;i<=n;i++){ 59 p->num=i; 60 p->date=j;j++; 61 if(j==4) j=1; 62 p=p->link;} 63 } 64 int deal(del *h,int n){ 65 del *k; 66 int s; 67 int count,j=1,i; 68 count=n; 69 k=h; 70 while(count!=1){ 71 if(j==3&&k->date!=0) {k->date=0;count--;} 72 k=k->link; 73 j++; 74 if(k->date==0) j--; 75 if(j==4) j=1; 76 } 77 k=h; 78 for(i=1;i<=n;i++){ 79 if(k->date!=0) {s=k->num;break;} 80 k=k->link;} 81 return(s);} 82 int main(){ 83 int x; 84 int i; 85 del *p; 86 scanf("%d",&x); 87 p=creat(x); 88 dateop(p,x); 89 x=deal(p,x); 90 for(i=1;i<x;i++){ 91 p=p->link;} 92 printf("%d",p->num); 93 return 0; 94 }
1 /* 2 算法训练 连接字符串 3 4 编程将两个字符串连接起来。例如country与side相连接成为countryside。 5 输入两行,每行一个字符串(只包含小写字母,长度不超过100);输出一行一个字符串。 6 样例输入 7 country 8 side 9 样例输出 10 countryside 11 */ 12 #include<stdio.h> 13 #include<string.h> 14 int main() 15 { 16 char s1[202],s2[202]; 17 scanf("%s",s1); 18 scanf("%s",s2); 19 strcat(s1,s2); 20 printf("%s",s1); 21 printf(" "); 22 return 0; 23 }
1 /* 2 算法训练 统计字符次数 3 4 输入一个字符串(长度在100以内),统计其中数字字符出现的次数。 5 样例输入 6 Ab100cd200 7 样例输出 8 6 9 */ 10 #include<stdio.h> 11 int main() 12 { 13 char a[101]; 14 int i=0,s=0; 15 gets(a); 16 for(i=0;*(a+i)!='