在1 2 3 4 5 6 7 8 9九个数字中插入“+”或“-”符号使得结果为100,编程实现所有的组合。注:数字的顺序不能改变
<pre name="code" class="cpp">nclude <stdio.h> #include <iostream> #include <memory.h> #define NUM 6561 //3^8:6561 using namespace std; int mici(int x, int i) //求解x^i { int res = 1; for (; i>0; i--) { res *= x; } return (res); } int main(int argc, char *argv[]) { int data[9]; int index, level; int i, j, k=0; int pre_sign; int temp = 0; int sum = 0; int x = 2; for (i=0; i<NUM; i++) //总共有6561种可能 { memset(data, 0, sizeof(int)*9); //清零 index = i; for (level=9; level>1; level--) //有8处符号需要判断 { pre_sign = index%3; //该空的符号,规定0:+,1:-;2:连接 index = index/3; //往上一层(即上一个空)的位置 switch(pre_sign) { case 0: if (temp == 0) { data[k] = level; } else { data[k] = temp; temp = 0; x = 2; } k++; break; case 1: if (temp == 0) { data[k] = 0 - level; } else { data[k] = 0 - temp; temp = 0; x = 2; } k++; break; case 2: if (temp == 0) { temp = level + (level-1)*10; } else { temp = temp + (level-1)*mici(10,x); x++; } break; default: break; } } if (pre_sign == 2) //处理数字1 { data[k] = temp; } else { data[k] = 1; } k = 0; //将这些变量复位很重要,以免影响下一轮! temp = 0; x = 2; for (j=0; data[j]!=0; j++) //求和 { sum = sum + data[j]; } if (sum == 100) { for (j=j-1; j>=0; j--) //逆序输出,这样1在前面 { if (data[j] >0) { cout<<"+"<<data[j]; } else { cout<<data[j]; } } cout<<" = "<<sum<</*"....."<<i<<*/endl; //i for test } sum = 0; } return(0); }
</pre><pre name="code" class="cpp">
这是我在网上无意间看到的,觉得很有意思,自己就在电脑上试了一下,100多行源代码打了半个多小时,最后也还是出现了错误,最后在一个专业的学长的帮助下解决了问题,原来是编译器的不同导致的。看来还得好好了解下不同编译器导致的不同问题啊。还有 注释中虽然说有6561种可能,但不知道为什么最后只出现了11种,有待加强改进啊
相信自己有朝一日能够自己写出这样的代码来,继续加油!!! 向上吧 少年^0^
时间: 2024-10-13 08:51:49