zoukankan      html  css  js  c++  java
  • 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^

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

  • 相关阅读:
    易错点集合
    [NOIP2014][题解]飞扬的小鸟
    [题解]P2014 选课-树型依赖的背包
    [题解]「一本通 1.3 练习 1」埃及分数
    【NOIP2015】斗地主 题解
    NOIP2015子串题解
    单人纸牌_NOI导刊2011提高(04) [题解]
    「一本通 1.3 例 5」weight 题解(玄学搜索对象)
    NOIP2017 跳房子题解
    P1850 换教室 题解
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4883696.html
Copyright © 2011-2022 走看看