用穷举解一个小题

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define SIZE 10

int getdp(int num); /*取得总权值*/
int getnum(int arry[],int n,int pos);/*返回从pos到n之间数目*/
void iniarr(int arry2[]);/*初始化符号为*/
int getnew(int arry[],int arry2[],int n,int num);
void test(int arry[],int arry2[],int n,int deg);/*原始数组 符号数组 当前长度所需,等号后的大小*/
int scr;/* 用户暂停屏幕 */
main(){
    int arry[SIZE];
    int arry2[SIZE]={0};/*记录符号*/
    int w; /*等号后位数 */
    int deg;/*等号后的值*/
    int max;/*当前总值*/
    int i;

    for (i = 0; i < SIZE-1;++i)
        arry[i] = i+1;
    arry[i] = 0;

    for (w  = 1; w < SIZE ; ++w){ /* w 获得等号后的位数*/ 
        iniarr(arry2);
        deg = getnum(arry,w,SIZE - 1);
        max = getnum(arry,SIZE - w,SIZE - w - 1);
        if (max < deg)
            break;    /*总查找结束*/
        test(arry,arry2,SIZE-w,deg);
    }
    system("pause");
    return 0;
}

void test(int arry[],int arry2[],int n,int num){ /*判定函数*/
    int i,s;
    i = s=  0;
    while(1){/*穷举符号数组*/
        arry2[0] = s;
        if(++s > 2){
            s = 0;
            i = 1;
            while(++arry2[i] > 2){
                arry2[i] = 0;
                ++i;
                if (i > n-2)
                    break;
            }
        }
        if (i > n-2)
            break;
        getnew(arry,arry2,n,num);
    }
}

int getnew(int arry[],int arry2[],int n,int num){/*取得用arry2标志出来的总值*/
    int i,sum;
    int tem[SIZE];
    int tem2[SIZE];
    int s,t,flag;
    for ( i = 0,s = 0; i < n; ++i){     /*一次扫描处理组合数据*/
        if (arry2[i] == 2){
            for (t = 1; arry2[i+t] == 2;++t)
                ;
            tem[i-s] = getnum(arry,t+1,i+t);
            tem2[i-s] = arry2[i+t];
            i +=t;
            s += t;
            continue;
        }
        tem[i-s] = arry[i];
        tem2[i-s] = arry2[i];
    }
    flag = i -s;
    for (sum = tem[0],i = 1; i <flag ;++i){/*按照标志加或者减*/
        tem2[i-1] == 1?(sum-=tem[i]):(sum+=tem[i]);
    }
    if (sum == num){/*找到了 打印它*/
        for (i = 0 ; i < flag;){
            printf("%d ",tem[i++]);
            if (i < flag  )
                tem2[i-1] == 1?printf("- "):printf("+ ");
            else printf("= ");
        }
    printf("%d/n",sum);
        if(++scr > 22){
            scr = 0;
            system("pause");
        }
    }
    return 0;
}

int getdp(int num){ 
    int rnum = 1;
    assert(num < SIZE);
    while (num--)
        rnum *= 10; /*位权10*/
    return rnum;
}/* detdb()*/

int getnum(int arry[],int n,int pos){/*返回从pos到n之间数目*/
    int rnum=0;
    assert(n > 0 &&n < SIZE && pos < SIZE);
    while (n--){
        rnum += arry[pos-n] * getdp(n); /*最高位递减 * 位权 */
    }
    return rnum;
}

void iniarr(int arry2[]){
    int i ;
    for (i = 0; i < SIZE; ++i)
        arry2[i] = 0;
}
/*  *********************************************
思路 穷举标志数组 用它来组合数据
数组| 1 | 2  | 3 | 4
标志| 0 | 2 |  1 |    
意义   +    --   -       
表达式为  1  +  23 - 4
第二个数组表示当前数字后面的符号位0 加 1减 2 组合
**********************************************  */
/*
*   题目如下:
*   使用加号'+',减号'-',和等号'=',插入到1234567890中,使其等式成立.  
*   为简单起见,只求解等号在最右边的情况.如:  
*   1-2+34+56-7+8=90    符合要求
*   12-3+4+5+6-7-8-9=0  符合要求
*   12+3-4+5-6+7-8=9+0  不符合要求
*   程序代码规范,结果正确,要有必要的注释.输出所有可能的情况。  
*   使用TC2.0,TC3.0,VC6.0,dec++ 编译器均可. 
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值