【C语言】超大数乘法运算

来源:互联网 发布:山东体彩11选5遗漏数据 编辑:程序博客网 时间:2024/05/02 02:54

昨天做排列组合的时候遇到A(a,b)这个问题,需要计算A(20,20)超大,计算机32位的,最大数只能是2^32,这让我很悲伤!

于是乎就自己研究了如何进行超大数的计算!

/********************************************************************************* *      Copyright:  (C) 2013 Chen ZhenWei<ieczw@qq.com>   *                  All rights reserved. * *       Filename:  bignum.c *    Description:  This file  *                  *        Version:  1.0.0(12/12/2013~) *         Author:  Chen ZhenWei <ieczw@qq.com> *      ChangeLog:  1, Release initial version on "12/12/2013 08:21:23 AM" *                  ********************************************************************************/#include <stdio.h>#include <string.h>int save_num(const char *str,unsigned short *num){   int i=0;   int length = strlen(str);   for(i=0; i<length/2; i++)   {    //   printf("%c == %c\n",str[length-1-i*2],str[length-2-i*2]);       num[i] = (str[length-1-i*2]-'0')+10*(str[length-2-i*2]-'0');    }   if(length%2 != 0)   {       num[i] = str[0] - '0';       return i+1;   }   return i;}void main(){    unsigned short numa[100];        unsigned short numb[100];    unsigned short result[200];    unsigned short carry;    int i=0,j=0,lena,lenb,res_len;    char strnum[64];    char flag;    scanf("%s",strnum);    lena = save_num(strnum,numa);    //scanf("%c",&flag);    scanf("%s",strnum);    lenb = save_num(strnum,numb);    memset(result,0x0,200*2);    for(i=0; i<lena; i++)        for(j=0; j<lenb; j++)        {           carry = numa[j] * numb[i];            result[j+i] += carry%100;            result[j+i+1] += carry/100;        }    res_len = j+i+1;     for(i=0; i<res_len; i++)    {        if(result[i]>=100)        {            result[i+1] += result[i]/100;            result[i] = result[i]%100;        }    }    for(i=res_len; i>0; i--)    {        printf("%02d",result[i-1]);    }    printf("\n");}

设计思路:


操作结果:





2 0
原创粉丝点击