奇数序列运算式
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)、实施乘运算:
这里应用条件循环是注意到有连乘现象,例如3*5*7;
3)、实施加减:
2.程序设计:
3.程序运行示例及其注意事项:
以上算法设计中对先乘后加减的处理是巧妙的;
注意:本设计有三个枚举循环:素数判别、完成运算式、完成运算,其中素数判别循环中含试商因数枚举的内循环,设区间中的奇数个数为n,算法的时间复杂度为O(n√n);
本节集中探讨各类有特殊意义的数式,即有整数式、分数式,也有综合运算式,新推有趣的“对称运算式”与“同基因数式”为创意点;
试在由指定相连奇数组成的序列的每相邻两项中插入运算符号:
若相邻两项都是合数,则两项中插入减号“-”;
若相邻两项中一项为合数,另一项为素数,则两项中插入加好“+”;
若相邻两项都是素数,则两项中插入乘号“*”;
输入奇数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);
相关文章推荐
- 奇数单增序列
- 获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。
- 获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列
- 获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列
- 获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。
- 声明集成Thread类的奇数/偶数序列线程
- 获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列
- 获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列
- 奇数偶数序列
- 获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列
- Openjudge计算概论-奇数单增序列
- 获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。
- 获取一个数二进制序列中所有的偶数位和奇数位,并输出。
- 1、写一个函数返回参数二进制中 1 的个数(三种方法)2、获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列3、输出一个整数的每一位。4、两个int(32位)整数m和n的二进制表达中,有多
- 巧妙获取二进制数的奇数序列和偶数序列
- C语言整数的二进制偶数位,奇数位和二进制序列的输出
- [置顶] 【C语言】获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列
- 获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列
- 判断一个序列中出现次数为奇数的数
- C语言位运算运用二:输出二进制序列中所有的偶数位和奇数位