【XDOJ】五星级题目--构造表达式之思路分享

本文分享了如何解决【XDOJ】五星级题目——构造表达式的问题。当给定序列长度n(3≤n≤9),需要在序列1 2 3…n中插入加号、减号和空格,使得表达式结果为0。通过三进制遍历所有可能的符号组合,找到所有使表达式等于0的方法。例如,n=3时,唯一解为1+2-3=0。文章适合C++初学者,欢迎讨论改进方案。

【XDOJ】五星级题目–构造表达式之思路分享

题目:
构造表达式
问题描述
给定一个表示序列长度的整数n(3<=n<=9)。在序列1 2 3…n中插入‘+’,‘-’,‘ ’构造表达式,插入‘ ’表示前后两个数字构成一个整数,例如1 2 -3 -4 -5=0。
输出构造的所有表达式中,结果为0的表达式的数量,例如n=3时,只有表达式1+2-3=0,输出结果为1。
输入说明
输入数据为一个整数n(n<10),表示序列长度,同时表示输入序列为“1 2 3…n”。
输出说明
对于每一组数据,输出一个整数,表示构造的表达式中结果为0的表达式数量。
输入样例
3
输出样例
1
思路:
笔者认为这题的关键在于如何遍历所有可能的情况,由于符号只有‘+’,‘-’,‘ ’三种,所以可以采用三进制,遍历指定位数的三进制数,就可以按位数拆分出所有符号的可能。
代码:

#include<iostream>
#include<math.h>
using namespace std;
int main(){
    int n,y=0;
    int v[100],a[100];
    cin >> n;
    for (int i = 0,j=1; i < 2*n-1;i+=2,j++){
        v[i] = j;
    }//将数组v【】的偶数位赋值1,2,...,n
    for (int j = pow(3, n - 2); j <pow(3, n-1);j++){// 用3进制遍历所有n-2位数的值,代表所有可能的情况
        int t = j;
        for (int i = 2*n-3; i>0;i-=2){//把相应的符号赋值到v【】的奇数位中
            v[i] = t % 3;//取对应位置的值,0代表' ',1代表加法,2代表减法
            t/= 3;
        }
        a[0] = v[0];
        int x = 0;
        for (int k = 1; k < (n - 1) * 2;k+=2){//把v【】整到a【】中,相邻数合并
            if(v[k]==0){
                a[x] = a[x] * 10 + v[k + 1];
            }
            else{
                x++;
                a[x] = v[k];
                x++;
                a[x] = v[k + 1];
            }
            
        }
        for (int i = 1;i<=x ;i+=2){//遍历a【】中所有符号位,向右进行,把结果储存在最后一位中
                if(a[i]==1){
                    a[i + 1] += a[i - 1];
                }
                else{
                    a[i+ 1] -= a[i - 1];
                }
        }
        if(a[x]==0){//判断最后一位是否为0
              y++;
        }

    }
    cout <<y<<endl;
}

ps:本人大一c语言萌新一枚,有考虑不周之处或者可以改进的地方欢迎指出

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值