牛客题目:手机号码
手机号码
https://ac.nowcoder.com/acm/problem/21297
题目描述:给你一个整数n表示手机号码的位数再给你m个字符串表示保留的号码,比如911 110 120等,问你一共有多少的手机号码不以保留号码开头
分析:不已保留号码开头的手机号码有多少个,要注意的是如果保留号码为1 那么如果后面还出现了100,102之类的以1开头的都不用算了,所以我们将保留号码的类型定义为字符串,因为字符串有find()函数,可以查询某个字符串是不是另外一个字符串的子串,如果字符串a是字符串b的子串那么将字符串b赋值为“null”,经过两个循环后就只剩最简单的那几个字符串(最简单的字符串就是在整个字符串数组里面,该字符串不是任何字符串的子串)接下来就很简单了
源代码:
#include<bits/stdc++.h>
using namespace std;
long long pows(int n)//该函数的作用是算10的n次方
{
long long sum=1;
for(int i=0;i<n;i++)
{i
sum*=10;
}
return sum;//返回一个long long 类型的,因为int类型装不下这太大的数字
}
int main()
{
int n,m;
long long sum1=0;
cin>>n>>m;
string number[1000];//定义一个字符串数组用来装保留号码
for(int i=0;i<m;i++)cin>>number[i];
sort(number,number+m);//这个可有可无吧,加一个也没关系
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
if(j!=i&&number[j].find(number[i])==0)//如果number[i]是number[j]的子串那么就处理number[j]
{
number[j]="null";
}
}
}
for(int i=0;i<m;i++)
{
if(number[i]!="null")
{
sum1+=pows(n-number[i].length());//算出以保留号码开头的手机号的数目
}
}
printf("%lld",pows(n)-sum1);
}

查看19道真题和解析