- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个模板类,它采用无符号整数作为模板参数,但我必须确保该数字是质数。例如,我可以在构造函数中检查它,但最好在编译期间进行检查。
这是我正在使用的断言模板:
template <bool statement>
class Assert;
template <>
struct Assert<true> {};
我可以在任何要编译的代码中简单地创建一个这种类型的对象,使用我的条件作为参数,如果条件为假,它就不会编译。问题是我必须检查某个数字是否为素数。让它成为 n。
我想出了一个想法,包括一个单独的文件“PrimeTest.h”,并尝试通过在该文件中包含同一文件来将 n 除以从 n-1 到 1 的每个数字。我就是这样使用它的:
#define SUSPECT n
#include "PrimeTest.h"
这是“PrimeTest.h”:
#ifdef SUSPECT
#ifndef CURRENT
#define CURRENT (SUSPECT-1)
#endif // CURRENT
#ifndef FINISHED
#if CURRENT>100
#define IS_PRIME
#define FINISHED
#else
#if SUSPECT%CURRENT==0
#define IS_NOT_PRIME
#define FINISHED
#else
#define CURRENT (CURRENT-1) // THAT DOES NOT WORK!!!
#include "PrimeTest.h"
#endif // SUSPECT % CURRENT != 0
#endif
#endif // FINISHED
#endif // SUSPECT
但这就是问题所在:我无法以任何我能想到的方式减少 CURRENT,包括临时值和#pragma push_macro 指令。有什么想法吗?
最佳答案
您不需要预处理器在编译时计算某些东西。通常,当需要计算时,您使用模板元编程(或 chris 在他的回答中建议的 constexpr
函数)
通过模板元编程,您可以按如下方式解决任务:
首先你定义一个模板,它可以在编译时检查给定值是否为N
。被 D
整除或任何低于 D
的值大于 1。
template <int N, int D>
struct tmp {
static const bool result = (N%D) && tmp<N,D-1>::result;
};
template <int N>
struct tmp<N,1> {
static const bool result = true;
};
值tmp<N,D>::result
是true
仅当数字 2、3、... D
不分N
.
有了上面的工具,创建is_prime
编译时检查器相当简单:
template <int N>
struct is_prime {
static const bool result = tmp<N,N-1>::result;
};
现在编译时值is_prime<N>::result
是true
什么时候N
是质数,false
否则。该值可以提供给更多模板,例如 Assert
你的。
关于c++ - 在 C++ 编译期间检查数字是否为质数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16761082/
我知道这不是寻找素数的最佳方法,也不是最有效的方法;但是,我似乎无法找到 169 算作素数的原因(就我而言,对于较小的数字,它可以正常工作)。 public static int checkPrime
有人可以指导我获取素数吗?这是家庭作业,所以我不想要答案,但一些指示将不胜感激。这真的让我很烦:( 我想我很接近。但是我遇到的问题是数字 25 和 35。它们不是质数,但是这个函数正在返回它们 var
利用正则判别素数,来源于网络,神人! 复制代码 代码如下: Set regex = New RegExp regex.Pattern = "^1?$&b
质数又称素数。一个大于1的自然数,如果除了1和它自身外,不能被其他自然数整除的数;否则称为合数。根据算术基本定理,每一个比1大的整数,要么本身是一个质数,要么可以写成一系列质数的乘积;而且如果不考虑
我在 Ruby on Rails 中尝试如何找到质数。这是我的代码: 助手:app/helpers/test_helper.rb module TestHelper
lower = int(input("from:")) upper = int(input("to:")) for num in range(lower,upper + 1): if num >
最近我对 LINQ 很感兴趣。我正在尝试获取质数。我实际上做得很好,但我的代码没有显示低于 Sqrt(n) 的素数。 static void Main(string[] args) {
在尝试设计算法时,我偶然发现了这个问题。这不是家庭作业。 令 P_i = 前 i 个素数的数组。现在我需要最小的 i 这样 Sum 1 / (P_i[n]*P_i[n]) >= 1. (如果这样的
本文已收录到 AndroidFamily ,技术和职场问题,请关注公众号 [彭旭锐] 提问。 大家好,我是小彭。 上周跟大家讲到小彭文章风格的问题,和一些朋友聊过以后,
我是新来的。我正在尝试解决此练习 Problem 18只是为了加强我的解决能力。我已经编码了答案。该任务要求“在 1,000,000 以下的质数中,有多少个数位之和等于两周中的天数?” (两周是 14
我是一名优秀的程序员,十分优秀!