C语言中的问题int-long。代码可以很好地处理int,但不会很长。为什么?
当我使用int时,我的代码会产生正确的结果。但是当我在代码中使用长值时,代码不会停止,我需要Ctrl-C来停止它。函数C语言中的问题int-long。代码可以很好地处理int,但不会很长。为什么?,c,C,当我使用int时,我的代码会产生正确的结果。但是当我在代码中使用长值时,代码不会停止,我需要Ctrl-C来停止它。函数是div和是prime可以与long配合使用。问题出在prime\u divs中。我将inti(在循环中)修改为long I,但仍然没有任何内容 #include <stdio.h> long is_div(long number, long i) { // Vérifie si i est un diviseur de number return
是div
和是prime
可以与long
配合使用。问题出在prime\u divs
中。我将inti
(在循环中)修改为long I
,但仍然没有任何内容
#include <stdio.h>
long is_div(long number, long i)
{
// Vérifie si i est un diviseur de number
return number % i == 0;
}
long is_prime(long number)
{
// Vérifie si number est un nombre premier
for (int i = 2; i < number; i++)
if (is_div(number, i)) return 0;
return 1;
}
long* prime_divs(long number)
{
// Calcule la liste des diviseurs premiers de number
long index = 0;
static long prime_dividers[100];
for (long i = 2; i < number; i++){
if (is_prime(i) && is_div(number, i)){
prime_dividers[index++] = i;
}
}
return prime_dividers;
}
int main(void)
{
long *res = prime_divs(1021406);
for (long i = 0; i < 5; i++) printf("%li", res[i]);
}
#包括
long is_div(long number,long i)
{
//Vérifie是数字除数
返回编号%i==0;
}
长是素(长数)
{
//Vérifie si number是一个不知名的总理
for(int i=2;i
因为您使用的数字太大,所以代码需要很长时间才能工作。如果你等待,你会发现它最终会给出一个结果
此外,如评论中所述,
100
元素的prime\u divider
是不够的。你需要更多,但我不知道有多少。我会谨慎行事,选择10000
使用的算法非常慢,因为基本测试最多需要n
测试。OP只是等待的时间不够长
避免以下情况,因为它可能会在number
附近的LONG\u MAX
溢出
for (int i = 3; i*i <= number; i += 2) { // Overflow possible - UB
for(int i=3;i*我很遗憾,我已经尝试过了,但没有效果。我只是再次尝试以确定它是否有效,但没有。即使使用长i.@Gwynbleidd也可以在is_prime
中尝试。我尝试过,只是忘了在我的代码中编辑它。确定编辑:当我给出int时代码有效。这里:long*res=prime_divs(1021)。代码使用此数字。@gwynbled您的代码确实有效,但运行时间很长。请不要在有人发布答案后编辑代码以包含建议。例如,如果我建议在代码中使用long
而不是int
,请不要编辑问题以将int
更改为long
。你确定prime\u dividers
的100个元素足以覆盖到1021406吗?我想prime\u dividers[index++]
会超过索引100。当问题解决时,请不要在问题中添加“已解决”。只需接受答案。实际上,你的程序会因为i486所说的内容以及你编程的方式而崩溃“搜寻素数”的初始值为1021406,偶数乘以自身溢出。相比之下,0xffffffffff
是UINT_MAX
(只有一个f
更少)。@S.S.Anne True,但是i
在中对于(int i=3;i*i)不会太大
long is_prime(long number) {
// Handle cases 3 or less.
if (n <= 3) {
return n >= 2;
}
// for (int i = 2; i < number; i++)
// Notice this only iterates up to sqrt(number)
for (int i = 3; i <= number/i; i += 2) {
if (number%i == 0) return 0;
}
return 1;
}
for (int i = 3; i*i <= number; i += 2) { // Overflow possible - UB