回 帖 发 新 帖 刷新版面

主题:计算所有表达式的值


考虑一个任意的整数序列。在这个序列的两个数之间可以插入运算符“+”或者“-”,这样得到不同的算术表达式,经过运算,每个表达式得到一个结果
例子: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个回复)

沙发

用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);
    }
}

完成,没有作任何调试,有问题请先自己调试一下.

板凳


大家帮帮我啊,上面的代码我弄不来啊
唉~~~~~~~~``

3 楼

开发平台要求是什么?

4 楼

就是用C语言实现
Turboc2.0

5 楼

#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;
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册