0

我在为这个问题编写 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。没有任何效果。

4

3 回答 3

4

尝试使用%ld而不是%d在你的printf

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

因为它是 along int而不是int.

如果你使用long long int,你会想要%lld。鉴于这是一个非常非常大的产品,您可能需要 long long 尺寸。我不知道您的平台long int是 32 位还是 64 位,但您肯定需要一个 64 位的数字。

long long格式字符串可能会根据您的确切平台和编译器而有所不同,但现在大多数事情已经标准化%lld。特别是,旧的 Microsoft 编译器有时使用%I64d.

于 2013-04-30T23:04:35.683 回答
1

就所有小于 30 的奇数之和而言,没有任何问题,因为它只是225。但是小于 30 的所有偶数(或奇数)的乘积是一个巨大的数字。为此,您需要一个具有更大容量的数据类型。在下面的程序中,我只是简单地使用了fordouble来代替,并且我使用了格式说明符以简洁的方式显示产品,尽管您也可以使用。long intproduct%eprinf()%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
于 2013-05-01T00:15:34.770 回答
-1

计算使用 unsinged int (32bit)

#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;
}
于 2013-05-01T01:14:12.553 回答