namespace Practice
{
public class LargestPrimeFactor {
public static void main(String[] args) {
readonly long NUM = 600851475143L;
int i;
int n;
int flag = 0;
long primeFactor = 1;
long factor = 1;
for(i=2; i<NUM/2; i++) {
flag = 0;
for(n=2; n < i/2; n++) {
if(i % n == 0) {
flag = 1;
}
}
if(flag == 0){
factor = i;
if(NUM % factor == 0) {
primeFactor = factor;
Console.WriteLine("factor = " + factor);
}
}
}
Console.WriteLine(primeFactor);
}
}
}
请解释我做错了什么。我不知道如何声明此变量,使其为只读。当我将其放在方法之外时,会遇到不同的错误。
答案 0 :(得分:1)
您想将NUM声明为const
而不是只读。
答案 1 :(得分:1)
readonly
修饰符在类级别有效,因此您可以将其重构为:
public class LargestPrimeFactor {
readonly long NUM = 600851475143L;
public static void main(String[] args) {
// ...
}
}
或者,您可以在字段级别或方法内部使用const
关键字:
public class LargestPrimeFactor {
const long NUM = 600851475143L;
public static void main(String[] args) {
// ...
}
}
或
public class LargestPrimeFactor {
public static void main(String[] args) {
const long NUM = 600851475143L;
// ...
}
}
readonly
对于在构造函数完成之前将被完全初始化但没有常量表示形式的变量最有用,例如
readonly DateTime startedAt = DateTime.Now;
答案 2 :(得分:0)
如果您为readonly
读了the documentation,将会发现它不适用于方法内部声明的变量。关键字只能应用于:
如果您希望不修改在方法内部定义的变量,则可以使用const
关键字对其进行声明:
public static void Main(string[] args)
{
const long num = 600851475143L;
}
答案 3 :(得分:0)
我想做类似的事情,但要针对在运行时计算的值。我使用了新的(ish)本地函数功能而不是 const long NUM = 600851475143L
- 不完全是 const
或 readonly
,而是一种锁定值的方法
long NUM() => someLongRuntimeValue;
. . .
for(i=2; i<NUM()/2; i++) {
. . .
这需要几个括号和一些运行时开销——在我的例子中,这个值只会被使用几次。这是一个由许多人编辑的模块中的防御性代码实践,一种说“我知道你可能认为你想改变这个值,但如果你这样做你会破坏事情”的方式 - 我未来的自己是我的人之一正在谈话)
(由于这个 SO 线程是搜索引擎导致此错误的地方,我认为这是对并行问题发表评论的合理场所(SO mods 可能不同意,我对此很好))。