CSU暑期集训day06_平衡等式

题目:

写一个程序要求当输入在整数范围内的一个整数R后, 计算机便会检查,在下式□处能否填上“+”、“-”或“×”号凑成相应等式。如能凑成,则印出所有这些等式的个数。注意,考虑符号的优先级。 1□2□3□4□5□6□7□8□9=R

Input

只有一行,就是一个整数R。

Output

只有一行,就是使等式成立的个数。

Sample Input

20

Sample Output

30

解题思路:

    遍历每一个位置可以放的符号的所有情况,计算表达式的值,如果和R相同就计数。

代码:

#include <iostream>

using namespace std;

int r;
int fu[10];
int num[10];
int answ;

bool check(){
    int ans=0;
    for(int i=1;i<=9;i++){
        if(!fu[i]){
            int beg=i-1;
            while(!fu[i]){
                num[i-1]=0;
                num[i]=0;
                i++;
                if(i>9)break;
            }
            int cur=1;
            for(int j=beg;j<=i-1;j++)cur=cur*j;
            ans=ans+cur*fu[beg];
        }
    }
    for(int i=1;i<=9;i++){
        if(num[i])ans=ans+num[i]*fu[i];
    }
    for(int i=1;i<=9;i++)num[i]=i;
    if(ans==r)return true;
    else return false;
}

void f(int a,int x){    
    fu[a]=x;
    if(a==9){
        if(check())answ++;
    }else{        
        f(a+1,1);
        f(a+1,0);
        f(a+1,-1);
    }
}

int main(){    
    while(scanf("%d",&r)!=0){
        for(int i=1;i<10;i++)num[i]=i;
        answ=0;
        f(1,1);
        cout<<answ<<endl; 
    }
    return 0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值