C++编程有趣的标题1 于1~9填写的运算结果的中间符号等于100
于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^
版权声明:本文博主原创文章。博客,未经同意不得转载。