2010-06-27 2 views
0

Я просто пишу процедуру для разложения целого числа без знака на простые числа. он будет работать нормально, если я определяю тип данных как «int», если я изменю его на «long», результат будет неправильным. Я не знаю почему.целочисленный тип 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.

+1

Каков результат? Как это неправильно? – djna

+0

сначала, пожалуйста, правильно отформатируйте свой код, это едва читаемо. , тогда не используйте значения 'char' как значения истинности, в C89 вы всегда должны использовать' int' и никакие фиктивные константы: я еще не видел, чтобы кто-то использовал 255 для true, wow. Но, чтобы прийти к выводу, вы не сказали нам, что и как это не удается. –

+0

Если я ввожу данные = 4, то он выводит4 = 2 * 2 * 3 * 1597 * -21753; Я печатаю data1/divider, его результат - отрицательное число ... но я определил его как «unsigned». –

ответ

1

Ваша функция DividerIsPrime, как написано в настоящее время, имеет дефект, который логически должен всегда возвращать True.

Причина этого в том, что статус изменяется на каждой итерации. Даже если достигнуто status=False (число является составным, потому что модуль вышел на ноль для делителя), то итерации продолжатся и в каждом случае status=True будет достигнуто на последней итерации, когда divider == (данные - 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

Однако этот дефект должен был бы проявиться при использовании ints. Интересно, почему плакат считал, что разница между двумя словами важна. – djna

+0

Я изменил упомянутую вами функцию. но его результирующие результаты не срабатывают. –

+0

Вы понимаете, как оригинальная функция была неправильной и почему? Похоже, вы только моё слово для истины. –

Смежные вопросы