神奇数-牛客网习题

博客内容介绍了如何快速判断两位数是否为质数,通过预先存储两位数质数到数组,避免每次计算质数的复杂过程。

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

给出一个区间[a, b],计算区间内“神奇数”的个数。
神奇数的定义:存在不同位置的两个数位,组成一个两位数(且不含前导0),且这个两位数为质数。
比如:153,可以使用数字3和数字1组成13,13是质数,满足神奇数。同样153可以找到31和53也为质数,只要找到一个质数即满足神奇数。 
输入描述:
输入为两个整数a和b,代表[a, b]区间 (1 ≤ a ≤ b ≤ 10000)。

输出描述:
输出为一个整数,表示区间内满足条件的整数个数

输入例子:
11 20

输出例子:

6

思路:

因只需判断二位数质数,数量比较少,可以使用一个数组存放二位数质数,免去每次都要计算是不是质数

将每一位存放在数组里,供遍历使用

#include "stdafx.h"
#include <iostream>
#include <vector>

using namespace std;


int main()
{
	bool prime[100] = { 0 };
	prime[11] = 1;	prime[13] = 1;	prime[17] = 1;	prime[19] = 1;	prime[23] = 1;	prime[29] = 1;	prime[31] = 1;	prime[37] = 1;	prime[41] = 1;	prime[43] = 1;	prime[47] = 1;
	prime[53] = 1;	prime[59] = 1;	prime[61] = 1;	prime[67] = 1;	prime[71] = 1;	prime[73] = 1;	prime[79] = 1;	prime[83] = 1;	prime[89] = 1;	prime[97] = 1;
	int a = 0;
	int b = 0;
	cin >> a;
	cin >> b;
	if (a < 10) a = 10;

	int count = 0;
	if (b <= 10)
	{
		count = 0;
	}
	else
	{
		vector<int> ary_everyNum;
		for (int i = a; i <= b; ++i)
		{
			bool bPrime = false;
			int n = i;
			ary_everyNum.clear();
			while (n)
			{
				ary_everyNum.push_back(n % 10);
				n = n / 10;
			}
			for (int j = 0; j < ary_everyNum.size(); ++j)
			{
				if (bPrime)
				{
					break;
				}
				for (int k = j-1; k >= 0; --k)
				{
					int num = ary_everyNum[j] * 10 + ary_everyNum[k];
					if (prime[num])
					{
						bPrime = true;
						++count;
						break;
					}
				}
				if (!bPrime)
				{
					for (int k = j + 1; k < ary_everyNum.size(); ++k)
					{
						int num = ary_everyNum[j] * 10 + ary_everyNum[k];
						if (prime[num])
						{
							bPrime = true;
							++count;
							break;
						}
					}
				}
			}
		}
	}
	cout << count << endl;


	cin.get();
	cin.get();
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值