第九十八场周赛. 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;
}
标签:周赛,10,非负,样例,4948,整数,输出,美丽,AcWing
From: https://www.cnblogs.com/neko333/p/17729146.html