#1623 : 有歧义的号码

这道题一开始想麻烦了,直接打个表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
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;elsereturn 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;elseans[i]=0;}for(int i=1;i<=N;i++){if(ans[i]==1)cout<


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部