2010-06-27 75 views
0

我只写了一个过程来将无符号整数分解为素数。如果我将数据类型定义为“int”,如果将其更改为“long”,则结果将会错误。我不知道为什么。整数类型长整数和分数

顺便说一句,我用Win-TC作为我的编译器。如下

代码:

#include "stdio.h" 
#define True 0xff 
#define False 0x00 
char DividerIsPrime(unsigned long data); 
void CheckIfDataCanBeExtracted(unsigned long data); 
main() 
{ 
    unsigned long data; 
    printf("please input data:"); 
    scanf("%d",&data); 
    printf("\n%d=",data); 
    CheckIfDataCanBeExtracted(data); 
// printf("%d",sizeof(short)); 
    getch(); 
} 

void CheckIfDataCanBeExtracted(unsigned long data) 
{ 
    unsigned long divider,temp,data1; 
    data1=data; 
    for(divider=2;divider<=data;divider++) 
    { 
     temp=data1%divider; 
     if(temp) {continue; } 
     if(DividerIsPrime(divider)) { 
     data1 = data1/divider; 
     printf("%d",divider); 
     if(data1==1) break; 

     else {printf("*"); divider--;} 


     } 
    } 
    return; 

} 

/* Check if this number is a prime number */ 
char DividerIsPrime(unsigned long data) 
{ 
    unsigned long divider; 
    char status=True; 
    for(divider=2;divider<data;divider++) 
    { 
     if(data%divider) status=True; 
     else status=False; 
    } 
    return status; 
} 

感谢保罗的帮助下,我知道错了。 %d应该被替换为%ld。

+1

结果是什么?它怎么错了? – djna 2010-06-27 06:26:35

+0

首先,请正确格式化您的代码,这几乎不可读。然后不要使用'char'作为真值,在C89中你应该总是使用'int'而不是假的常量:我从来没有看到有人使用255作为真,哇。但是要说到这一点,你没有告诉我们这是什么以及如何失败。 – 2010-06-27 06:35:44

+0

如果我输入数据= 4,那么它输出4 = 2 * 2 * 3 * 1597 * -21753; 我打印data1/divider,其结果是负数..但我将其定义为“无符号”。 – 2010-06-27 06:40:10

回答

1

您的功能DividerIsPrime,如目前所写,具有缺陷,在逻辑上它必须始终返回True

原因是每次迭代都会改变状态。即使达到status=False(该数字是合成的,因为模数对于分频器来说为零),则迭代将继续,并且在最终迭代中将达到status=True,当除数==(数据-1)

如下您可以更改此:

/* Check if this number is a prime number */ 
char DividerIsPrime(unsigned long data) 
{ 
    unsigned long divider; 
    for(divider=2;divider<data;divider++) 
    { 
     if (0==(data % divider)) 
      return False; 
    } 

    return True; 
} 

你会发现这与一些“单元测试”,如:

assert(DividerIsPrime(5)); 
assert(!DividerIsPrime(6)); /* This test would fail without corrected code. */ 

显然,对于“素性测试更加高效的算法”。

+1

但是,这个缺陷应该在整数上显而易见。想知道为什么海报认为整数/长差是重要的。 – djna 2010-06-27 06:40:22

+0

我改变了你提到的功能。但其结果重新发送失败。 – 2010-06-27 06:42:17

+0

你知道原始函数是不正确的吗?为什么?这听起来像你只是在说我的话。 – 2010-06-27 07:25:26