代数和概念:数学用语。将数(实数)的加减法算式视为省略加号的几个有理数的和,称这个算式的结果为这几个有理数的代数和。
试解下列关于正整数n的代数和不等式:
d < 1+1/2-1/3+1/4+1/5-1/6+···±1/n
其中d为从键盘输入的正数,式中代数和表达式中的符号为两个“+”号后一个“-”。
1.说明:
式中符号为两个“+”号后一个“-”号,即分母能被3整出时为“-”。
2.程序设计:
方案一:
设置条件循环,每三项(包含二正一负)一起求和。若加到1/n+1/(n+1)-1/(n+2)后代数和s>d,退出循环,得一个区间解[n+1,∞]。
注意:
此时n还必须进行进一步检测,然后设置k(1~n)循环一项项求和,包括对n的检测,得离散解。
#include<stdio.h>
void main()
{
long n,i;
double s,d;
printf("请输入正数d:");
scanf("%lf",&d);
printf("%lf<1+1/2-1/3+1/4+1/5-1/6+···±1/n的解:\n",d);
n=1;
s=0;
while(1)
{
s=s+1/n+1/(n+1)-1/(n+2);
if(s>d)
break;
n=n+3;
}
printf("n>=%ld\n",n+1);
for(i=1;i<=n;i++)
{
if(i%3!=0)
s=s+1/i;
else
s=s-1/i;
if(s>d)
printf("n=%ld\n",i);
}
getch();
}
方案二:
方案一的程序通过循环累加和判断可以得到区间和的下限,但离散解必须从头开始逐一试探才能够获得。
如果设置条件循环,首先对前两项求和(即3/2),然后从第三项开始每三项(包含一负二正)一起求和。若加到-1/n+1/(n+1)+1/(n+2)后代数和s>d,退出循环,得到第一个离散解n+2,且可以证明所有小于n+2的值都不是解。
注意:n+2只是第一个离散解,同时所有的n+2+3i(i=1,2,3……)至少都可以保证是离散解,对于区间解的下限还需要进一步检测。
为求区间解的下限,需要对第n+2项后的代数项进行逐项累加并检测项n+2+3i-1或者n+2+3i-2(i=1,2,3……)(由于项n+2+3i已经是离散解,因此并不需要对它们进行检测),直至s>d为止。这是所得的项n+2+3i-1或n+2+3i-2即为区间解的下限。
#include<stdio.h>
void main()
{
long n,i;
double s,d;
printf("请输入正数d:");
scanf("%lf",&d);
printf("%lf<1+1/2-1/3+1/4+1/5-1/6+···±1/n的解:\n",d);
n=3;
s=3.0/2;
while(1)
{
s=s-1.0/n+1.0/(n+1)+1.0/(n+2);
if(s>d)
break;
n=n+3;
}
printf("n=%ld\n",n+2);
i=n+2;
while(1)
{
if((s=s-1.0/(++i))>d)
break;
if((s=s+1.0/(++i))>d)
break;
s=s+1.0/(++i);
printf("n=%ld\n",i);
}
printf("n>=%ld\n",i);
getch();
}
3.程序运行示例及其注意事项:
方案一:请输入正数d:5
5.000000<1+1/2-1/3+1/4+1/5-1/6+···±1/n的解:
n>=203939
n=203936
n=203938
方案二:请输入正数d:7
7.000000<1+1/2-1/3+1/4+1/5-1/6+···±1/n的解:
n=82273511
n>=82273513
注意:一个是离散解,后一个是区间解。特别要注意不要遗失离散解。
以上两个枚举法的循环次数取决于解n的上限,当输入的参数d越大时,n的上限也就越大,枚举的复杂度也就越高,求解也就变得越困难。由于数值过大,上述示例运行需要一定时间。
例如当d逐渐增加到大于7时,解值会迅速增长而变得非常大。甚至超出相应变量的范围或计算机的计算范围,这时就不可能得到不等式的解。
变式:把不等式中的“二正一负”的规律改变为“三正一负”,程序应该怎样修改?试求出修改后的不等式大于5的解。
由代数和的计算规律总结该不等式求解的一般规律。