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


C++编程有趣的标题1 于1~9填写的运算结果的中间符号等于100


</pre><pre name="code" class="cpp">
  这是我在网上无意间看到的,认为非常有意思,自己就在电脑上试了一下,100多行源码打了半个多小时。最后也还是出现了错误。最后在一个专业的学长的帮助下攻克了问题,原来是编译器的不同导致的。

看来还得好好了解下不同编译器导致的不同问题啊。还有 凝视中尽管说有6561种可能,但不知道为什么最后仅仅出现了11种。有待加强改进啊

  相信自己有朝一日可以自己写出此代码,继续加油!。。 酒吧 年青^0^

版权声明:本文博主原创文章。博客,未经同意不得转载。







本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4883696.html,如需转载请自行联系原作者


上一篇:重构——16引入外加函数(Introduce Foreign Method)


下一篇:sprintf函数的用法