北大元培计算机模拟Word文档格式.docx
《北大元培计算机模拟Word文档格式.docx》由会员分享,可在线阅读,更多相关《北大元培计算机模拟Word文档格式.docx(25页珍藏版)》请在冰点文库上搜索。
Programming
I
chara[5000]={0},b[200][20]={0};
inti,j,n,p,q,max,min,c[200]={0},k;
gets(a);
for(k=0,i=0,j=0;
a[k]!
=0;
k++)
if(a[k]=='
'
||a[k]=='
'
){c[i++]=j;
j=0;
elseb[i][j++]=a[k];
c[i]=j;
n=i;
p=q=0;
max=min=c[0];
for(i=1;
if(c[i]>
max){max=c[i];
p=i;
elseif(c[i]<
min&
&
c[i]>
0){min=c[i];
q=i;
puts(b[p]);
puts(b[q]);
3
题目-n-gram串频统计
在文本分析中常用到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
第二行为字符串
输出最高频度以及频度最高的所有子串。
abcdefabcd
abc
bcd
string.h>
chara[510]={0},b[500][6]={0};
intl,i,j,n,m=0,c[500]={0},s;
%d\n"
l=strlen(a);
for(i=0;
=l-n;
for(j=0;
j<
n;
j++)
b[i][j]=a[i+j];
{s=1;
for(j=0;
i;
if(c[j]!
=-1)if(strcmp(b[j],b[i])==0){s=0;
c[j]+=1;
c[i]=-1;
break;
if(s)c[i]+=1;
m)m=c[i];
if(m==1)printf("
NO"
);
else{printf("
m);
if(c[i]==m)puts(b[i]);
4
题目-提取数字串按数值排序
输入一串不超过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;
aght88ir09kp
9,9,81,88,345,1234,6781,11101
chara[350]={0};
inti=-1,j,t=-1,n,b[350]={0},k,s,u;
for(k=0;
if(a[k]>
47&
a[k]<
58)if(t==-1){i++;
t=a[k]-48;
elset=t*10+a[k]-48;
elseif(t!
=-1){b[i]=t;
t=-1;
if(t!
=-1)b[i]=t;
n=i;
if(i==-1)printf("
0"
else{for(i=n;
i>
0;
i--)
if(b[j]>
b[j+1]){s=b[j];
b[j]=b[j+1];
b[j+1]=s;
};
u=n;
{printf("
b[i]);
u--;
if(u>
=0)printf("
"
}}
5
题目-降序生成进制数
按从大到小顺序依次输出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个(每行的最后一个数之后没有逗号)。
8843
2222,2221,2220,2212,2211,2210
2202,2201,2200,2122,2121,2120
2112,2111,2110,2102,2101,2100
2022,2021,2020,2012,2011,2010
2002,2001,2000,1222,1221,1220
1212,1211,1210,1202,1201,1200
1122,1121,1120,1112,1111,1110
1102,1101,1100,1022,1021,1020
1012,1011,1010,1002,1001,1000
0222,0221,0220,0212,0211,0210
0202,0201,0200,0122,0121,0120
0112,0111,0110,0102,0101,0100
0022,0021,0020,0012,0011,0010
0002,0001,0000
inta[35]={0};
ints=1,m,n,k,i,t=0;
%d%d%d"
n,&
k);
a[i]=k-1;
if(n==1)
{m=m<
k?
m:
k;
for(;
;
)
{printf("
a[0]);
if(--m<
=0)break;
if(++t%6==0)printf("
\n"
elseprintf("
a[0]-=1;
}}
elsefor(;
{for(i=0;
i++)printf("
a[i]);
if(a[n-1]>
0)a[n-1]-=1;
else{a[n-1]+=k-1;
a[n-2]-=1;
for(i=n-2;
if(a[i]<
0){a[i]+=k;
a[i-1]-=1;
if(a[0]<
0)break;
6
题目-最大零矩阵
有一个二位数组m(<
100)行,n(<
100)列,其元素为不大于100的非负整数。
现要找元素值均为0的最大子二维数组,其中行相邻,列也相邻,行数与列数之积最大(即,所含0元素最多),输出该最大积。
250081115
300001216
700001317
800711418
4000000
6000000
这是6行,7列构成的二维数组,其中:
由第4~5行(最后2行),第1~6列(最后6列)构成的子数组最大,共有12个0元素,因此,应该输出12。
其它情况下的子数组都不多于12个0元素,例如,第1~5行与第1~2列构成子数组为第二大数组,含有10个0元素。
第一行,m和n的值,以空格间隔,m和n均为不大于100的正整数
之后,共m行,每行共n个元素,其间用空格间格。
输出,最大零元素子二维数组所含的0元素个数,如果没有0元素,则输出0。
67
250081115
300001216
700001317
800711418
4000000
6000000
12
inta[101][101],i,j,k,l,m,n,u,v=0,p,q,t;
m;
scanf("
a[i][j]);
if(a[i][j]==0){
for(k=i;
k<
for(l=j;
l<
l++)
if(a[k][l]==0){t=1;
for(p=i;
p<
=k;
p++)
for(q=j;
q<
=l;
q++)
if(a[p][q]!
=0){t=0;
if(t){u=(k-i+1)*(l-j+1);
v)v=u;
}}}
v);
题目-中间值判断
任意给定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-225-69
左右边界点分别是[-6,9]
中间点为1和2,均出现。
如果出现,则输出YES
否则,输出NO
1-225-69
YES
inta[101]={0},i,t,n,min,max,s=0;
a[0]);
min=max=a[0];
{scanf("
a[i]);
if(a[i]>
max)max=a[i];
elseif(a[i]<
min)min=a[i];
if((max+min)%2==0){t=(max+min)/2;
i++)if(a[i]==t){s=1;
else{t=(max+min)/2;
i++)if((a[i]==t)||(a[i]==t+1)){s=1;
if(s)printf("
YES"
elseprintf("
题目-判断整数的奇偶性
有一串长度不超过500的符号序列,其中有数字和非数字。
请将其中的数字顺次拼起来,形成一个大的非负整数,判断该整数是奇数还是偶数。
若是奇数,则输出ODD;
若是偶数,输出EVEN。
如果整个串中没有数字,则输出NO。
一串长度不超过500的符号序列。
输出拼成的整数,给出逗号后再输出是奇数还是偶数。
如果输入序列中没有任何数字出现,则只输出NO。
如果拼成的整数大于0,则输出的整数第一位不得是0,如果拼成的整数为0,则输出为:
0,EVEN
kad0hskh01x,nnxv31kklk20xcmxc89k6zxjcnm3cjk
131208963,ODD
charc,d;
ints=0,t=0;
while((c=getchar())!
='
\n'
{
if(c>
c<
58){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("
elseif(t==0)printf("
0,EVEN"
elseif(d%2==0)printf("
EVEN"
ODD"
题目-与K相关的数
来源元培From-WHF
给定一个正整数K(其中,1<
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
intk,m=0,n=0,i,s,t,w=0;
%d,%d,%d"
k,&
{intv=0,u=0;
if(i%k==0)v=1;
elsefor(s=i;
s>
{t=s%10;
if(t==k){v=1;
u+=t;
s=s/10;
if(v==0)if(u%k==0)v=1;
if(v){if(w==1)printf("
"
printf("
i);
w=1;
if(w==0)printf("
NULL"
题目-最简真分数序列
所谓最简真分数是指分子小于分母,且不能约分的分数。
给定n(1<
200)个非负整数(每个整数不超过3位),哪两个整数分别作为分子和分母能够构成最简真分数。
输出所有的最简真分数组合;
若没有,则输出NO。
第1行为正整数个数n
其后为n个非负整数,空格间隔。
输出所有最简真分数,分子小的排在前面;
若分子相同,分母小的排在前面。
各分数之间用逗号间隔。
若没有,则输出NO
8
37110513159
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
intf(inti,intj)
if(i%j==0)return(j);
elsereturn(f(j,i-i/j*j));
inta[201]={0},b[201]={0},i,j,n,p,t=0,s=0;
scanf("
for(i=n-1;
if(a[j]>
a[j+1])
{p=a[j];
a[j]=a[j+1];
a[j+1]=p;
if(a[0]>
0)b[t++]=a[0];
if(a[i]!
=a[i-1])b[t++]=a[i];
t;
for(j=i+1;
if(f(b[i],b[j])==1){
if(s)printf("
printf("
%d/%d"
b[i],b[j]);
s=1;
题目-正整数的任意进制转换
将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进制数。
18,2345678A123,18
15,23456,18
12,2345678,20
16,12345678,23
25,3456AB,21
18,AB1234567,22
2345678A123
114E0
22B7A4
21A976L
7C2136
22JF0G367
voidrun(intd[],intp,intq)
{inti;
200;
d[i]=d[i]*p;
i++){
d[i+1]=d[i+1]+d[i]/q;
d[i]=d[i]%q;
voidmulti(intb[],intd[],inte,intq)
b[i]=b[i]+e*d[i];
{b[i+1]=b[i+1]+b[i]/q;
b[i]=b[i]%q;
intn;
n-->
{charc[200]={0};
inta[200]={0},b[200]={0},d[200]={0},p,q,i,j,s,l;
%d,%s"
p,c);
l=strlen(c)-1;
q=c[l]-48;
if(c[l-1]!
){q+=(c[l-1]-48)*10;
c[l-2]=0;
l=l-3;
else{c[l-1]=0;
l=l-2;
if(p==q)printf("
%s\n"
c);
else{
if(c[l-i]<
58)a[i]=c[l-i]-48;
elsea[i]=c[l-i]-55;
d[0]=1;
multi(b,d,a[0],q);
{run(d,p,q);
multi(b,d,a[i],q);
for(i=199;
if(b[i]!
l=i;