首页 > 代码库 > C++编程趣题1 在1~9中间填符号使运算结果等于100

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^

C++编程趣题1 在1~9中间填符号使运算结果等于100