列表

详情


NC200382. JK表达式

描述

作为女子高中生,小莞需要和ta的同学们一起上数学课。bb612b10b9.png

可ta实在是厌倦了代数,比如这种东西。

看到代数式里总是有许多的+号,因此ta决定:重新定义+号

小莞的加法规则很简单:

1. 如果+号两边都是数字组成的,则直接数学运算相加,如1 + 2 = 3
2. 如果+号两边都是字母组成的,则直接将两边连接,如AA + BB = AABB
3. 如果+号两边一边是数字组成的,一边是字母组成的,则将字母部分重复数字所表示的次数,如2 + JK = JKJK

之后,小莞随手写下了一个式子:a+(b+c+(d+e))+(f+(g+h+i))+(j+k)。这个形式的式子被称为JK表达式。这里的ab...jk不是参与运算的字母,而是小莞心中所想的11个数字或字母。作为小莞的追求者,请你精通一下ta的加法,求解出JK表达式的值

输入描述

有多组输入。

每组输入小莞心中所想的a, b, c, d, e, f, g, h, i, j, k,可能是数字或大写英文字母

输出描述

对于每组输入,输出一行,代表JK表达式a+(b+c+(d+e))+(f+(g+h+i))+(j+k)的计算结果

示例1

输入:

T X 0 9 L O 3 9 R W U
7 5 4 0 S 0 7 1 3 T 0

输出:

TLLLLLLLLLORRRRRRRRRRRRWU

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 10ms, 内存消耗: 1308K, 提交时间: 2019-12-18 20:48:59

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int type(string s)
{
    if(s[0]>='0' && s[0]<='9') return 1;
    return 0;
}
string add(string a,string b)
{
    int x=type(a),y=type(b);
    if(x==1&&y==1) return to_string(stoi(a)+stoi(b));
    if(x+y==1)
    {
        if(x==0)
        {
            string ret;
            for(int i=1;i<=stoi(b);++i) ret+=a;
            return ret;
        }
        if(y==0)
        {
            string ret;
            for(int i=1;i<=stoi(a);++i) ret+=b;
            return ret;
        }
    }
    return a+b;
}
int main()
{
    string a,b,c,d,e,f,g,h,i,j,k;
    while(cin>>a>>b>>c>>d>>e>>f>>g>>h>>i>>j>>k)
    {
        cout<<add(add(add(a,add(add(b,c),add(d,e))),add(f,add(add(g,h),i))),add(j,k))<<endl;
    }
}

Python3(3.5.2) 解法, 执行用时: 33ms, 内存消耗: 4984K, 提交时间: 2019-12-14 17:22:35

#! /usr/bin/env python
# -*- coding: utf-8 -*-


def plus(a, b):
    if a.isdigit():
        if b.isdigit():
            return str(int(a)+int(b))
        else:
            return b*int(a)
    else:
        if b.isdigit():
            return a*int(b)
        else:
            return a+b


def cal(a, b, c, d, e, f, g, h, i, j, k):
    de = plus(d, e)
    bc = plus(b, c)
    bcde = plus(bc, de)
    gh = plus(g, h)
    ghi = plus(gh, i)
    fghi = plus(f, ghi)
    jk = plus(j, k)
    a_e = plus(a, bcde)
    a_i = plus(a_e, fghi)
    out = plus(a_i, jk)
    return out


ans = []
while True:
    try:
        s = input().split()
        ans.append(cal(*s))
    except:
        break
for i in ans:
    print(i)

C++14(g++5.4) 解法, 执行用时: 58ms, 内存消耗: 1256K, 提交时间: 2019-12-13 23:12:02

	#include<bits/stdc++.h>
using namespace std;

template<typename T1,typename T2>
T2 convert(T1 x){
    stringstream ss;T2 ret;
    ss<<x;ss>>ret;
    return ret;
}

auto tonum=convert<string,int>;
auto tostr=convert<int,string>;
auto isnum=[](string x){return tostr(tonum(x))==x;};

string operator*(string a,string b){
    if (isnum(a)&&isnum(b))return tostr(tonum(a)+tonum(b));
    if (!isnum(a)&&!isnum(b))return a+b;
    if (isnum(a))swap(a,b);
    string ret="";
    for (int i=0;i<tonum(b);i++)ret+=a;
    return ret;
}

int main(){
    string a,b,c,d,e,f,g,h,i,j,k;
    while(cin>>a>>b>>c>>d>>e>>f>>g>>h>>i>>j>>k)
        cout<<a*(b*c*(d*e))*(f*(g*h*i))*(j*k)<<endl;
}

上一题