zoukankan      html  css  js  c++  java
  • 等式变换

    输入一个正整数X,在下面的等式左边的数字之间添加+号、-号或空格,使得等式成立。

    1 2 3 4 5 6 7 8 9 = X

    比如:

    12-34+5-67+89 = 5

    1+23+4-5+6-7-8-9 = 5

    请编写程序,统计满足输入整数的所有整数个数。

    输入:       正整数,等式右边的数字

    输出:       使该等式成立的个数

    样例输入:5

    样例输出:21(此处经大家提醒已更正)

    这里我理解错了题目意思,以为是1前面也加+/-。思路没什么影响,从结果中去掉最开始一位为 -号的就行。

    本方法的思路是:每个数字(除1之外)的所有数字前的符号都有三种选项:+/-/空,"空"代表不加符号,也就是与前一个数字相连。

    将所有数字的符号用一个三进制的数来表示,用0代表+,1代表-,2代表空。21201202,就代表12-34+5-67+89。代码中由于计算三进制的方便,将其以倒序的方式表示的,且1前面可以用+/-号,三进制通过一个int型的数字转换成了string。

      于是,从0到22222222就可以代表所有的结果的可能了,转换成int就是从0到6560,一共也才6561种,计算量并不大。从0到6560遍历一遍看结果是否与输入的值一致,再统计总的一致的次数即可得到答案。

    string get_3x(int number)
    {
        string symbols = "";
        int remain = 0;
        while(number)
        {
            remain = number % 3;       //取一个十进制数number的对应三进制数的最后一位
            number = number / 3;
            symbols += (remain + '0');  //数字转字符串
        }
        
      //string是一个包装了char*的类,有一些方便的函数可以用
      int zero_count = 9 - symbols.size(); //不足8位的,高位补0(逆序情况下,在其后补0) for(int i =0; i < zero_count; i++) symbols += '0'; return symbols; } // 0 + // 1 - // 2 nul void equation_transfer(int number) { int equal_count = 0; const int table_size = 13122; // 2 * 3^8 for(int i = 0; i < table_size; i++) { string symbol = get_3x(i); int x = 0; int y = 0; // cout << symbol << endl;
    for(int j = 8; j >= 0; j--) { if(symbol[j] == '0') { x = x + y; y = 9 - j; //y用于保存当前值 } else if(symbol[j] == '1') { x = x + y; y = -(9-j); } else { if(y < 0) y = y * 10 - (9-j); //当下一个符号为空,将上一个值y与下一个值合并(注意y正负不同,合并方式有差异) else y = y * 10 + (9-j); } } if((x+y) == number) { equal_count++; cout << symbol << endl; } } cout << equal_count << endl; }

    http://blog.csdn.net/u010667082/article/details/47316015 

    不考虑1之前的符号:

    void equation_transfer(int number)
    {
        int equal_count = 0;
        const int table_size = 6561;   //  3^8  
        for(int i = 0; i < table_size; i++)
        {
            string symbol = get_3x(i);
            int sum = 0;
            int y = 1; 
            // cout << symbol << endl;

         string equal_string = ""; //将满足条件的表达式输出
         equal_string.clear();
         for(int j = 7; j >= 0; j--) 
        {
          
    if(symbol[j] == '0')
          {
             equal_string += (y + '0') + '+';
            sum
    = sum + y; y = 9 - j; //y用于保存当前值 } else if(symbol[j] == '1') { equal_string += (y + '0') + '-';
          x
    = x + y; y = -(9-j); } else { if(y < 0) y = y * 10 - (9-j); //当下一个符号为空,将上一个值y与下一个值合并(注意y正负不同,合并方式有差异) else y = y * 10 + (9-j); } }
        //循环结束后,y中保存最后一个数值
    if((sum+y) == number) { equal_count++; cout << symbol << endl;
           equal_string += y + '0';
           cout << equal_string << endl;
    } } cout
    << equal_count << endl; }
  • 相关阅读:
    ADF中遍历VO中的行数据(Iterator)
    程序中实现两个DataTable的Left Join效果(修改了,网上第二个DataTable为空,所处的异常)
    ArcGIS api for javascript——鼠标悬停时显示信息窗口
    ArcGIS api for javascript——查询,然后单击显示信息窗口
    ArcGIS api for javascript——查询,立刻打开信息窗口
    ArcGIS api for javascript——显示多个查询结果
    ArcGIS api for javascript——用图表显示查询结果
    ArcGIS api for javascript——查询没有地图的数据
    ArcGIS api for javascript——用第二个服务的范围设置地图范围
    ArcGIS api for javascript——显示地图属性
  • 原文地址:https://www.cnblogs.com/Lunais/p/5875805.html
Copyright © 2011-2022 走看看