(式中代数和表达式中符号为二个“+”号后一个“-”号) 2. 设计要点 一般地,解不等式
d?1?12?13?14?15?16???1n (4)
(其中d为从键盘输入的正数)
式中符号为二个“+”号后一个“-”号,即分母能被3整除时为“-”,式中出现减运算,导致不等式的解可能分段。
设置条件循环,每三项(包含二正一负)一起求和,得一个区间解。 然后回过头来一项项求和,得个别离散解。 (2) 程序设计
// 解不等式:d<1+1/2-1/3+1/4+1/5-1/6+...+-1/n #include
printf(\请输入正整数d: \ scanf(\
printf(\?+-1/n 的解:\ n=1;s=0; while(1)
{ s=s+1.0/n+1.0/(n+1)-1.0/(n+2); if(s>d) break; n=n+3;
}
printf(\得一个区间解 k=1;s=0; while(k { if(k%3>0) s=s+1.0/k; else s=s-1.0/k; if(s>d) // 得一个离散解 printf(\ k++; } } (3) 程序运行示例 请输入正整数d: 5 5<1+1/2-1/3+1/4+1/5-1/6+?+-1/n 的解: 13 n>=203938 n=203936 注意:前一个是区间解,后一个是离散解。要特别注意,不要把后一个解遗失。 2.5 求最值 求最值通常是程序设计最具魅力的课题之一。本节介绍两个有趣的最值案例求解,是运用穷举求解的典型手法。 2.5.1 基于素数的代数和 1. 案例提出 定义和: s(n)?13?35?57?79?911?1113???2n?12n?1 (和式中第k项±(2k-1)/(2k+1)的符号识别:分子分母中有且只有一个素数,取“+”;分子分母中没有素数或两个都是素数时取“-”。) 1) 求s(2011)(精确到小数点后5位)。 2) 设1<=n<=2011,当n为多大时,s(n)最大。 3) 设1<=n<=2011,当n为多大时,s(n)最接近0。 2. 设计要点 在求和之前应用“试商判别法”对第k个奇数2k-1是否为素数进行标注: 若2k-1为素数,标注a[k]=1; 否则,若2k-1不是素数,a[k]=0。 设置k循环(1——n),循环中分别情况求和: 若a[k]+a[k+1]=1,即(2k-1)与(2k+1)中有且只有一个素数,实施“+”; 否则,若a[k]+a[k+1]!=0,即(2k-1)与(2k+1)中没有素数或有两个素数,实施“-”。 同时,设置最大变量smax,最接近“0”的绝对值变量mi。 在循环中,每计算一个和值s,与smax比较确定最大值,同时记录此时的项数k1; 因s可正可负,s的绝对值与mi比较确定最接近“0”的绝对值,记录此时的项数k2,同时记录此时的和值s2。 最后,求和循环结束时输出所求值。 3. 程序实现 // 基于素数的分数和 14 #include void main() { int t,j,n,k,k1,k2,a[3000]; double s,s2,smax,mi; printf(\请输入整数n: \ scanf(\ for(k=1;k<=n+1;k++) a[k]=0; for(k=2;k<=n+1;k++) {for(t=0,j=3;j<=sqrt(2*k-1);j+=2) if((2*k-1)%j==0) {t=1;break;} if(t==0) a[k]=1; // 标记第k个奇数2k-1为素数 } s=0;smax=0;mi=10; for(k=1;k<=n;k++) {if(a[k]+a[k+1]==1) // 判断a[k]与a[k+1]中有一个素数 s+=(double)(2*k-1)/(2*k+1); // 实施加 else s-=(double)(2*k-1)/(2*k+1); // 否则,实施减 if(s>smax) {smax=s;k1=k;} // 比较求最大值smax if(fabs(s) {mi=fabs(s);k2=k;s2=s;} // 绝对值比较求最接近0点 } printf(\ printf(\当k=%d时s有最大值: %.5f\\n\printf(\当k=%d时s=%.5f最接近0. \\n\} 4. 程序运行示例 请输入整数n: 2011 s(2011)=-211.88387 当k=387时s有最大值: 35.88835 当k=785时s=-0.04341最接近0. 2.5.2 整数的因数比 1. 案例提出 设整数a的小于其本身的因数之和为s,定义 15 p(a)=s/a 为整数a的因数比。 事实上,a为完全数时,p(a)=1。 有些资料还介绍了因数之和为数本身2倍的整数,如p(120)=2。 试求指定区间[x,y]中整数的因数比最大值。 2. 设计要点 设置max存储因数比最大值。穷举区间内每一整数a,求得其因数和s。通过s/a与max比较求取因数比最大值。 对比较得因数比最大的整数,通过试商输出其因数和式。 3. 程序实现 // 求[x,y]范围内整数的因数比最大值 #include { double a,s,a1,s1,b,k,t,x,y,max=0; printf(\求区间[x,y]中整数的因数比最大值.\ printf(\请输入整数x,y:\ scanf(\ for(a=x;a<=y;a++) // 穷举区间内的所有整数a {s=1;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 printf(\整数%.0f的因数比最大:%.4f \\n\ printf(\的因数和为:\\n\ printf(\输出其因数和式 for(k=2;k<=a1/2;k++) if(fmod(a1,k)==0) printf(\} (3) 程序运行示例 求区间[x,y]中整数的因数比最大值.请输入整数x,y: 1,2011 整数1680的因数比最大:2.5429 16