我只是编写一个过程来将无符号整数分解为素数。如果我将数据类型定义为“ int ”,它将正常工作,如果我将其更改为“ long ”,结果将是错误的。我不知道为什么。
BTW,我使用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。
答案 0 :(得分:1)
您目前编写的函数DividerIsPrime
存在缺陷,逻辑上必须始终返回True
。
原因是每次迭代都会改变状态。即使达到status=False
(数字是复合的,因为分频器的模数为零),然后迭代将继续,并且在每种情况下,当status=True > divider ==(data - 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. */
显然,有更多有效的“素性测试”算法。