我在为这个问题编写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。什么都行不通。
答案 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;
}