codeforces 614B
http://codeforces.com/problemset/problem/614/B
模拟题
题目大意,给几个数,定义像这种一个1后面全是零的整百整千整万的叫美丽的数。如:1,100,1000000,1000000000
确保给出的数里只有一个不美丽的数,求这些数的乘积。
方法,分类
第一类,0,那么就不用继续了,直接输出0
第二类,美丽的数,统计美丽数后面0的个数,最后直接输出后面的0
第三类,不美丽的数,因为题目确保只有一个,所以只要把这个数记下来就行了。
最后输出的答案要么是0,要么就是不美丽的数加后面的0
初步做法如下
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;
char a[100005],ugly[100005]="1";
int main()
{
int n,c,i,j,num = 0,flag = 0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
c = num;
scanf("%s",a);
if(a[0]=='0') //首位为0,答案必然是0
flag = 1;
else if(a[0]=='1') //首位是1,会有两种情况一种为美丽数
{ //另一种仍然不是,不过要注意非美丽数的时候要把多记录的0去除
for(j=1;j<strlen(a);j++)
{
if(a[j]!='0')
{
strcpy(ugly,a);
num = c; //把多记录的0去除
break;
}
else
num++;
}
}
else
strcpy(ugly,a);
}
if(flag)
printf("0");
else{
printf("%s",ugly);
for(i=0;i<num;i++)
printf("0");}
printf("\n");
return 0;
}
改进做法:
#include <stdio.h>
#include <string.h>
const int MAXN=100005;
char s[MAXN],ugly[MAXN];
//the best solution I think
int isBeautiful()
{
if(strlen(s)==1)
return 1;
for(int i=1;i<strlen(s);i++)
if(s[i]!='0')
return 0;
return 1;
}
int main()
{
int n,num=0,isZero=0;
scanf("%d",&n);
strcpy(ugly,"1");
while(n--)
{
scanf("%s",s);
if(s[0]=='0')
{
isZero=1;
break;
}
else if(s[0]=='1'&&isBeautiful())
{
num+=strlen(s)-1;
continue;
}
else
strcpy(ugly,s);
}
if(isZero)
printf("0");
else
{
printf("%s",ugly);
for(int i=0;i<num;i++)
printf("0");
}
printf("\n");
return 0;
}