您的位置:首页 > 编程语言 > C语言/C++

奇数序列运算式

2017-01-05 18:24 302 查看
程序设计除了探索求解数之外,数式也是程序设计探求的重要方面;

本节集中探讨各类有特殊意义的数式,即有整数式、分数式,也有综合运算式,新推有趣的“对称运算式”与“同基因数式”为创意点;

试在由指定相连奇数组成的序列的每相邻两项中插入运算符号:

若相邻两项都是合数,则两项中插入减号“-”;

若相邻两项中一项为合数,另一项为素数,则两项中插入加好“+”;

若相邻两项都是素数,则两项中插入乘号“*”;

输入奇数b,c(1< b< c),根据以上规则插入运算符号完成指定区间[b,c]中的奇数序列运算符,计算并输出该式的运算结果;

例如b=31,c=45,完成运算式并计算得:31+33-35+37+39+41*43+45=1913

1.说明:

序列各项是否为素数决定运算符号的确定,直接关系到运算式的结果;

为便于判别式中各个奇数是否为素数,设置a数组存储式中的各个奇数;

(1)、枚举区间[b,c]中的奇数,应用试商法确定每一个奇数是否为素数:

标注a[k]=1,表示区间[b,c]中的第k个奇数 2*k+(b-2)为素数;

标注a[k]=0,表示区间[b,c]中的第k个奇数 2*k+(b-2)非素数;

(2)、根据相邻两项决定两项中的运算符号;

若a[i-1]+a[i]==0,两项都是合数,插入“-”号;

若a[i-1]+a[i]==1,两项一个素数一个合数,插入“+”号;

若a[i-1]+a[i]==2,两项都是素数,插入“*”号;

(3)、遵循先乘后减的运算规则完成运算,这是设计的关键环节;

在枚举每一个奇数的i(1~n)循环中:

1)、把第i个奇数值赋给变量t: t=2*i+b-2;同时记下位置i: f=I

2)、实施乘运算:

while(a[i]+a[i+1]==2)
{
i++;
t=t*(2*i+b-2);
}


这里应用条件循环是注意到有连乘现象,例如3*5*7;

3)、实施加减:

if(a[f-1]+a[f]==0)
s=s-t;
if(a[f-1]+a[f]==1)
s=s+t;


2.程序设计:

#include<stdio.h>
#include<math.h>
int main()
{
int b,c,f,n,k,i,j,a[3000];
long t,s;
printf("请输入首尾奇数b,c(b<c):");
scanf("%d,%d",&b,&c);
n=(c-b+2)/2;           /*计算奇数序列n项*/
for(k=1;k<=n+1;k++)
a[k]=0;
for(k=1;k<=n;k++)
{
for(t=0,j=3;j<=sqrt(2*k+b-2);j+=2)
if((2*k+b-2)%j==0)
{
t=1;
break;
}
if(t==0)
a[k]=1;           /*标记第k个奇数2k+b-2为素数*/
}
printf("\n%d",b);
for(i=2;i<=n;i++)       /*完成表达式*/
{
if(a[i-1]+a[i]==0)
printf("-%d",2*i+b-2);   /*插入减号*/
if(a[i-1]+a[i]==1)
printf("+%d",2*i+b-2);   /*输入加号*/
if(a[i-1]+a[i]==2)
printf("*%d",2*i+b-2);   /*插入乘号*/
}
s=0;
a[0]=1-a[1];            /*确保第一项前为“+”*/
a[n+1]=0;               /*计算表达式结果*/
for(i=1;i<=n;i++)
{
t=2*i+b-2;
f=i;
while(a[i]+a[i+1]==2)
{
i++;
t=t*(2*i+b-2);    /*先实施乘*/
}
if(a[f-1]+a[f]==0)
s=s-t;            /*后实施加减*/
if(a[f-1]+a[f]==1)
s=s+t;
}
printf("=%d.\n",s);
}


3.程序运行示例及其注意事项:

请输入首尾奇数b,c(b<c):3,31

3*5*7+9+11*13+15+17*19+21+23+25-27+29*31=1536.


以上算法设计中对先乘后加减的处理是巧妙的;

注意:本设计有三个枚举循环:素数判别、完成运算式、完成运算,其中素数判别循环中含试商因数枚举的内循环,设区间中的奇数个数为n,算法的时间复杂度为O(n√n)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐