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^
时间: 2024-10-13 08:51:49

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

编程题:用do..while语句实现,求1+2+3+...+100的结果。

#include<stdio.h> void main() { int s,n; s=0; n=1; do { s=s+n; n=n+1; } while(n<=100); printf("1+2+3+...+100=%d\n",s); } 算法解析图与流程图: do...while语句运行结果: 总结:do...while至少执行一次. 编程题:用do..while语句实现,求1+2+3+...+100的结果.,布布扣,bubuko.com

蓝桥杯省赛编程大题——骰子问题

作为第二道编程大题,难度也没有想象中那么难.只怪我当时没有认真的静下心来仔细的理解题目意思.连样例都没有看懂,高数课闲来无事,便静下来认真想了一下. 大致的题目意思是给你n个骰子,让你堆起来,并且告诉你有一些面是不能靠在一起的.问你总共有多少总方案数.(骰子规定1和4相对,2和5相对,3和6相对) 输入n m 表示骰子的个数和不能靠在一起的个数. 输入m行,每行两个数a b 表示a和b两面不能靠在一起. 输出一行方案数,数据较大请模100000000+7; 样例输入: 2 1 1 2 样例输出:

序列相关的趣题 之四

(8) 给定一个英文单词,消除其中重复的字母,只能删掉字母,不能交换字母顺序,最后原单词中每个字母只出现一次,求字典序最小的结果. 这是toj一个题,百度面试也问过,原题见 http://acm.tju.edu.cn/toj/showp3257.html 此题我非常喜欢,巧妙之处是其算法是O(n)的-- .我们一个字母一个字母加入序列,一旦来了一个比较"小"的字母,因为我们需要字典顺序最小,我们希望它尽可能靠前.所以我们试图"冒泡"似的把小的往前面送,经过尾部那些较

序列相关的趣题 之二

(4)数组中找到两个数和的绝对值最小 像不像2-SUM? 不多解释,主要是绝对值大的动就行,两头扫的方法真好!当然要先排序,出去排序就是O(n),算上排序的话退化到O(nlogn) 这也是codility上的问题,还没来得及整理. 上个代码: // you can also use includes, for example: // #include <algorithm> #include <algorithm> int ab(int x) { return (x >= 0

uyhip 趣题 拉灯问题总有解吗?

这是一个让我纠结许久,又不甘放弃的puzzle.在一个意志力极度薄弱的下午,对不起,我看了答案...所以,这又是一篇马后炮文章.但不是所有马后炮都一文不值.如果在讲解一个解答的时候,我们不能把思考背后的动机讲清楚,于他人和自己的价值就会小很多.每一步推理的过程,每一个构造的细节,不是无迹可寻的.我希望去揭示背后的东西. 一个解答背后包含了大量的探索.解谜高手对于如何避免无效的思考,摸清靠谱的思路,总是有一套自己的办法.遗憾的是,好些同学由于各种原因,没有公开自己的方法.例如,高斯同学,他认为数学

智力趣题几则

古时一位农民被人诬陷,农民据理力争,县官因已经接受别人的贿赂,不肯放人,又找不到理由,就出了个坏主意.叫人拿来十张纸条,对农民说:“这里有十张纸条,其中有九张写的‘死’, 一张写的‘生’,你摸一张,如果是‘生’,立即放你回去,如果是‘死’,就怪你命不好,怨不得别人.”聪明的农民早已猜到纸条上写的都是“死”,无论抓哪一张都一样.于是他想了个巧妙的办法,结果死里逃生了.你知道他想的什么办法吗? 把其中的一张纸条吃下去,再根据排除法,结果就有九张死那么它吃下去的就是“生” 称苹果         有十

趣题[0]

趣题[0] 来源 17级老学长的作业题 题面 \(n\) 个物品,有两种值\(a[i]\)和\(b[i]\),给定\(k\).从中选出一些物品,使得 \(\sum{a[i]} = k * \sum{b[i]}\),并且 \(\sum{a[i]}\) 尽量大,求满足条件的最大的 \(\sum{a[i]}\). \(1 <= n.a[i].b[i] <= 100\) \(1 <= k <= 10\) 题解 做差值之后分正负做背包,然后扫一遍即可. 复杂度 \(O(100 * k * n

趣题[1]

趣题[1] 来源 http://www.csie.ntnu.edu.tw/~u91029/Sequence3.html UVA - 12192 介绍 引入 \(n*m\)的矩阵,每行从左到右递增,每列从上到下递增,在矩阵中找数\(x\)出现过的位置. 具体做法可以在这个链接ctrl+F[Search in Sorted Matrix: Saddleback Search],复杂度\(O(n+m)\) 想法 现在我们知道了,从这样的矩阵的右上角走下来可以把矩阵分成两个部分,左上部分小于\(x\),

算法趣题之回文数

题目:求用十进制.二进制.八进制表示都是回文数的所有数字中,大于十进制数10的最小值. 啥叫回文数:如果把某个十进制数按相反的顺序排列,得到的数和原来的数相同,则这个数就是"回文数".例如12321就是一个回文数. 这个题目拿Ruby.JavaScript.python.Java都很容易实现,因为这些语言都提供了字符串逆序处理的接口,或者相关其他接口,而C语言没有提供直接转换的接口,所以下面用C语言解题,其中设计的封装在工作中也会经常碰到,故记录并分享,如有错误或者有更好的算法,欢迎留