首页 > 试题广场 >

手机号

[编程题]手机号
  • 热度指数:2315 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
    很多网站都要求用户输入手机号码,现在请写一个程序,判断用户输入的手机号码是否合法。本题中定义的合法手机号和现实中的手机号有出入,解题时以题面定义为准。
    一个合法的手机号码满足以下条件:
    (1)手机号码由 11 位数字构成。
    (2)手机号码的前三位为网络识别号,对应不同的手机运行商,在本题中只有以下几种(其余情况在本题中一律认为手机号不合法)
        中国电信:133,153,180,181,189
        中国联通:130,131,155,185,186
        中国移动:135,136,150,182,188
    (3)剩下 8 位数字任意
    现在输入手机号码,请判断是否合法

输入描述:
第一行一个数 T ,接下里 T 行每行一个手机号,输入的手机号只由数字构成。


输出描述:
输出 T 行,对每个手机号,如果满足题面定义,
电信号码输出 China Telecom
联通号码输出 China Unicom
移动号码输出 China Mobile Communications
如果不符合题面定义则输出 -1
示例1

输入

5
13312345678
18687654324
18277748494
15898494958
45364

输出

China Telecom
China Unicom
China Mobile Communications
-1
-1

Python3解法

def judge(number):
    if len(number) != 11:
        return -1
    if number[:3] in ["133", "153", "180", "181", "189"]:
        return "China Telecom"
    if number[:3] in ["130", "131", "155", "185", "186"]:
        return "China Unicom"
    if number[:3] in ["135", "136", "150", "182", "188"]:
        return "China Mobile Communications"
    return -1

for i in range(int(input())):
    print(judge(input()))
发表于 2019-02-23 10:01:24 回复(1)
更多回答
// java中的switch可以支持String,正好试一试
import java.io.*;
public class Main{
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        while(n-->0){
            String s = br.readLine();
            if(s.length() != 11) {System.out.println("-1"); continue;}
            switch(s.substring(0,3)){
                case "133":
                case "153":
                case "180":
                case "181":
                case "189":
                    System.out.println("China Telecom");break;
                case "130":
                case "131":
                case "155":
                case "185":
                case "186":
                    System.out.println("China Unicom");break;
                case "135":
                case "136":
                case "150":
                case "182":
                case "188":
                    System.out.println("China Mobile Communications");break;
                default: System.out.println("-1");
            }
        }
        br.close();
    }
}

编辑于 2019-03-28 19:26:39 回复(0)
直接分支判断即可
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine().trim());
        while(T-- > 0){
            String phoneNum = br.readLine().trim();
            if(phoneNum.length() != 11){
                // 长度违法
                System.out.println(-1);
            }else if(phoneNum.startsWith("135") || phoneNum.startsWith("136") ||
                     phoneNum.startsWith("150") || phoneNum.startsWith("182") ||
                     phoneNum.startsWith("188")){
                // 移动号码
                System.out.println("China Mobile Communications");
            }else if(phoneNum.startsWith("130") || phoneNum.startsWith("131") ||
                     phoneNum.startsWith("155") || phoneNum.startsWith("185") ||
                     phoneNum.startsWith("186")){
                // 联通号码
                System.out.println("China Unicom");
            }else if(phoneNum.startsWith("133") || phoneNum.startsWith("153") ||
                     phoneNum.startsWith("180") || phoneNum.startsWith("181") ||
                     phoneNum.startsWith("189")){
                // 电信号码
                System.out.println("China Telecom");
            }else{
                // 未知
                System.out.println(-1);
            }
        }
    }
}


发表于 2021-02-03 18:33:17 回复(0)
# 是一个字符串处理的问题,看似复杂,实则只是有点麻烦
# 首先看位数是否正常,然后看前缀是否符合要求,符合,输出服务商,不符合,输出-1
# 后8位需要是数字,不要忽略了python提供了好用的str.isdigit() 判断str所有字符都是数字
# 本题输入全是数字,限定死了
n = int(input())
ln = []
for i in range(n):
    ln.append(input())
for e in ln:
    if len(e) == 11:
        if e[:3] in ["133", "153", "180", "181", "189"]:
            print("China Telecom")
        elif e[:3] in ["130", "131", "155", "185", "186"]:
            print("China Unicom")
        elif e[:3] in ["135", "136", "150", "182", "188"]:
            print("China Mobile Communications")
        else:
            print(-1)
    else:
        print(-1)
# 还有更简洁的组织方式,但是本质上是一样的

发表于 2019-08-09 00:09:43 回复(0)
import java.util.HashMap;
import java.util.Scanner;

public class Main {

    public static String isLegalPhoneNumber(String str, HashMap<String, String > map) {
        if (str.length() != 11) {
            return "-1";
        }
        String  s = str.substring(0, 3);
        if (map.containsKey(s)) {
            return map.get(s);
        } else {
            return "-1";
        }
    }


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        HashMap<String, String> map = new HashMap<>();

        map.put("133", "China Telecom");
        map.put("153", "China Telecom");
        map.put("180", "China Telecom");
        map.put("181", "China Telecom");
        map.put("189", "China Telecom");

        map.put("130", "China Unicom");
        map.put("131", "China Unicom");
        map.put("155", "China Unicom");
        map.put("185", "China Unicom");
        map.put("186", "China Unicom");

        map.put("135", "China Mobile Communications");
        map.put("136", "China Mobile Communications");
        map.put("150", "China Mobile Communications");
        map.put("182", "China Mobile Communications");
        map.put("188", "China Mobile Communications");

        int n = sc.nextInt();
        while(n-- > 0) {
            String str = sc.next();
            System.out.println(isLegalPhoneNumber(str, map));
        }

    }
}
发表于 2019-06-16 12:35:09 回复(0)
噗哈哈哈哈,复制粘贴写起来还是比开数组快啊~~~~
import java.math.BigInteger; import java.util.*;  public class Main { private static final String[] DX = {"133","153","180","181","189"};  private static final String[] LT = {"130","131","155","185","186"};  private static final String[] YD = {"135","136","150","182","188"};  public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);  int t  = sc.nextInt();  while (t-- != 0) {
            String in = sc.next();  if (in.length() != 11) {
                System.out.println(-1);  continue;  } boolean right = false;  for (String b : DX) { if (in.startsWith(b)) {
                    System.out.println("China Telecom");  right = true;  break;  }
            } if (right) { continue; } for (String b : LT) { if (in.startsWith(b)) {
                    System.out.println("China Unicom");  right = true;  break;  }
            } if (right) { continue; } for (String b : YD) { if (in.startsWith(b)) {
                    System.out.println("China Mobile Communications");  right = true;  break;  }
            } if (right) { continue; }
            System.out.println(-1);  }
    }
}
发表于 2019-03-02 16:32:12 回复(0)
#include <bits/stdc++.h>

using namespace std;

void F(string s){     if(s=="133" || s=="153" || s=="180" || s=="181" || s=="189")         cout<<"China Telecom"<<endl;     else if(s=="130" || s=="131" || s=="155" || s=="185" || s=="186")         cout<<"China Unicom"<<endl;     else if(s=="135" || s=="136" || s=="150" || s=="182" || s=="188")         cout<<"China Mobile Communications"<<endl;     else         cout<<-1<<endl;
}

int main()
{     int T;     cin>>T;     while(T--){         string s;         cin>>s;         int n = s.length();         if(n!=11)             cout<<-1<<endl;         else{             F(s.substr(0,3));         }     }     return 0;
}

发表于 2019-02-19 03:01:38 回复(0)
 n=int(input(''))
d=['133','153','180','181','189']
l=['130','131','155','185','186']
y=['135','136','150','182','188']
for i in range(n):
    m=input('')
    if len(m)!=11:
        print(-1)
    else:
        if m[0:3] in d:
            print('China Telecom')
        elif m[0:3] in l:
               print('China Unicom')
        elif m[0:3] in y:
               print('China Mobile Communications')
        else:
               print('-1')

发表于 2019-01-18 11:33:34 回复(0)
#include <bits/stdc++.h>
using namespace std;

bool isTrue(string a[],string s)   //判断s属不属于a
{
    if(s.length() != 11)
    {
        return false;
    }
    string temp = s.substr(0,3);
    for(int i = 0; i < 5; i++)
    {
        if(a[i] == temp)
        {
            return true;
        }
    }
    return false;
}

int main()
{
    string CT[] = {"133","153","180","181","189"};   //中国电信
    string CU[] = {"130","131","155","185","186"};   //中国联通
    string CMC[] = {"135","136","150","182","188"};  //中国移动
    int T;
    cin >> T;
    for (int i = 0; i < T; i++)
    {
        string temp;
        cin >> temp;
        if(isTrue(CT,temp))
        {
            cout << "China Telecom" << endl;
        }
        else if(isTrue(CU,temp))
        {
            cout << "China Unicom" << endl;
        }
        else if(isTrue(CMC,temp))
        {
            cout << "China Mobile Communications" << endl;
        }
        else
        {
            cout << -1 << endl;
        }
    }
    return 0;
}

编辑于 2019-01-10 13:11:02 回复(0)
t = int(input(""))
ct = [133,153,180,181,189]
cu = [130,131,155,185,186]
cmc = [135,136,150,182,188]
while t > 0:
    s = input("")
    n = len(s)
    a = s[:3]
    if n == 11:
        if a in ct:
            print("China Telecom")
        elif a in cu:
            print("China Unicom")
        elif a in cmc:
            print("China Mobile Communications")
        else:
            print(-1)
    else:
        print(-1)
    t -= 1

发表于 2023-08-08 16:12:15 回复(2)
import java.util.Scanner;

public class Main{
    public static void main(String [] args){
        Scanner scaner=new Scanner(System.in);   
        
       int count= scaner.nextInt();
        
        for(int i=0;i<count;i++){
            String str=scaner.nextLine();
          
            try{
            Long.parseLong(str);
            }catch(Exception e){
                System.out.println("-1");
                continue;
            }
            if(str.length()!=11){
                System.out.println("-1");
                continue;
            }
            String prefix=str.substring(0,3);
            
            switch(prefix){
                case "133":
                case "153":
                case "180":
                case "189":
                    System.out.println("China Telecom");
                    break;
                    
                case "130": 
                case "131": 
                case "155": 
                case "185": 
                case "186": 
                   System.out.println("China Unicom");
                    break;
                case "135": 
                case "136": 
                case "150": 
                case "182":
                case "188":
                    System.out.println("China Mobile Communications");
                    break;
                default:
                    System.out.println("-1");
                    
            }
            
        }
        
    }
    
}

发表于 2021-04-27 11:23:42 回复(0)
T = eval(input())
phoneNumber = []
for i in range(T):
    phoneNumber.append(input())
ct = ['133','153','180','181','189']
cu = ['130','131','155','185','186']
cmc = ['135','136','150','182','188']
for i in phoneNumber:
    if len(i) != 11:
        print('-1')
        continue
    elif i[0:3] in ct:
        print('China Telecom')
    elif i[0:3] in cu:
        print('China Unicom')
    elif i[0:3] in cmc:
        print('China Mobile Communications')
    else:
        print('-1')

发表于 2021-02-16 22:56:06 回复(0)
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int isnum(string s){
    if(s.length()!=11||s[0]!='1') return 0;
    else{
        if((s[1]=='3'||s[1]=='5')&&s[2]=='3') return 1;
        else if(s[1]=='3'&&(s[2]=='0'||s[2]=='1')) return 2;
        else if(s[1]=='3'&&(s[2]=='5'||s[2]=='6')) return 3;
        else if(s[1]=='5'&&s[2]=='5') return 2;
        else if(s[1]=='5'&&s[2]=='0') return 3;
        else if(s[1]=='8'&&(s[2]=='0'||s[2]=='1'||s[2]=='9')) return 1;
        else if(s[1]=='8'&&(s[2]=='5'||s[2]=='6')) return 2;
        else if(s[1]=='8'&&(s[2]=='2'||s[2]=='8')) return 3;
        else return 0;
    }
}
int main(){
    int t;
    cin>>t;
    while(t--){
        string s;
        cin>>s;
        int res=isnum(s);
        if(res==1) cout<<"China Telecom"<<endl;
        else if(res==2) cout<<"China Unicom"<<endl;
        else if(res==3) cout<<"China Mobile Communications"<<endl;
        else cout<<-1<<endl;
    }
    return 0;
}
分类讨论
发表于 2020-08-30 09:59:39 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main()
{
	int z;
	cin >> z;
	while (z--)
	{
		string s, ss = "";
		cin >> s;
		if (s.size() != 11)cout << -1 << endl;
		else
		{
			for (int i = 0; i < 3; i++)ss += s[i];
			if (ss == "133" || ss == "153" || ss == "180" || ss == "181" || ss == "189")cout << "China Telecom" << endl;
			else if (ss == "130" || ss == "131" || ss == "155" || ss == "185" || ss == "186")cout << "China Unicom" << endl;
			else if (ss == "135" || ss == "136" || ss == "150" || ss == "182" || ss == "188")cout << "China Mobile Communications" << endl;
			else cout << -1 << endl;
		}
	}
}

发表于 2020-04-30 16:07:22 回复(0)
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    vector<string> CT{"133","153","180","181","189"};
    vector<string> CU{"130","131","155","185","186"};
    vector<string> CM{"135","136","150","182","188"};
    int N;
    cin>>N;
    for(int i=0;i<N;i++)
    {
    string rec;
    cin>>rec;
    int s=rec.size();
    if(find(CT.begin(),CT.end(),rec.substr(0,3))!=CT.end()&&s==11)
    cout<<"China Telecom"<<endl;
    else if(find(CU.begin(),CU.end(),rec.substr(0,3))!=CU.end()&&s==11)
    cout<<"China Unicom"<<endl;
    else if(find(CM.begin(),CM.end(),rec.substr(0,3))!=CM.end()&&s==11)
    cout<<"China Mobile Communications"<<endl;
	else cout<<-1<<endl;
    }
}

发表于 2019-09-10 23:33:07 回复(0)
#include <stdio.h>
#include <string.h>

#define MAXN 25

int n;
char s[MAXN];
char ss[4];

int main()
{
	int i,j;
	scanf("%d",&n);
	getchar();
	for(i=0;i<n;i++)
	{
		gets(s);
		if(strlen(s)!=11)
		{
			puts("-1");
			continue;
		}
		for(j=0;j<3;j++)
			ss[j] = s[j];
		if(	strcmp(ss,"133")==0 ||
			strcmp(ss,"153")==0 ||
			strcmp(ss,"180")==0 ||
			strcmp(ss,"181")==0 ||
			strcmp(ss,"189")==0)
		{
			puts("China Telecom");
			continue;
		}
		if(	strcmp(ss,"130")==0 ||
			strcmp(ss,"131")==0 ||
			strcmp(ss,"155")==0 ||
			strcmp(ss,"185")==0 ||
			strcmp(ss,"186")==0)
		{
			puts("China Unicom");
			continue;
		}
		if(	strcmp(ss,"135")==0 ||
			strcmp(ss,"136")==0 ||
			strcmp(ss,"150")==0 ||
			strcmp(ss,"182")==0 ||
			strcmp(ss,"188")==0)
		{
			puts("China Mobile Communications");
			continue;
		}
		puts("-1");
	}
	return 0;
}

发表于 2019-08-22 17:15:53 回复(0)
#include<iostream>
using namespace std;
int main()
{
long long k=0;
int t,i;
cin>>t;
long long s[t];  
cout<<endl; 
for(i=0;i<=t-1;i++){
	cin>>s[i];
    cout<<endl; 
   // cout<<s[i];   
}
for(i=0;i<=t-1;i++){
	 k=s[i]/100000000;
    if(k==133||k==153||k==180||k==181||k==189)
    cout<<"China Telecom";
    else if(k==130||k==131||k==155||k==185||k==186)
    cout<<"China Unicom";
    else if(k==135||k==136||k==150||k==182||k==188)
    cout<<"China Mobile Communications";
    else
	cout<<"-1";
    cout<<endl;
}
	return 0;
} 
在自己的软件上完全可以,提交到这里,case不过,说是空格问题,检查了好几遍,看不出来,求大神!!
发表于 2019-08-22 17:07:40 回复(2)
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
 
bool isTrue(vector<string>&vec,string s)   //判断s属不属于a
{
    if(s.length() != 11)
    {
        return false;
    }
    string temp = s.substr(0,3);
    if(find(vec.begin(),vec.end(),temp)!=vec.end())
    {
        return true;
    }else
    {
    return false;
    }
}
 
int main()
{
    vector<string>tele={"133","153","180","181","189"};
    vector<string>unic={"130","131","155","185","186"};
    vector<string>mobi={"135","136","150","182","188"};
    int T;
    cin >> T;
    for (int i = 0; i < T; i++)
    {
        string temp;
        cin >> temp;
        if(isTrue(tele,temp))
        {
            cout << "China Telecom" << endl;
        }
        else if(isTrue(unic,temp))
        {
            cout << "China Unicom" << endl;
        }
        else if(isTrue(mobi,temp))
        {
            cout << "China Mobile Communications" << endl;
        }
        else
        {
            cout << -1 << endl;
        }
    }
    return 0;
}
   

发表于 2019-06-19 19:20:41 回复(0)
正则,忘了怎么写就直接判断前三个吧
import java.util.Scanner;
import java.util.regex.Pattern;
public class Main{
       public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        String[] ss=new String[n];
        for(int i=0;i<n;i++){
            ss[i]=sc.next();
        }
        getResult(ss);

    }
    private static void getResult(String[] ss){
        for(String s:ss){
            String p1="^1(33|53|80|81|89)(\\d{8})";
            String p2="^1(30|31|55|85|86)(\\d{8})";
            String p3="^1(35|36|50|82|88)(\\d{8})";
            if(Pattern.matches(p1,s)){
                System.out.println("China Telecom");
            }else if(Pattern.matches(p2,s)){
                System.out.println("China Unicom");
            }else if(Pattern.matches(p3,s)){
                System.out.println("China Mobile Communications");
            }else{
                System.out.println(-1);
            }
        }
    }
}

发表于 2019-05-28 21:07:58 回复(0)
import java.util.Scanner;
import java.util.regex.Pattern;
public clas***ain {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        scanner.nextLine();
        for (int i = 0; i < n; i++) {
            System.out.println(solve(scanner.nextLine()));
        }
    }
    private static String solve(String phoneNumber) {
        String[] patterns = { "^(133|153|180|181|189)\\d{8}$", "^(130|131|155|185|186)\\d{8}$",
                "^(135|136|150|182|188)\\d{8}$" };
        String[] reses = { "China Telecom", "China Unicom", "China Mobile Communications" };
        for (int i = 0; i < 3; i++) {
            if (Pattern.matches(patterns[i], phoneNumber)) {
                return reses[i];
            }
        }
        return "-1";
    }
}

编辑于 2019-05-22 10:47:30 回复(0)