【问题标题】:integer type long and division整数类型 long 和除法
【发布时间】:2010-06-27 19:20:53
【问题描述】:

我只是编写了一个将无符号整数分解为素数的过程。如果我将数据类型定义为“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;
}

感谢 Paul 的帮助,我知道哪里出了问题。 %d 应替换为 %ld。

【问题讨论】:

  • 结果如何?怎么回事?
  • 首先,请正确格式化您的代码,这几乎不可读。那么不要使用char 作为真值,在C89 中你应该总是使用int 并且没有虚假的常量:我还没有见过有人使用255 作为真值,哇。但说到重点,你没有告诉我们失败的原因和原因。
  • 如果我输入数据=4,那么它输出4=2*2*3*1597*-21753;我打印 data1/divider,它的结果是一个负数..但我将它定义为“无符号”。
  • 您需要修复您的 printfscanf - 对于 unsigned long 它需要是 %ld
  • @Paul:谢谢...我学会了%ld...现在可以完美运行了~~

标签: c long-integer division


【解决方案1】:

你的函数DividerIsPrime,正如目前所写的那样,有一个缺陷,即它必须在逻辑上总是返回True

这样做的原因是每次迭代都会更改状态。即使达到status=False(这个数字是复合的,因为除法器的模数为零),然后迭代将继续,并且在任何情况下,当 divider == 时,最终迭代将达到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. */

显然,“素性测试”有更有效的算法。

【讨论】:

  • 然而,这个缺陷在 int 中应该很明显。想知道为什么张贴者认为 int/long 差异很重要。
  • 我改变了你提到的功能。但其结果重新邮寄失败。
  • 你明白原来的函数为什么不正确吗?为什么?听起来你只是相信我的话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多