【发布时间】:2015-10-29 23:28:28
【问题描述】:
我正在使用具有不同功能的数学软件,其中之一是查找给定区间 [a,b) 内的所有卡迈克尔数
这是我的代码,但我不知道我是否正确完成了它,因为我无法测试它,因为最小的卡迈克尔数是 560,这对于我的电脑来说太大了无法处理。
#include <stdio.h>
int main() {
unsigned int begin, end;
printf("Write an int (begin):\n");
scanf("%d", &begin);
printf("Write an int (end):\n");
scanf("%d", &end);
int i;
for( int i=begin; i<end; i++ ) {
long unsigned int a_nr = i-1;
int a[a_nr];
for( int j=0; j<a_nr; j++ ) {
a[j] = j;
}
unsigned long c_nr[a_nr];
for( int k=0; k<a_nr; k++ ) {
unsigned long current_c_nr;
int mod;
for( int l=0; l<i; l++ ) {
current_c_nr= current_c_nr * a[k];
}
mod = current_c_nr%i;
if( mod==a[k] && mod!=a[k] ) {
c_nr[k] = i;
}
}
}
return 0;
}
如果不正确,错误在哪里?
谢谢
应该防止P.S溢出。
【问题讨论】:
-
你需要初始化
current_c_nr变量,因为它在声明后包含一些垃圾值 -
@SamProtsenko 用哪个值初始化? 1 个?
-
我不知道 :) 取决于您的算法实现。我刚刚注意到您在计算中使用了未初始化的变量,这可能会导致错误的结果。但从逻辑的角度来看——是的,它似乎应该是
1。 -
您应该实现一个 gcd 函数和一个高效的模幂函数(一个不使用重复乘法,而是使用平方取幂,而且从不涉及太多中间数大于模数),然后再搜索 Carmichael 数。这些函数只有几行代码,可以让您在几分之一秒内将 560 验证为卡迈克尔数。
标签: c math number-theory