第九十八场周赛. AcWing 4948. 大乘积

发布时间 2023-09-25 23:39:35作者: neKo2333

第九十八场周赛. AcWing 4948. 大乘积

我们规定,如果一个非负整数 \(a\) 满足以下两个条件之一,则称 \(a\) 为美丽数:

  • \(a=0\)
  • \(a=10^x\),其中 \(x\) 为任意非负整数。

给定 \(n\)个非负整数 \(a_1,a_2,…,a_n\),这其中有至少 \(n−1\) 个数是美丽数。

请你计算并输出 \(a_1×a_2×…×a_n\) 的结果。

输入格式

第一行包含整数 \(n\)

第二行包含 \(a_1,a_2,…,a_n\)

输出格式

共一行,输出一个不含前导 \(0\) 的整数,表示 \(a_1×a_2×…×a_n\) 的结果。

数据范围

前 33 个测试点满足 \(1≤n≤5\)
所有测试点满足 \(1≤n≤10^5\)\(a_1∼a_n\) 均为不含前导 \(0\) 的非负整数,并且这 \(n\) 个数的总长度不超过 \(10^5\)

输入样例1:

3
5 10 1

输出样例1:

50

输入样例2:

4
1 1 10 11

输出样例2:

110

输入样例3:

5
0 3 1 100 1

输出样例3:

0
思路分析:n个数字总长度不超过10^5,很明显要使用字符串。每个数分为两类,美丽数和非美丽数字,首先写一个函数,判断它是否为美丽数,
如果它是美丽数,统计它的0的个数;如果它不是美丽数,就使用一个变量存起来(因为题目告诉最多只有一个非美丽数,可以这样操作)。依
次输入读入ai,如果ai为0直接输出0,不为0判断统计就行了,下面是代码。
代码:
#include<iostream>
using namespace std;
const int N = 100010;
//判断是否为美丽数,这里debug了很长时间
bool st(string s){
    if(s[0]!='1') return false; //如果第一位不是1,那么它必定不是美丽数
    for(int i=1;i<s.size();i++) //从第二位开始判断,如果不是0,那么它也不是美丽数
        if(s[i]!='0') return false;
    return true;
}
//统计美丽数有多少个0
int fc(string s){
    return s.size()-1;
}
int n,cnt;
string t,s;
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>s;
        if(s=="0"){
            cout<<0;
            return 0;
        }else if(st(s)) cnt+=fc(s);
        else t=s;
    }
    //这里还需要特判一下,如果输入的全部是美丽数,t就为空
    if(t=="") t="1";
    cout<<t;
    while(cnt--) cout<<0;
    return 0;
}