携漫天星辰而来 2023-05-19 23:09 采纳率: 100%
浏览 24
已结题

代码哪里错了为什么不通过

寻找表达式
题目描述
给定一个只由0,1,2,3,4,5,6,7,8,9组成的字符串,要求你在字符之间添加"+"或者"-",例如给定的字符串是"12345",你可以找到一个表达式"123+4-5",现在给一个整数N,请找出所有的表达式使得表达式的值为N。两个相邻的字符之间最多只能使用一个符号。

输入格式
输入包含多组测试数据,每组测试数据占一行,是一个字符串和一个整数N。

其中字符串的长度最大为12,N的最大值为999999999999

输出格式
对于每组测试数据,输出能够满足条件的表达式的个数。

输入输出样例
输入样例1:
123456789 3
21 1
输出样例1:
18
1
【耗时限制】1000ms 【内存限制】128MB

#include <iostream>
#include <cstdio>
#include <cmath>
#include <string.h>
#include <sstream>
#include <cstring>
#include <algorithm>
#include<stack>
#include<vector>
#include<queue>
#include<deque>
using namespace std;
const int N=15;
const char op[3]={' ','+','-'};
int n,a[N];
char c[N];
bool check(){
    int sum=0;
    int num=a[1];
    char pre='+';
    for(int i=1;i<=n-1;i++){
        if(c[i]==' '){
            num=num*10+a[i+1];
        }else if(c[i]=='+'||c[i]=='-'){
            if(pre=='+')sum+=num;
            else sum-=num;
            num=a[i+1];
            pre=c[i];
        }
    }
    if(pre=='+')sum+=num;
    else sum-=num;
    return sum==0;
}
void print(){
    for(int i=1;i<=n-1;i++)printf("%d%c",a[i],c[i]);
    printf("%d\n",a[n]);
}
void dfs(int cur){
    if(cur==n){
        if(check())print();
        return ;
    }
    for(int i=0;i<3;i++){
        c[cur]=op[i];
        dfs(cur+1);
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)a[i]=i;
    dfs(1);
    return 0;
}

  • 写回答

2条回答 默认 最新

  • 携漫天星辰而来 2023-05-26 18:34
    关注
    你可以这样子做
    
    ```c++
    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <string.h>
    #include <sstream>
    #include <cstring>
    #include <algorithm>
    #include<stack>
    #include<vector>
    #include<queue>
    #include<deque>
    using namespace std;
    const int N=20;
    const char op[3]={' ','+','-'};
    int n,a[N+10],d,cnt;
    char c[N+10];
    bool check(){
        int sum=0;
        int num=a[1];
        char pre='+';
        for(int i=1;i<=n-1;i++){
            if(c[i]==' ')num=num*10+a[i+1];
            else{
                if(pre=='+')sum+=num;
                if(pre=='-')sum-=num;
                num=a[i+1];
                pre=c[i];
            }
        }
        if(pre=='+')sum+=num;
        if(pre=='-')sum-=num;
        return sum==d;
    }
    void dfs(int cur){
        if(cur==n){
            if(check())cnt++;
            return ;
        }
        for(int i=0;i<3;i++){
            c[cur]=op[i];
            dfs(cur+1);
        }
    }
    int main(){
        string s;
        while(cin>>s>>d){
            cnt=0;
            memset(c,0,sizeof(c));
            memset(a,0,sizeof(a));
            n=s.size();
            for(int i=1;i<=n;i++) a[i]=(s[i-1]-'0');
            dfs(1);
            printf("%d\n",cnt);
        }
        return 0;
    }
    
    

    ```

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月3日
  • 已采纳回答 5月26日
  • 创建了问题 5月19日

悬赏问题

  • ¥15 winFrom界面无法打开
  • ¥15 crossover21 ARM64版本安装软件问题
  • ¥15 mmo能不能做客户端怪物
  • ¥15 osm下载到arcgis出错
  • ¥15 Dell g15 每次打开eiq portal后3分钟内自动退出
  • ¥200 使用python编写程序,采用socket方式获取网页实时刷新的数据,能定时print()出来就行。
  • ¥15 matlab如何根据图片中的公式绘制e和v的曲线图
  • ¥15 我想用Python(Django)+Vue搭建一个用户登录界面,但是在运行npm run serve时报错了如何解决?
  • ¥15 QQ邮箱过期怎么恢复?
  • ¥15 登录他人的vue项目显示服务器错误