目录
牛客_神奇数_数学
题目解析
C++代码
Java代码
牛客_神奇数_数学
神奇数_牛客笔试题_牛客网 (nowcoder.com)
描述:
给出一个区间[a, b],计算区间内“神奇数”的个数。
神奇数的定义:存在不同位置的两个数位,组成一个两位数(且不含前导0),且这个两位数为质数。
比如:153,可以使用数字3和数字1组成13,13是质数,满足神奇数。同样153可以找到31和53也为质数,只要找到一个质数即满足神奇数。
题目解析
数学模拟题,注意一些细节问题即可,比如不要出现前导 0
C++代码
#include <cmath>
#include <iostream>
#include <string>
using namespace std;
bool isPrime(int x) // 判断是否是质数
{
for(int i = 2; i <= sqrt(x); ++i)
{
if(x % i == 0)
return false;
}
return true;
}
bool isTrue(int x) // 判断是否是神奇数
{
string str = to_string(x);
int sz = str.size();
for(int i = 0; i < sz; ++i) // 枚举十位数
{
if(str[i] == '0')
continue;
for(int j = 0; j < sz; ++j) // 枚举个位数
{
if(j != i && isPrime((str[i] - '0') * 10 + (str[j] - '0')))
return true;
}
}
return false;
}
int main()
{
int a = 0, b = 0;
cin >> a >> b;
int cnt = 0;
for(int i = a; i <= b; ++i)
{
if(isTrue(i))
++cnt;
}
cout << cnt << endl;
return 0;
}
Java代码
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main
{
public static boolean isprim(int x) // 判断是否是质数
{
if(x < 2) return false;
for(int i = 2; i <= Math.sqrt(x); i++) // 试除法
{
if(x % i == 0) return false;
}
return true;
}
public static int check(int x) // 判断是否是神奇数
{
int[] num = new int[10];
int n = 0;
while(x != 0)
{
num[n++] = x % 10;
x /= 10;
}
for(int i = 0; i < n; i++) // 枚举⼗位数
{
for(int j = 0; j < n; j++) // 枚举个位数
{
if(num[i] != 0 && i != j)
{
if(isprim(num[i] * 10 + num[j]))
{
return 1;
}
}
}
}
return 0;
}
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
int a = in.nextInt(), b = in.nextInt();
int ret = 0;
for(int i = Math.max(a, 10); i <= b; i++)
{
ret += check(i);
}
System.out.println(ret);
}
}