招聘面试程序设计竞赛选拔赛实训文档格式.docx
- 文档编号:18390486
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:12
- 大小:19.77KB
招聘面试程序设计竞赛选拔赛实训文档格式.docx
《招聘面试程序设计竞赛选拔赛实训文档格式.docx》由会员分享,可在线阅读,更多相关《招聘面试程序设计竞赛选拔赛实训文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
{d=t;
f=0;
g=0;
h=0;
for(j=1;
j<
=k+3;
j++)
{c=d%10;
d=d/10;
if(c==1)f++;
//统计数字1的个数
if(c==2)g++;
//统计数字2的个数
if(c==3)h++;
//统计数字3的个数
}
if(f==1&
&
g==2&
h==k)s++;
//统计个数s
s=%ld\n"
s);
(3)程序运行示例
4
s=105
5
s=168
(4)拓广
若需求k=100时的排列数,如何求?
1)注意到壹排k个“3”的空位共k+1个。
这k+1个选2个空位共C(k+1,2)种组合,每壹空位放置1个“2”。
这k+1个选1个空位共C(k+1,1)种组合,空位中放置2个“2”。
2)注意到壹排k个“3”和2个“2”的空位共k+3个。
这k+3个选1个空位共C(k+3,1)种组合,空位中放置1个“1”。
3)因而得不同的排列数为:
(C(k+1,2)+C(k+1,1))*C(k+3,1)=(k+1)*(k+2)*(k+3)/2
{intk;
longs;
请输入数字3的个数k:
s=(k+1)*(k+2)*(k+3)/2;
100
s=530553
(5)实训1
计算由2个“1”、2个“2”、k个“3”的排列数。
计算由3个“1”、2个“2”、k个“3”的排列数。
测试数据:
k=50
2、求最值
设n为正整数,,式中各项符号为二正壹负。
求当n为多大时,s(n)最接近指定的正整数a?
输入a,输出s(n)最接近a的n,s(n)。
(1)输入1000,输出:
(2)输入2011,输出:
解:
壹般地求当n为多大时,s(n)最接近正整数a?
其中a从键盘输入a。
//s(n)=1+1/(1+1/2)-1/(1+1/2+1/3)+...+1/(1+1/2+...+1/n)
math.h>
{longa,n,n1;
doublem,ts,s,s1;
请输入a:
a);
n=0;
ts=0;
m=100000.0;
while(s<
a+10)
{n=n+1;
ts=ts+(double)1/n;
//ts为各项的分母
if(n%3==0)
s=s-1/ts;
//求代数和s
else
s=s+1/ts;
if(fabs(s-a)<
m)//比较,当n=n1时,和s1最接近a
{m=fabs(s-a);
n1=n;
s1=s;
n=%ld,s(%d)=%f\n"
n1,n1,s1);
1000
n=29126,s(29126)=999.959989
2011
n=63376,s(63376)=2011.040087
实训2:
设n为正整数,,式中各项符号为二正壹负,分母符号壹正壹负。
a=2011
3、倒立的勾股数
把求勾股数变通为求倒立的勾股数。
定义满足方程式
的正整数x,y,z,称为壹组倒立的勾股数。
试求指定区间[a,b]内的倒立勾股数组。
(1)求指定区间[30,100]内的倒立勾股数组.
(2)求指定区间[100,200]内的倒立勾股数组.
显然,倒立勾股数组中x,y不可能相等,且x,y>
z。
为避免重复,不妨设x>
y>
于指定区间[a,b]上根据x,y,z的大小关系设置循环:
z从a至b-2,y从z+1至b-1,x从y+1至b。
对每壹组x,y,z,如果直接应用条件式
1/(x*x)+1/(y*y)=1/(z*z)
作判别,因分数计算的不可避免的误差,有可能把壹些成立的倒立勾股数组解遗失,即造成遗漏。
注意到上述分数条件式作通分整理得到的下面的正整数条件式
z*z*(x*x+y*y)=x*x*y*y
程序中为防止发生解的遗漏,应用上述整数条件作判别是适宜的。
(2)求区间内倒立勾股数程序设计
//求指定区间内倒立勾股数组
{inta,b,n;
longx,y,z;
求指定区间[a,b]内倒立的勾股数组."
\n请输入区间[a,b]的上下限a,b:
%d,%d"
a,&
b);
\n区间[%d,%d]中倒立的勾股数组有:
\n"
a,b);
for(z=a;
z<
=b-2;
z++)
for(y=z+1;
y<
=b-1;
y++)
for(x=y+1;
x<
=b;
x++)
if(z*z*(x*x+y*y)==x*x*y*y)//满足倒立勾股数条件时输出
{n++;
1/%ld^2+1/%ld^2=1/%ld^2\n"
x,y,z);
共%d组勾股数."
n);
区间[30,100]中倒立的勾股数组有:
1/60^2+1/45^2=1/36^2
1/80^2+1/60^2=1/48^2
1/100^2+1/75^2=1/60^2
共3组勾股数.
区间[100,200]中倒立的勾股数组有:
1/180^2+1/135^2=1/108^2
1/200^2+1/150^2=1/120^2
共2组勾股数.
4、双和数组
寻求6个互不相等的正整数a,b,c,d,e,f且分成(a,b,c)和(d,e,f)俩个组,若这俩组数具有以下俩个相等特性:
则把数组(a,b,c)和(d,e,f)称为双和数组(约定a<
b<
c,d<
e<
f,a<
d)。
1)设a+b+c=d+e+f=s,存于双和数组,s至少为多大?
2)当s=98时有多少个不同的双和数组?
(1)求解要点
从键盘输入整数s,因6个不同正整数之和至少为21,即输入整数s≥11。
设置a,b和d,e循环。
注意到a+b+c=s,且a<
c,因而a,b循环取值为:
a:
1——(s-3)/3。
因b比a至少大1,c比a至少大2。
b:
a+1——(s-a-1)/2。
因c比b至少大1。
c=s-a=b。
设置d,e循环基本同上,只是d>
a,因而d起点为a+1。
把比较倒数和相等1/a+1/b+1/c=1/d+1/e+1/f转化为比较整数相等
d*e*f*(b*c+c*a+a*b)=a*b*c*(e*f+f*d+d*e)(*)
若上式不成立,即倒数和不相等,则返回。
同时注意到俩个3元组中若部分相同部分不同,不能有倒数和相等,因而可省略排除之上6个正整数中是否存于相等的检测。
若式(*)成立,打印输出和为s的双和数组,且用x统计解的个数。
(2)C程序设计
//双和数组探索
{inta,b,c,d,e,f,x,s;
for(s=21;
s<
=100;
s++)
{printf("
s=%d:
x=0;
for(a=1;
a<
=(s-3)/3;
a++)
for(b=a+1;
=(s-a-1)/2;
b++)
for(d=a+1;
d<
d++)
for(e=d+1;
=(s-d-1)/2;
e++)
{c=s-a-b;
f=s-d-e;
if(a*b*c*(e*f+f*d+d*e)!
=d*e*f*(b*c+c*a+a*b))
continue;
//排除倒数和不相等
x++;
%3d:
(%2d,%2d,%2d)"
x,a,b,c);
(%2d,%2d,%2d)\n"
d,e,f);
if(x==0)printf("
无解!
(3)程序运行结果和讨论
s=26:
1:
(4,10,12)(5,6,15)
s=98:
(2,36,60)(3,5,90)
2:
(7,28,63)(8,18,72)
3:
(7,35,56)(8,20,70)
4:
(10,33,55)(12,20,66)
(4)实训3
则把数组(a,b,c)和(d,e,f)称为和积数组(约定a<
1)设a+b+c=d+e+f=s,存于和积数组,s至少为多大?
2)当s=89时有多少个不同的和积数组?
5、m位完美平方数
用0,1,2,...,9能组成多少个没有重复数字的m(1<
m≤10)位平方数?
输入m,输出没有重复数字的m位平方数的个数,且输出其中最大的。
m=7,输出:
m=10,输出:
//用0,1,2,...,9组成没有重复数字的m位平方数
{intk,m,n,t,f[10];
doublea,b,c,d,w,x,a1,d1;
请确定整数m:
m);
x=1.0;
for(k=2;
k<
=m;
k++)x=x*10;
//确定m位数的起点x
b=(int)pow(x,0.5);
c=pow(10*x-1,0.5);
for(a=b+1;
=c;
{d=a*a;
w=d;
//确保d为m位平方数
for(k=0;
=9;
k++)f[k]=0;
while(w>
0)
{t=(int)fmod(w,10);
f[t]=f[t]+1;
w=floor(w/10);
for(t=0,k=0;
k++)
if(f[k]>
1){t=1;
break;
}//测试平方数是否有重复数字
if(t==0)//测试平方数中没有重复数字
d1=d;
a1=a;
共可组成%d个没有重复数字的%d位平方数."
n,m);
其中最大的为:
%.0f=%.0f^2\n"
d1,a1);
7
共可组成123个没有重复数字的7位平方数.其中最大的为:
9872164=3142^2
10
共可组成87个没有重复数字的10位平方数.其中最大的为:
9814072356=99066^2
实训4:
用0,1,2,...,9能组成没有重复数字的m(1<
m≤10)位平方数的个数为s(m).
问:
(1)求s(10),即求出没有重复数字的10位平方数的个数。
(2)当m为多大时,没有重复数字的m位平方数个数s(m)最大?
6、最小01串积
程序设计爱好者A,B进行计算游戏:
B任给壹个正整数b,A寻求另壹个整数a,使a和b的积最小且全为0和1组成的数。
例如,B给出整数24,A寻求整数a:
4625,使得a*b的最小01串积为:
111000
输入b,输出a和最小01串积。
b=24,输出:
b=2011,输出:
(1)对a枚举
考虑到a和积d可能大于10位,用双精度型。
对a递增枚举,检测积d=a*b是否为01串
//01串积对a枚举
{longc,t;
doublea,b,d,j;
B给出整数b:
%lf"
a=1;
while
(1)
{a++;
d=a*b;
j=d;
t=0;
while(j>
0)//分离积的各个数字c
{c=(int)fmod(j,10);
j=floor(j/10);
if(c>
}//检测是否含有0,1以外的数字
if(t==0)
A寻求整数a:
%.0f:
a);
a*b的最小01串积为:
%.0f\n"
d);
73
137:
10001
54
203909465:
11011111110
(2)二进制枚举,应用余数判别。
1)注意到01串积为十进制数,应用求余运算“%”可分别求得个位“1”,十位“1”,…,分别除以已给b的余数,存放于c数组中:
c
(1)为1,c
(2)为10除以b的余数,c(3)为100除以b的余数,…。
2)要从小到大搜索01串,不重复也不遗漏,从中找出最小的能被b整除01串积。
为此,设置k从1开始递增,把k转化为二进制,就得到所需要的这些串。
不过,这时每个串不再见作二进制数,而要见作十进制数。
3)于某壹k转化为二进制数过程中,每转化壹位a(i)(0或1),求出该位除以b的余数a(i)*c(i),通过累加求和得k转化的整个二进制数除以b的余数s。
4)判别余数s是否被b整除:
若s%b=0,即找到所求最小的01串积。
a从高位开始除以b的商存储于d数组,实施整数除法运算:
x=e*10+a[j];
//e为上轮余数,x为被除数
d[j]=x/b;
//d为a从高位开始除以b的商
e=x%b;
//e为试商余数
去掉d数组的高位“0”后,输出d即为所寻求的数。
最后从高位开始打印a数组,即为01串积。
(3)程序设计
//01串积二进制枚举
{intb,e,i,j,t,x,a[2000],d[2000],c[2000];
longk,s;
c[1]=1;
for(i=2;
200;
i++)
c[i]=10*c[i-1]%b;
//c(i)为右边第i位1除以b的余数
k=1;
{k++;
j=k;
i=0;
{i++;
a[i]=j%2;
s+=a[i]*c[i];
j=j/2;
s=s%b;
//除2取余法转化为二进制
if(s%b==0)
{for(e=0,j=i;
j>
=1;
j--)
{x=e*10+a[j];
//a从高位开始除以b的商为d
j=i;
while(d[j]==0)j--;
//去掉d数组的高位"
0"
A寻求整数a:
for(t=j;
t>
t--)
d[t]);
\na*b的最小01串积为:
for(t=i;
a[t]);
(4)程序运行示例
54,A寻求整数a:
203909465
a*b的最小01串积为:
2011,A寻求整数a:
4977628101
10010010111111
(5)实训5
1)任给壹个正整数b,寻求另壹个整数a,使a和b的积最小且全为0和5组成的数。
2)任给壹个正整数b,寻求另壹个整数a,使a和b的积最小且全为2和5组成的数。
3)任给壹个正整数b,寻求另壹个整数a,使a和b的积最小且全为0、1、2组成的数。
b=54;
b=2011
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 招聘 面试 程序设计 竞赛 选拔赛