2011-2013年湖南理工学院程序设计试题(2)

2019-08-31 19:49

{s=1+a;b=sqrt(a);

for(k=2;k<=b;k++) // 试商寻求a的因数k if(fmod(a,k)==0)

s=s+k+a/k; // k与a/k是a的因数,求和

if(a==b*b) s=s-b; // 如果a=b^2,去掉重复因数b t=s/a; if(max

{max=t;a1=a;s1=s;} }

printf(\整数%.0f的因数比最大:%.4f \\n\printf(\的因数和为:%.0f \\n\printf(\输出其因数和式 for(s2=1+a1,k=2;k<=a1/2;k++) if(fmod(a1,k)==0)

{ s2+=k;printf(\printf(\

if(s1==s2) printf(\完成验证!\\n\}

程序运行示例:

求区间[x,y]中整数的因数比最大值. 请输入整数x,y:1000,2011 整数1680的因数比最大:3.5429 1680的因数和为:5952

1+2+3+4+5+6+7+8+10+12+14+15+16+20+21+24+28+30+35+40+42+48+56+60+70+80+84+105 +112+120+140+168+210+240+280+336+420+560+840+1680 =5952. 完成验证! 求区间[x,y]中整数的因数比最大值. 请输入整数x,y:10000,100000 整数55440的因数比最大:4.1870 55440的因数和为:232128

1+2+3+4+5+6+7+8+9+10+11+12+14+15+16+18+20+21+22+24+28+30+33+35+36+40+42+44+4 5+48+55+56+60+63+66+70+72+77+80+84+88+90+99+105+110+112+120+126+132+140+144+154+

165+168+176+180+198+210+220+231+240+252+264+280+308+315+330+336+360+385+396+420+

440+462+495+504+528+560+616+630+660+693+720+770+792+840+880+924+990+1008+1155+12

32+1260+1320+1386+1540+1584+1680+1848+1980+2310+2520+2640+2772+3080+3465+3696+39

60+4620+5040+5544+6160+6930+7920+9240+11088+13860+18480+27720+55440 =232128. 完成验证!

(6)变通:求k完全数 设整数a的所有因数(含1与本身)之和为s,若s为a的k倍,即s=k*a(k为指定的正整数),则称a为k完全数。

例如,6的因数有1,2,3,6,s=1+2+3+6=12=2*6,称6为2完全数。 试求指定区间[x,y]中整数的所有k完全数。

输入x,y,k, 输出区间[x,y]中整数的所有k完全数。

输入x=100,y=1000,k=3 输出:

输入x=10000,y=100000,k=4 输出: 1)设计要点

为了求整数a的因数和s,显然1与a是因数。设置j(2——sqrt(a))循环枚举,如果j是a的因数,

则a/j也是a的因数。

如果a=b*b,显然j=b,a/j=b,此时j=a/j。而因数b只有一个,所以此时必须从和s中减去一个b,这样处理以避免重复。 若s=k*a,则输出。 2)程序设计

// 求[x,y]范围内整数的k完全数 #include #include void main()

{ long a,s,b,j,x,y,k;

printf(\请输入整数x,y:\printf(\请输入整数k: \for(a=x;a<=y;a++) // 枚举区间内的所有整数a {s=1+a;b=sqrt(a);

for(j=2;j<=b;j++) // 试商寻求a的因数k if(a%j==0)

s=s+j+a/j; // k与a/k是a的因数,求和

if(a==b*b) s=s-b; // 如果a=b^2,去掉重复因数b if(s==k*a) printf(\} }

3)程序运行示例

请输入整数x,y:100,1000 请输入整数k: 3 120 672

请输入整数x,y:10000,100000 请输入整数k: 4 30240, 32760

4. 完美综合运算式

以下含加、减、乘、除的综合运算式的右边为一位非负整数f,请把数字0,1,2,...,9这10个数字中不同于数字 f 的 9个数字不能重复填入式左边的9个□中,?(约定数字“1”、“0”不出现在式左边的一位数中,“0”不为首位),使得该完美综合运算式成立 □□×□+□□□÷□-□□=f

例如,当f=5时,18*4+203/7-96=5 就是一个满足条件的完美综合运算式,数字0,1,2,...,9这10个数字在式中各出现一次。

输入整数f(0≤f≤9),输出对应的所有综合运算式。 输入整数f=6,输出对应的所有综合运算式。 输入整数f=8,输出对应的所有综合运算式。 (1)设计要点

设式左的5个整数从左至右分别为a,b,c,d,e,即 a*b+c/d-e=f,其中c为三位整数,a,e为二位整数,b,d为大于1的一位整数。

设置a,b,c,d循环,对每一组a,b,c,d,计算e=a*b+c/d-f。若其中的c/d非整数,或所得e非二位数,则返回。

然后分别对6个整数进行数字分离,设置g数组对6个整数分离的共9个数字进行统计,g(x)即为数字x(0—9)的个数。

若某一g(x)不为1,不满足数字0,1,...,9这10个数字都出现一次且只出现一次,标记t=1. 若所有g(x)全为1,满足数字0,1,...,9这10个数字都出现一次且只出现一次,保持标记t=0, 则输出所得的完美综合运算式。 设置n统计解的个数。 (2)程序设计

// 完美综合运算式设计1 #include void main()

{int x,y,t,k,a,b,c,d,e,f,n=0; int m[6],g[10];

printf(\请输入f: \for(a=10;a<=98;a++) for(b=2;b<=9;b++)

for(c=102;c<=987;c++) // 设置a,b,c,d穷举 for(d=2;d<=9;d++) { x=c/d;e=a*b+x-f;

if(c!=x*d || e>100) continue;

m[1]=a;m[2]=b;m[3]=c;m[4]=d;m[5]=e; for(x=0;x<=9;x++) g[x]=0;g[f]=1; for(k=1;k<=5;k++) { y=m[k]; while(y>0)

{ x=y;g[x]=g[x]+1;

y=y/10; // 分离数字f数组统计 } }

for(t=0,x=0;x<=9;x++) if(g[x]!=1)

{t=1; break;} // 检验数字0--9各只出现一次 if(t==0) // 输出一个解,用n统计个数 {n++;

printf(\} }

printf(\}

(3)程序运行示例 请输入f: 6

1: 18*4+203/7-95=6 2: 25*3+140/7-89=6 3: 37*2+108/4-95=6 请输入f: 8

1: 13*5+240/6-97=8 2: 16*3+270/5-94=8

(4)完美综合运算式设计2

由 a*b+c/d-e=f 推得 c=(f+e-a*b)*d // 完美综合运算式设计2 #include void main()

{int x,y,t,k,a,b,c,d,e,f,n=0; int m[6],g[10]; for(f=0;f<=9;f++) for(a=10;a<=98;a++) for(b=2;b<=9;b++)

for(d=2;d<=9;d++) // 设置a,b,d,e,f穷举 for(e=10;e<=98;e++) { c=(f+e-a*b)*d;

if(c<100 || c>=1000) continue;

m[1]=a;m[2]=b;m[3]=c;m[4]=d;m[5]=e; for(x=0;x<=9;x++) g[x]=0;g[f]=1; for(k=1;k<=5;k++) { y=m[k]; while(y>0)

{ x=y;g[x]=g[x]+1;

y=y/10; // 分离数字f数组统计 } }

for(t=0,x=0;x<=9;x++) if(g[x]!=1)

{t=1; break;} // 检验数字0--9各只出现一次 if(t==0) // 输出一个解,用n统计个数 {n++;

printf(\} }

printf(\}

5. 素数幻方

试寻求9个素数,构造一个3阶素数幻方:该方阵中3行、3列与两对角线上的3个素数之和均等于给定的整数(幻和)s。

输入s,输出所有幻和为s的3阶素数幻方。 输入789,输出所有3阶素数幻方。 输入2019,输出所有3阶素数幻方。

(1)数学建模

设素数幻方正中间数为n,幻和(即每行,每列与每对角线之和)为s。?注意到 (中间一行)+(中间一列)+2*(两对角线)=6s (上下行)+(左右列)=4s 两式相减即得

6n=2s → n=s/3 (1)

这意味着凡含n的行或列及对角线的三数中,除n之外的另两数与n相差等距。为此,设3阶素数幻方为: n-x n+w n-y

n+z n n-z (2) n+y n-w n+x

同时设方阵的两对角线的三数为大数在下(即x,y>0),下面一行三数为大数在右(即x>y)。这样约定是避免重复统计解。

显见,上述3×3方阵的中间一行,中间一列与两对角线上三数之和均为3n。?要使左右两列,上下两行的三数之和也为3n,当且仅当 x=y+z

w=x+y (x>y) (3)

同时易知9个素数中不能有偶素数2,因而x,y,z,w都只能是正偶数。 (2)程序设计

对于键盘输入的整数s, 如果存在幻和为s的素数幻方,则s应为中间素数的3倍。若s不是3的整数倍,则对输入的s,输出“无解!”而退出。

设置a数组,数组元素清“0”。通过试商判别,寻找出[3,s]中的所有素数k,并标注a[k]=1,为以后的判断提供依据。 设n=s/3,若a[n]==0,知n不是素数,显然不存在幻和为s的素数幻,显示“无解!”后退出。设幻方中的素数下界为c,上界为d。 显然c=3,注意到d+n+c=s,则d≤2n-3。 注意到 n-y≥3,(n+y)+n+(n-y)=s 得 2n+y=s-(n-y)≤s-3 即 y≤s-2n-3=n-3

在[2,n-3]中枚举y,在[y+2,n-3]枚举x,并按上述(3)式得z,w:

若出现x=2y,将导致z=y,方阵中出现两对相同的数,显然应予排除。 显然n-w是9个数中最小的,n+w是9个数中最大的。若n-wd,已超出[c,d]界限,应予以排除。

检测方阵中其他8个数n-x,n+w,n-y,n+z,n-z,n+y,n-w,n+x是否同时为素数,引用变量t1,t2,t1*t2为8个数的标记之积。若t1*t2=0,即8个数中存在非素数,返回。否则,已找到一个三阶素数幻方解,按方阵格式输出并用变量m统计基本解的个数。 这样处理,能较快的找出所有解,既无重复,也没有遗漏。 (3)程序清单

// 指定幻和的三阶素数幻方 #include #include void main()

{int c,d,j,k,n,t,t1,t2,s,w,x,y,z,m; int a[3000];


2011-2013年湖南理工学院程序设计试题(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:幼儿园安全保证书

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: