(式中代数和表达式中符号为二个“+”号后一个“-”号) 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