當前位置:編程學習大全網 - 編程語言 - 用C語言編程:sum=1+2*3+4*5*6+7*8*9*10+…… ***n項,n由鍵盤輸入

用C語言編程:sum=1+2*3+4*5*6+7*8*9*10+…… ***n項,n由鍵盤輸入

這個數很大,就算超大整數,也頂不過n=20,壹般在15左右,還是能存放!

#include <stdio.h>

void main()

{

int i, j, n, k;

__int64 sum = 1, sum1=0;

scanf("%d", &n);

j = 1;

for(i = 1; i <= n; i++ )

{

sum = 1;

for (k=0;k<i; k++,j++)

{

sum *=j;

}

sum1 +=sum;

}

printf("sum1=%I64d\n", sum1);

}

另外寫了兩個大數相乘和相加的函數,這個n可以大到200.

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#define MAX 1000

//字符串逆置,思想:在字符串末尾分別設壹指針

//兩指針指向的值交換

char *ReverseStr(char *str)

{

char *p, *q, ch;

//去字符串長度

int len = strlen(str) - 1;

//當兩指針沒有相遇,指針的值就交換

for (p = str, q = str + len; p < q; p++,q--)

{

ch = *q;

*q = *p;

*p = ch;

}

//返回結果

return str;

}

//相乘

char *BigIntMulti(char *s1, char *s2)

{

int len, m = 0; //m字符串的位數

int len1 = strlen(s1);

int len2 = strlen(s2);

int flag = 0;

//取最大字符串長度

len = len1 > len2 ? len1: len2;

//給和字符串分配空間,長度暫時設成len1*len2

char *sum = (char *) malloc((len1 * len2 + 1) * sizeof(char));

//分配的空間初始化為0

memset(sum, '0', (len1 * len2 + 1) * sizeof(char));

//從字符串末尾進行處理

for(int i = len1 - 1; i >= 0; i--)

{

//m是積字符串的下標

m = len1 - 1 - i;

//對s2字符串也是從末尾進行處理,字符串'9'-'0'就成為整數9,所以按照乘法原則進行運算

for(int j = len2 - 1, temp = 0; j >=0; j--)

{

//temp保存 s1[i]*s2[j]的積和進位之和,sum[m]可能不為'0',因為有進位,在之後的while循環之中設置的

temp = (sum[m] - '0') + (s1[i] - '0') * (s2[j] - '0') + flag;

//對temp的結果取余存入積字符串中

sum[m ++] = temp % 10 + '0';

//是否有進位

flag = temp / 10;

}

//最高壹位可能有進位

while(flag)

{

//這裏把進位加入到積字符串中

sum[m ++] += flag % 10;

//取余

flag /= 10;

}

}

//設置積字符串結束標記

sum[m] = '\0';

//返回結果,以上sum的結果是倒序,所以需要把逆置過來

return ReverseStr(sum);

}

//相加2,用指針處理

char *BigIntPlus(char *s1, char *s2)

{

int len, temp;

int len1 = strlen(s1);

int len2 = strlen(s2);

int flag = 0;

char *sum, *r;

len = len1 > len2 ? len1: len2;

sum = (char *) malloc((len + 2) * sizeof(char));

memset(sum, 0x00, (len + 2) * sizeof(char));

r = sum;

for(char *p = s1 + len1 - 1, *q = s2 + len2 - 1; (p >= s1 || q >= s2); p--, q--, r++)

{

if(p < s1)

temp = (*q - '0') + flag;

else if( q < s2)

temp = (*p - '0') + flag;

else

temp = (*p - '0' + *q - '0') + flag;

//把相加的結果添加到和字符串中

*r = temp % 10 + '0';

//保存相加結果的進位

flag = temp / 10;

}

//處理最後壹位進位

if(flag) *r++ = flag % 10 + '0';

*r = '\0';

return ReverseStr(sum);

}

void main()

{

int i, j, n, k;

char sum[MAX] = {"1"}, sum1[MAX] ={"0"};

char tmp[MAX],tmp1[MAX],tmp2[MAX];

scanf("%d", &n);

j = 1;

for(i = 1; i <= n; i++ )

{

strcpy(sum, "1");

for (k = 0; k < i; k++, j++)

{

itoa(j, tmp, 10);

strcpy(tmp1, BigIntMulti(sum, tmp));

strcpy(sum, tmp1);

}

strcpy(tmp2, BigIntPlus(sum1, sum));

strcpy(sum1, tmp2);

}

printf("sum1=%s\n", sum1);

}

  • 上一篇:說文解字第14課:雲端Cloud
  • 下一篇:學霸們幫幫忙做下題,謝謝啊謝謝啊,初二數學的,不難啊,我不想被老師K死啊,幫幫忙吧,不會很麻煩啊,,,,
  • copyright 2024編程學習大全網