#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++ 编译器均可. */
用穷举解一个小题
最新推荐文章于 2022-07-01 17:14:02 发布