2013-04-30 1 views
0

У меня возникли проблемы с написанием программы на C для этого вопроса. Возможно, я неправильно читаю вопрос и делаю это неправильно. Может ли кто-нибудь помочь мне с этим, пожалуйста? Это они, как я пытаюсь сделать этоНапишите программу для поиска суммы положительных нечетных чисел и произведения положительных четных чисел, не превышающих или равных 30

#include<stdio.h> 
void main(void) 
{ 
    int j, sum=0; 
    long int product=1; 
    for(j=1;j<=30;j=j+2) 
    { 
     sum=sum+j; 
    } 
    for(j=2;j<=30;j=j+2) 
    { 
     product=product*j; 
    } 
    printf("\nThe sum of positive odd numbers is: %d", sum); 
    printf("\nThe product of positive even numbers is: %d", product); 
} 

Выход я получаю:

The sum of positive odd numbers is: 225 
The product of positive even numbers is: -1409286144 

Я получаю часть продукт неправильно. Я пробовал использовать unsigned long int, long long, unsigned long long. Ничего не работает.

+1

Вашего продукт перелив пределы вашего типа хранения. Попробуйте выполнить замену с 'long int' на более крупный тип хранилища. – StarPilot

+1

2 * 4 * 8 ... * 28 дает примерно 30-значное число. Для этого вам очень нужен тип с плавающей точкой. Для чего это стоит: сумма N последовательных нечетных чисел (начиная с 1) дает квадрат N, поэтому вы можете вычислить эту часть немного быстрее и легче. –

+0

Используйте modulo вместо того, чтобы сконденсировать ваш код до 1 цикла. pseudocode- for (j = 1, j <= 30, j ++) Если j% 2 = 0, то product = product * j, else sum = sum + j –

ответ

4

Попробуйте использовать %ld вместо %d в вашем printf:

printf("\nThe product of positive even numbers is: %ld", product);

Поскольку это long int и не int.

Если вы используете long long int, вы хотите, чтобы %lld. Возможно, вам понадобится длинный длинный размер, учитывая, что это очень большой продукт. Я не знаю, является ли ваша платформа long int 32 или 64 бит, но вам обязательно понадобится 64-битное число здесь.

Строка формата long long может варьироваться в зависимости от вашей точной платформы и компилятора, но в большинстве случаев в настоящее время стандартизованно %lld. В частности, старые компиляторы Microsoft иногда использовали %I64d.

+1

большое спасибо! длинный длинный int с% lld работал для меня. –

+0

@StilesCrisis Я боюсь '% ld' в' printf() 'выдает неверный вывод (отрицательное число) как в моем компиляторе Mingw, так и' ideone' http://ideone.com/GRSMLE –

+0

@SheerFish: вы находитесь в 32 бит, и это переполнение, которое вы видите. На 32-битной платформе, чтобы получить правильный результат, вы должны использовать 'long long int'. – StilesCrisis

1

Там нет никаких проблем, насколько сумма всех нечетных чисел, меньших, чем 30 обеспокоен тем, как это только 225 .Но произведение всех четных чисел (или нечетных чисел в этом отношении) менее 30 является огромный номер. Для этого вам нужен тип данных с большей емкостью. В следующей программе я просто использовал double вместо long int для product, и я использовал спецификатор формата %e для отображения продукта в prinf() аккуратным способом, хотя вы можете использовать %f также. Использование

#include<stdio.h> 


int main(void) //Return type of main() is "int",not "void" as you've used 
{ 
    int j, sum=0; 
    double product=1; //Change type of "product" to "double" 

    for(j=1;j<=30;j=j+2) 
    { 
     sum=sum+j; 
    } 
    for(j=2;j<=30;j=j+2) 
    { 
     product=product*j; 
    } 

    printf("The sum of positive odd numbers is: %d\n", sum); 
    printf("The product of positive even numbers is: %e",product); //Use %e 
} 

Выхода The sum of positive odd numbers is: 225

 The product of positive even numbers is: 4.284987e+16 
+0

спасибо за объяснение и ответ. оно работает. –

+0

@RaedShahid Сделал '% ld' в' printf() 'решает вашу проблему в соответствии с предложенным выше плакатом? В ней был найден неправильный результат. http://ideone.com/GRSMLE –

+0

'double' может обеспечить близкое приближение, но вряд ли получится правильный ответ. В зависимости от ваших потребностей этого может быть достаточно. 'long long int 'будет точным, но также начнет сбой, когда результат вырастет> 2^64, а' double' будет продолжать работать только с пониженной точностью. – StilesCrisis

-1

высчитывает Беззнаковый INT (32 бит)

#include <stdio.h> 
#include <stdlib.h> 
#include <assert.h> 

typedef unsigned short UInt16; 
typedef unsigned UInt32; 
typedef struct _unums { 
    size_t size; 
    UInt16 *nums;//array 
} UNums; 

void UNums_init(UNums *num, UInt16 n){ 
    num->nums = malloc(sizeof(UInt16)); 
    num->nums[0] = n; 
    num->size = 1; 
} 

void UNums_mul(UNums *num, UInt16 n){ 
    UInt16 carry = 0; 
    size_t i; 

    for(i=0;i<num->size;++i){ 
     UInt32 wk = n; 
     wk = wk * num->nums[i] + carry; 
     num->nums[i] = wk % 10000; 
     carry = wk/10000; 
    } 
    if(carry){ 
     num->size += 1; 
     num->nums = realloc(num->nums, num->size * sizeof(UInt16)); 
     num->nums[i] = carry; 
    } 
} 

void UNums_print(UNums *num){ 
    size_t i = num->size; 
    int w = 0; 
    do{ 
     --i; 
     printf("%0*hu", w, num->nums[i]); 
     if(!w) w = 4; 
    }while(i!=0); 
} 

void UNum_drop(UNums *num){ 
    free(num->nums); 
    num->nums = NULL; 
} 

int main(void){ 
    UNums n; 
    UInt16 i; 
    assert(sizeof(UInt32) == 4);//32bit 
    assert(sizeof(UInt16) == 2);//16bit 

    UNums_init(&n, 1); 
    for(i=2;i<=30;i+=2) 
     UNums_mul(&n, i); 
    UNums_print(&n);//42849873690624000 
    UNum_drop(&n); 
    return 0; 
} 
+0

причина для downvote Что такое? Пожалуйста, скажите мне, есть ли ошибка в программе. – BLUEPIXY

+0

его не я. но я не понял, что вы здесь сделали, и я довольно новичок в C, как вы можете сказать по вопросу, который я задал: p –

+0

Okey-dokey У вас когда-либо был расчет путем написания умножения? – BLUEPIXY

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