主题:计算所有表达式的值
biscy
[专家分:30] 发布于 2006-06-09 16:46:00
考虑一个任意的整数序列。在这个序列的两个数之间可以插入运算符“+”或者“-”,这样得到不同的算术表达式,经过运算,每个表达式得到一个结果
例子:17, 5, -21, 15。这个序列有8个可能的算术表达式
17 + 5 + (-21) + 15 = 16
17 + 5 + (-21) - 15 = -14
17 + 5 - (-21) + 15 = 58
17 + 5 - (-21) - 15 = 28
17 - 5 + (-21) + 15 = 6
17 - 5 + (-21) - 15 = 24
17 - 5 - (-21) + 15 = 48
17 - 5 - (-21) - 15 = 18
程序要求:
输入:
第一行为整数N /*(1 <= N <= 10000) N为整数序列的整数个数*/
第二行为:N个整数组成的序列 /*整数之间用空格分开,每个数不超过10000*/
输出
每个可能的表达式的值
例如
输入
4
17 5 -21 15
输出
16
-14
58
28
6
24
48
18
这个程序怎么写啊,用C来实现
大家帮帮忙啊
小弟感激啊~~
回复列表 (共5个回复)
沙发
xabcxyz [专家分:940] 发布于 2006-06-10 09:35:00
用1表示+用0表示-; 用M表示输入数据个数; 用num[]表示输入数据的整形数组; 用msk[]表示用来存放加减符号的二进制数据的字节数组
msk的元素个数=(M+6)/8 ; 最高位字节有效二进制位数=(M-1)%8;
const int xb[]={0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1};
void f(int num[], unsigned char msk[], short M){
long val; int i, j, k;
short m=(M+6)/8, n;
M--; /*M个数字, M-1个算符*/
for(i=0; i<m; i++) msk[i] = 255; /*全部为+*/
j=1; while(j){
n=M%8; k=m; val=0;
for(i=m-1; i>=0; i++){ /*完成一次全部数据运算*/
while(n-->=0) /*完成一个字节对应所有数据运算*/
if(msk[i]&xb[n]) val+=num[k--]; else val-=num[k--];
n=7;
} printf("%l", val); /*输出一次运算结果 */
for(i=0; i<m; i++){ /*改变一次算符*/
unsigned c = msk[i]--;
if(c>msk) break; /*算符的改变没有超过一个字节范围,不需要处理后继算符 */
}
j=0;
for(i=0; j==0&&i<m-1; i++) /*判断是否从全加循环到了全减 */
j = (msk[j]!=0);
n=(M+1)%8; if(n==0) n=255; else n=xb[n]-1;
if(j==0) j=((msk[m-1]&n)!=0);
}
}
完成,没有作任何调试,有问题请先自己调试一下.
板凳
biscy [专家分:30] 发布于 2006-06-11 12:03:00
大家帮帮我啊,上面的代码我弄不来啊
唉~~~~~~~~``
3 楼
xabcxyz [专家分:940] 发布于 2006-06-11 21:12:00
开发平台要求是什么?
4 楼
biscy [专家分:30] 发布于 2006-06-13 13:01:00
就是用C语言实现
Turboc2.0
5 楼
xabcxyz [专家分:940] 发布于 2006-06-13 21:03:00
#include <stdio.h>
const int xb[]={0x80, 0x40, 0x20, 0x10, 0x8, 0x4, 0x2, 0x1};
void f(int num[], unsigned char msk[], short M){
long val; int i, j, k;
short m=(M+7)/8, n;
for(i=0; i<m; i++) msk[i] = 255; /*全部为+*/
j=1; while(j){
n=(M%8+8)%9; k=M-1; val=0;
for(i=m-1; i>=0; i--){ /*完成一次全部数据运算*/
while(n-->0) /*完成一个字节对应所有数据运算*/
if(msk[i]&xb[n]) val+=num[k--];
else val-=num[k--];
n=8;
} printf("%ld\t", val); /*输出一次运算结果 */
for(i=0; i<m; i++){ /*改变一次算符*/
unsigned c = msk[i]--;
if(c>msk[i]) break; /*算符的改变没有超过一个字节范围,不需要处理后继算符 */
}
j=0;
for(i=0; j==0&&i<m-1; i++) /*判断是否从全加循环到了全减 */
j = (msk[j]!=0);
n=(M+1)%8; if(n==0) n=255; else n=xb[n]-1;
if(j==0) j=((msk[m-1]&n)!=0);
}
}
main(){
int num[80]={9,8,7,6,5,4,3,2,1,0,9,8,7,6,5,4,3,2,1,0,9,8,7,6,5,4,3,2,1,0,9,8,7,6,5,4,3,2,1,0};
unsigned char msk[10];
short M=40;
f(num, msk, M);
return 0;
}
我来回复