这道题一开始想麻烦了,直接打个表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;
}