测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A25116. 表达式求值

填空题 容易

题目描述

表达式求值

题目描述:

给定一个仅包含数字 1 到 9 的字符串 S,请在 S 中分别插入 1 个加号(+)、2 个加号。

注:

1)加号不能出现在 S 中第一位数字的前面或者最后一位数字的后面;

2)两个加号的位置不能相邻。

插入加号后的字符串可以看做是一个加法表达式,请找出所有可能出现的表达式,并输出所有表达式结果的总和。

例 1:S = "1234";分别在字符串 "1234" 中插入 1 个加号、2 个加号,插入加号的表达式如下:

1)当插入 1 个加号时,表达式有 1 + 234、12 + 34、123 + 4,计算结果依次为 235、46、127;

2)当插入 2 个加号时,表达式有 1 + 2 + 34、1 + 23 + 4、12 + 3 + 4,计算结果依次为 37、28、19;

这些结果的总和为 492(235 + 46 + 127 + 37 + 28 + 19)。

例 2:S = "111",分别在字符串 "111" 中插入 1 个加号、2 个加号,插入加号的表达式如下:

1)当插入 1 个加号时,表达式有 1 + 11,11 + 1,计算结果依次为 12、12;

2)当插入 2 个加号时,表达式有 1 + 1 + 1,计算结果为 3;

这些结果的总和为 27(12 + 12 + 3)。

输入描述:

输入一个仅包含数字 1 到 9 的字符串 S(3≤S的长度≤15)。

输出描述:

输出一个整数,表示所有可能出现的表达式的结果的总和。

样例输入:

1234

样例输出:

492

参考答案

#include <iostream> #include <string> #include <vector> #include <cctype> using namespace std; // 将子串转为整数 int toInt(string s, int start, int end) { int num = 0; for (int i = start; i <= end; i++) { num = num * 10 + (s[i] - '0'); } return num; } int main() { string s; cin >> s; int n = s.size(); long long totalSum = 0; // 插入1个加号的情况 for (int i = 1; i <= n - 1; i++) { int a = toInt(s, 0, i - 1); int b = toInt(s, i, n - 1); totalSum += (a + b); } // 插入2个加号的情况 for (int i = 1; i <= n - 2; i++) { for (int j = i + 1; j <= n - 1; j++) { int a = toInt(s, 0, i - 1); int b = toInt(s, i, j - 1); int c = toInt(s, j, n - 1); totalSum += (a + b + c); } } cout << totalSum << endl; return 0; }

答案解析

枚举所有加号插入位置:

一个加号:在位置i插入,将字符串分为两部分求和。

两个加号:在位置i和j插入(i < j),分为三部分求和。

上一题 下一题