#1623 : 有歧义的号码

解决一个有趣的问题:找出马拉松比赛中因号码贴反而产生歧义的所有号码。通过编写C++程序来判断一个号码在反转后是否仍为合法号码且不同于原号码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题一开始想麻烦了,直接打个表ok

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

小Hi参加了一场大型马拉松运动会,他突然发现面前有一位参赛者背后的号码竟然和自己一样,也是666。仔细一看,原来那位参赛者把自己号码帖反(旋转180度)了,结果号码999看上去变成了号码666。  

小Hi知道这次马拉松一共有N名参赛者,号码依次是1~N。你能找出所有可能因为贴反而产生歧义的号码吗?  

一个号码K可能产生歧义当且仅当反转之后的号码是合法的数字K',并且满足1 ≤ K' ≤ N且K' ≠ K。  

例如:

3没有歧义,因为贴反之后不是合法的数字。  

100没有歧义,因为001以0开头,不是合法号码。  

101也没有歧义,因为贴反之后还是101本身。  

假设N=10000000,则1025689有歧义,因为贴反之后变成6895201。如果N=2000000,则1025689没有歧义,因为6895201大于N。

输入

一个整数N。(1 ≤ N ≤ 100000)

输出

从小到大输出1~N之间所有有歧义的号码。每个号码一行。

样例输入
10
样例输出
6
9

代码:

#include<bits/stdc++.h>
using namespace std;
int N;
int num[20];
int ans[100010];
int cal(int x)
{
    int sum=0;
    if(x%10==0)
        return 0;
    while(x!=0)
    {
        int lala=x%10;
        if(lala==3||lala==4||lala==7)
          return 0;
        else
        {
            sum=sum*10+num[lala];
        }
        x=x/10;
    }
    return sum;
}
int solve(int x)
{
    int p=cal(x);
    if(p>=1&&p<=N&&p!=x)
        return 1;
    else
        return 0;
}
int main()
{
    cin>>N;
    num[0]=0;num[1]=1;num[2]=2;
    num[5]=5;num[6]=9;num[8]=8;num[9]=6;
    memset(ans,0,sizeof(ans));
    for(int i=1;i<=100001;i++)
    {
        if(solve(i)==1)
            ans[i]=1;
        else
            ans[i]=0;
    }
        for(int i=1;i<=N;i++)
        {
            if(ans[i]==1)
                cout<<i<<endl;
        }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值