编写程序以查找正奇数的总和以及小于或等于30的正偶数的乘积

时间:2013-04-30 23:01:50

标签: c types int

我在为这个问题编写C程序时遇到了一些问题。也许我正在读错的问题并以错误的方式做错。有人可以帮我吗?这是我试图做的方式

#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。什么都行不通。

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分:-1)

计算使用unsigned 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;
}