北大元培计算机,北大元培计算机模拟

北大元培计算机模拟

1题目 - 满足条件的数累加 来源 元培-From Whf 描述 将正整数 m 和 n 之间(包括 m 和 n)能被 17 整除的数累加。其中,m n关于输入 1行内输入整数m 和 n,其间,以空格间隔;关于输出 累加的结果例子输入 50 85例子输出 204#includestdio.hint main()int m,n,i,s=0;scanf(%d%d,&m,&n);for(i=m;i=n;i+)if(i%17=0)s+=i;printf(%d,s);2题目 - 最长最短单词 来源 计概 描述 输入1行单词,单词之间有一个空格,试输出第1个最长的单词和第1个最短单词。 如果所有单词长度相同,那么第一个单词既是最长单词也是最短单词。关于输入 两行, 第一行,一个整数n,表示单词数目(n200) 第二行,空格分开的n个单词。关于输出 两行输出 第1行,第一个最长的单词 第2行,第一个最短的单词例子输入 9I am studying Programming language C in Peking University例子输出 ProgrammingI#includestdio.hint main()char a5000=0,b20020=0;int i,j,n,p,q,max,min,c200=0,k;gets(a);for(k=0,i=0,j=0;ak!=0;k+)if(ak=,|ak= )ci+=j;j=0;else bij+=ak;ci=j;n=i;p=q=0;max=min=c0;for(i=1;i=n;i+)if(cimax)max=ci;p=i;else if(cimin&ci0)min=ci;q=i;puts(bp);puts(bq);3题目 - n-gram串频统计 来源 元培-From Whf 描述 在文本分析中常用到n-gram串频统计方法,即,统计相邻的n 个单元(如单词、汉字、或者字符)在整个文本中出现的频率。假设有一个字符串,请以字符为单位按n-gram 统计长度为 n 的子串出现的频度,并输出最高频度以及频度最高的子串。设定所给的字符串不多于500个字符,且 1 n 5。 如果有多个子串频度最高,则根据其在序列中第一次出现的次序输出多个,每行输出一个,如果最高频度不大于1,则输出 NO 例如,n=3,所给的串是:abcdefabcd, 则,所有的 3-gram是:abc,bcd,cde,def,efa,fab,abc,bcd。最后面的cd不足以形成3-gram,则不考虑。这样,abc 和 bcd 都出现了2次,其余的只出现了1次,于是,输出结果应该是: 2 abc bcd 关于输入 第一行为n 第二行为字符串 关于输出 输出最高频度以及频度最高的所有子串。例子输入 3abcdefabcd例子输出 2abcbcd#includestdio.h#includestring.hint main()char a510=0,b5006=0;int l,i,j,n,m=0,c500=0,s;scanf(%dn,&n);gets(a);l=strlen(a);for(i=0;i=l-n;i+)for(j=0;jn;j+)bij=ai+j;for(i=0;i=l-n;i+)s=1;for(j=0;ji;j+)if(cj!=-1)if(strcmp(bj,bi)=0)s=0;cj+=1;ci=-1;break;if(s)ci+=1;for(i=0;i=l-n;i+)if(cim)m=ci;if(m=1)printf(NO);else printf(%dn,m);for(i=0;i=l-n;i+)if(ci=m)puts(bi);4题目 - 提取数字串按数值排序 来源 元培-From Whf 描述 输入一串不超过300个字符的符号序列,请将其中的所有数字串提出,并将每个数字串作为整数看待(假设可以用int 表示),按从小到大顺序输出结果,输出的整数之间以逗号间隔。如果没有数字,则输出0;例如:*1234.345#6781ad9jk81-11101?aght88ir09kp,其中的整数包括:1234,345,6781,9,81,11101,88,9,从小到大排序后,应该输出: 9,9,81,88,345,1234,6781,11101 关于输入 在一行内输入一串符号关于输出 从小到大排序的整数序列,如果没有数字,则输出0;例子输入 *1234.345#6781ad9jk81-11101?aght88ir09kp例子输出 9,9,81,88,345,1234,6781,11101#includestdio.h#includestring.hint main()char a350=0;int i=-1,j,t=-1,n,b350=0,k,s,u;gets(a);for(k=0;ak!=0;k+)if(ak47&ak58)if(t=-1)i+;t=ak-48;else t=t*10+ak-48;else if(t!=-1)bi=t;t=-1;if(t!=-1)bi=t;n=i;if(i=-1)printf(0);elsefor(i=n;i0;i-)for(j=0;ji;j+)if(bjbj+1)s=bj;bj=bj+1;bj+1=s;u=n;for(i=0;i=n;i+)printf(%d,bi);u-;if(u=0)printf(,);5题目 - 降序生成进制数 来源 元培-From Whf 描述 按从大到小顺序依次输出 m( 0 ) 个 n 位( 0 ) 的 k (1 k 10)进制数, 注意: (1) 如果实际的 n 位 k 进制数不够 m 个,则按实际个数输出。例如:想输出 88 个4位3进制数,但所有4位3进制总共只有81个,因此,只需输出81个即可; (2) 如果实际的 n 位 k 进制数多于 m 个,则输出最大的 m 个。 假定 n 小于30位,m 可以用整数表示。关于输入 m,n 和 k 在一行内输入,空格间隔关于输出 输出的两个数之间用逗号间隔,如果输出的结果多于6个数,则分多行输出,每行输出6个值,最后一行可以少于6个(每行的最后一个数之后没有逗号)。例子输入 88 4 3例子输出 2222,2221,2220,2212,2211,22102202,2201,2200,2122,2121,21202112,2111,2110,2102,2101,21002022,2021,2020,2012,2011,20102002,2001,2000,1222,1221,12201212,1211,1210,1202,1201,12001122,1121,1120,1112,1111,11101102,1101,1100,1022,1021,10201012,1011,1010,1002,1001,10000222,0221,0220,0212,0211,02100202,0201,0200,0122,0121,01200112,0111,0110,0102,0101,01000022,0021,0020,0012,0011,00100002,0001,0000#includestdio.hint main()int a35=0;int s=1,m,n,k,i,t=0;scanf(%d%d%d,&m,&n,&k);for(i=0;in;i+)ai=k-1;if(n=1)m=mk?m:k;for(;)printf(%d,a0);if(-m=0)break;if(+t%6=0)printf(n);else printf(,);a0-=1;else for(;)for(i=0;in;i+)printf(%d,ai);if(-m=0)break;if(an-10)an-1-=1;else an-1+=k-1;an-2-=1;for(i=n-2;i0;i-)if(ai0)ai+=k;ai-1-=1;if(a00)break;if(+t%6=0)printf(n);else printf(,);6题目 - 最大零矩阵 来源 元培-From Whf 描述 有一个二位数组 m(100)行, n(100) 列,其元素为不大于100的非负整数。现要找元素值均为0的最大子二维数组,其中行相邻,列也相邻,行数与列数之积最大(即,所含0元素最多),输出该最大积。例如: 2 5 0 0 8 11 15 3 0 0 0 0 12 16 7 0 0 0 0 13 17 8 0 0 7 1 14 18 4 0 0 0 0 0 0 6 0 0 0 0 0 0 这是6行,7列构成的二维数组,其中:由第45行(最后2行),第16列(最后6列)构成的子数组最大,共有12个0元素,因此,应该输出 12。其它情况下的子数组都不多于12个0元素,例如,第15行与第12列构成子数组为第二大数组,含有10个0元素。 关于输入 第一行,m 和 n 的值,以空格间隔,m 和 n 均为 不大于 100 的正整数 之后,共 m 行,每行共 n 个元素,其间用空格间格。 关于输出 输出,最大零元素子二维数组所含的 0 元素个数,如果没有0元素,则输出0。例子输入 6 72 5 0 0 8 11 153 0 0 0 0 12 167 0 0 0 0 13 178 0 0 7 1 14 184 0 0 0 0 0 06 0 0 0 0 0 0例子输出 12#includestdio.h#includestring.hint main()int a101101,i,j,k,l,m,n,u,v=0,p,q,t;scanf(%d%d,&m,&n);for(i=0;im;i+)for(j=0;jn;j+)scanf(%d,&aij);for(i=0;im;i+)for(j=0;jn;j+)if(aij=0)for(k=i;km;k+)for(l=j;ln;l+)if(akl=0)t=1;for(p=i;p=k;p+)for(q=j;q=l;q+)if(apq!=0)t=0;break;break;if(t)u=(k-i+1)*(l-j+1);if(uv)v=u;printf(%d,v); 1题目 - 中间值判断 来源 元培-From Whf 描述 任意给定n个整数(n不大于100),这 n 个整数中的最小值min和最大值max确定了整数序列的左右边界。在这 n 个整数中,是否存在以最小值min和最大值max为左右边界的中间值。如果存在,则输出YES, 否则,输出NO。 例如: 三个数 1,3,5,则左边界是1,右边界是5,中间位置的值= (1 + 5 ) / 2 = 3,出现在序列中。 同样,如果是三个数 1,3,6,中间值是 3 或者 4,此时的3已出现,也成立。 但是,如果是三个数1,2,6,则没有出现中间值。关于输入 第一行:整数个数 n; 第二行:n个整数,其间以空格间隔; 如: 6 1 -2 2 5 -6 9 左右边界点分别是 -6, 9 中间点为 1 和 2,均出现。 关于输出 如果出现,则输出YES 否则,输出NO例子输入 61 -2 2 5 -6 9例子输出 YES#includestdio.h#includestring.hint main()int a101=0,i,t,n,min,max,s=0;scanf(%d,&n);scanf(%d,&a0);min=max=a0;for(i=1;in;i+)scanf(%d,&ai);if(aimax)max=ai;else if(aimin)min=ai;if(max+min)%2=0)t=(max+min)/2;for(i=0;in;i+)if(ai=t)s=1;break;elset=(max+min)/2;for(i=0;in;i+)if(ai=t)|(ai=t+1)s=1;break;if(s)printf(YES);else printf(NO);2题目 - 判断整数的奇偶性 来源 元培-From Whf 描述 有一串长度不超过500的符号序列,其中有数字和非数字。请将其中的数字顺次拼起来,形成一个大的非负整数,判断该整数是奇数还是偶数。若是奇数,则输出 ODD;若是偶数,输出 EVEN。如果整个串中没有数字,则输出 NO 。关于输入 一串长度不超过500的符号序列。关于输出 输出拼成的整数,给出逗号后再输出是奇数还是偶数。如果输入序列中没有任何数字出现,则只输出 NO。 注意:如果拼成的整数大于0,则输出的整数第一位不得是0,如果拼成的整数为 0,则输出为: 0,EVEN 例子输入 kad0hskh01x,nnxv31kklk20xcmxc89k6zxjcnm3cjk例子输出 ,ODD#includestdio.h#includestring.hint main()char c,d;int s=0,t=0;while(c=getchar()!=n)if(c47&c58)d=c;if(s=0)s=1;if(s=1)if(t=0)if(c!=48)t=1;if(t)putchar(c);if(s=0)printf(NO);else if(t=0)printf(0,EVEN);else if(d%2=0)printf(,EVEN);else printf(,ODD);3题目 - 与K相关的数 来源 元培 From-WHF 描述 给定一个正整数K (其中,1 k 10 ),在M, N的范围内找出与K相关的所有数X(即,10 M = X = N ),按从小到大输出这些数。若不存在这样的数,则输出NULL。 所谓一个数X与K相关,是指这个数一定满足如下三个条件之一: (1) 这个数中含有 K; (2) 这个数是 K的倍数; (3) 这个数的每位相加的和是K的倍数关于输入 K,M,N三个数,彼此之间用逗号间隔。关于输出 从小到大输出所有与K相关的数,彼此之间用分号间隔。若没有满足条件的数,则输出NULL。 例子输入 3,12,28例子输出 12;13;15;18;21;23;24;27#includestdio.h#includestring.hint main()int k,m=0,n=0,i,s,t,w=0;scanf(%d,%d,%d,&k,&m,&n);for(i=m;i=n;i+)int v=0,u=0;if(i%k=0)v=1;else for(s=i;s0;)t=s%10;if(t=k)v=1;break;u+=t;s=s/10;if(v=0)if(u%k=0)v=1;if(v)if(w=1)printf(;);printf(%d,i);w=1;if(w=0)printf(NULL);4题目 - 最简真分数序列 来源 元培-From Whf 描述 所谓最简真分数是指分子小于分母,且不能约分的分数。给定 n(1 n 200)个非负整数(每个整数不超过3位),哪两个整数分别作为分子和分母能够构成最简真分数。输出所有的最简真分数组合;若没有,则输出NO。 关于输入 第1行为正整数个数n 其后为n个非负整数,空格间隔。关于输出 输出所有最简真分数,分子小的排在前面;若分子相同,分母小的排在前面。各分数之间用逗号间隔。 若没有,则输出NO例子输入 83 7 11 0 5 13 15 9例子输出 3/5,3/7,3/11,3/13,5/7,5/9,5/11,5/13,7/9,7/11,7/13,7/15,9/11,9/13,11/13,11/15,13/15#includestdio.h#includestring.hint f(int i,int j)if(i%j=0)return(j);else return(f(j,i-i/j*j);int main()int a201=0,b201=0,i,j,n,p,t=0,s=0;scanf(%d,&n);for(i=0;in;i+)scanf(%d,&ai);for(i=n-1;i=0;i-)for(j=0;ji;j+)if(ajaj+1)p=aj;aj=aj+1;aj+1=p;if(a00)bt+=a0;for(i=1;in;i+)if(ai!=ai-1)bt+=ai;for(i=0;it;i+)for(j=i+1;jt;j+)if(f(bi,bj)=1)if(s)printf(,);printf(%d/%d,bi,bj);s=1;if(s=0)printf(NO);5题目 - 正整数的任意进制转换 来源 元培-From Whf 描述 将 p 进制 n 转换为 q 进制。p 和 q 的取值范围为【2,36】,其中,用到的数码按从小到大依次为:0,1,2,3,4,5,6,7,8,9,A,B,.,Z,不考虑小写字母。 注意:n 的长度不超过50位。 三个数之间用逗号间隔。关于输入 1+m 行, 第1行为 m,表示后面有 m 行,m不小于1. 其后的m行中,每行3个数: 进制p,p进制数n,以及进制 q。 三个数之间用逗号间隔关于输出 转换后的 q 进制数。例子输入 618,A123,1815,23456,1812,2016,2325,3456AB,2118,AB,22例子输出 A123114E022B7A421A976L7C213622JF0G367#includestdio.h#includestring.hvoid run(int d,int p,int q)int i;for(i=0;i200;i+)di=di*p;for(i=0;i200;i+)di+1=di+1+di/q;di=di%q;void multi(int b,int d,int e,int q)int i;for(i=0;i200;i+)bi=bi+e*di;for(i=0;i200;i+)bi+1=bi+1+bi/q;bi=bi%q;int main()int n;scanf(%d,&n);for(;n-0;)char c200=0;int a200=0,b200=0,d200=0,p,q,i,j,s,l;scanf(%d,%s,&p,c);l=strlen(c)-1;q=cl-48;if(cl-1!=,)q+=(cl-1-48)*10;cl-2=0;l=l-3;else cl-1=0;l=l-2;if(p=q)printf(%sn,c);elsefor(i=0;i=l;i+)if(cl-i58)ai=cl-i-48;else ai=cl-i-55;d0=1;multi(b,d,a0,q);for(i=1;i=l;i+)run(d,p,q);multi(b,d,ai,q);for(i=199;i-)if(bi!=0)break;l=i;for(i=0;i=l;i+)if(bi10)cl-i=bi+48;else cl-i=bi+55;cl+1=0;printf(%sn,c);6题目 - 最长等差数列子集 来源 元培-From Whf 描述 一个等差数列是指以增序排列后,相邻的两个数后一个与前一个数之差值恒定。规定一个等差数列中的数不应少于3个。任给 n ( 2 n 5000)个正整数,请判断可否从中选择子集构成等差数列。若能,则选出满足条件的最大子集合(即,元素个数最多),并按从小到大输出子集中的元素,逗号间隔。若有多个子集同时满足最大,则取差值最大的子集;若同时有多个子集满足集合大小最大,且差值也相等,则取起始元素最大的子集。如果没有满足条件的子集合,则输出 NO. 例如,有10个元素:20,14,6,15,22,7,23,8,18,25 从6开始的最长等差数列是:6,7,8 和 6,14,22 从7开始的最长等差数列是:7,15,23 从8开始的最长等差数列是:8,14,20 和 8,15,22 从14开始的最长等差数列是:14,18,22 从15开始的最长等差数列是:15,20,25 从18开始的最长等差数列是:18,20,22 上述7个最长序列中,长度都为3。按差值看,6,14,22 和 7,15,23 同时最大,但 7 6,因此,结果应该选 7,15,23关于输入 2行: 第1行,n,表示整数个数; 第2行,n 个正整数,空格间隔; 关于输出 按增序输出最长等差数列子集,逗号间隔。例子输入 1020 14 6 15 22 7 23 8 18 25例子输出 7,15,23#includestdio.h#includestring.hint f(int a,int n,int i,int j)int k,s=0;for(k=j+1;kn;k+)if(ak+aiaj*2)break;else if(ak+ai=aj*2)s=1;break;if(s)return(f(a,n,j,k)+1);else return(2);int main()int a5001=0,d,l=0,b,i,j,t,s=0,n,p,m=0;scanf(%d,&n);for(i=0;in;i+)scanf(%d,&ai);for(i=n-1;i=0;i-)for(j=0;ji;j+)if(ajaj+1)p=aj;aj=aj+1;aj+1=p;for(i=0;in-1;i+)for(j=i+1;jn;j+)if(jn+1-l)break;if(ai+(l-1)*(aj-ai)an-1)continue;t=f(a,n,i,j);if(tl)l=t;d=aj-ai;b=ai;else if(t=l&aj-aid)d=aj-ai;b=ai;else if(t=l&aj-ai=d&aib)b=ai;if(l2)for(i=0;il;i+)if(s)printf(,);printf(%d,b);b+=d;s=1;else printf(NO

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值