{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 { 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 {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 {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-w 检测方阵中其他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 {int c,d,j,k,n,t,t1,t2,s,w,x,y,z,m; int a[3000];