【C语言】超大数乘法运算
昨天做排列组合的时候遇到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"); }
设计思路:
操作结果:
【C语言】超大数乘法运算的更多相关文章
- 使用OC语言编写两个超大数相乘或相加的算法的思路和超大正整数相乘的代码
正文: 在编程中,无论是OC还是C亦或是C++语言,所声明的整数变量都会在内存中占有固定的存储空间,而这些存储空间都是固定的. 比如我们知道的int.long.short.unsigend int.u ...
- C++语言-02-函数
普通函数 C++是在C语言的基础上增加了面向对象特性的语言,是C语言的超集 C++中的普通函数与C语言中的普通函数具有类似的性质.请参照以下博客:C语言-04-函数 与类相关的函数 C是一种OOP语言 ...
- 2004: C语言实验——数日子(数组)
2004: C语言实验——数日子 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 213 Solved: 111[Submit][Status][Web ...
- C语言-04-函数
函数 函数是一组一起执行任务的语句,函数是一个可执行C程序必不可少的条件(至少一个main()函数),函数的定义形式 returnType functionName() { bodyOf of the ...
- 李洪强-C语言5-函数
C语言函数 一.函数 C语言程序是由函数构成的,每个函数负责完成一部分的功能,函数将工恩呢该封装起来,以供程序调用. 二.函数定义 目的:将一些常用的功能封装起来,以供日后调用. 步骤:确定函数名,确 ...
- uva 10692 Huge Mods 超大数取模
vjudge上题目链接:Huge Mods 附上截图: 题意不难理解,因为指数的范围太大,所以我就想是不是需要用求幂大法: AB % C = AB % phi(C) + phi(C) % C ( B ...
- C语言 猜数游戏--产生一个随机数
#include <stdio.h> #include <time.h> #include <stdlib.h> int main(int argc, const ...
- C语言之一数三平方
一数三平方 有这样一个六位数,它本身是一个整数的平方,其高三位和低三位也分别是一个整数的平方,如225625=475*475,225=15*15,625=25*25;统计所有符合该条件的六位数 源代码 ...
- c语言推断数是否是素数
这是推断数是否是素数.网络版非常.我觉得有点问题.今天一个朋友问我这个问题.我知道,今天,我把自己的代码,非常实用哦!. #include<stdio.h> #include<mat ...
随机推荐
- POJ 1947 - Rebuilding Roads 树型DP(泛化背包转移)..
dp[x][y]表示以x为根的子树要变成有y个点..最少需要减去的边树... 最终ans=max(dp[i][P]+t) < i=(1,n) , t = i是否为整棵树的根 > 更新的时 ...
- JS,Jquery - 三元运算符
在javascript中使用三元运算符. 要使用 " [] " ,对运算式进行包裹.
- Mirantis OpenStack HA
Mysql使用Galera做Active/Active集群,同时使用Pacemaker,因为Galera mysql用到了领导机选举机制quorum,所以控制节点至少三个 RabbitMQ使用mirr ...
- javascript时间函数
//时间函数 var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完 ...
- HDU 3925 Substring 【大数相减】
题目意思是,给你提供两个数字 a 和 b a 可以不断的往上加, 直到b 为其子串 问的是 a 最小加几? 显而易见,a 的数据范围给了10 ^100非常大,直接模拟肯定不行 那么就用 b 减去 a ...
- (Problem 7)10001st prime
By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13. ...
- Ural 1079 - Maximum
Consider the sequence of numbers ai, i = 0, 1, 2, …, which satisfies the following requirements: a0 ...
- bmp图片数据提取
仿照别人的程序写的bmp数据提取C代码,并将提取的数据放到txt文档中 /* date : 2014/06/24 designer :pengxiaoen version : dev4.9.9.0 f ...
- 带OpenSSL和MySQL的静态编译版本~
http://www.npcglib.org/~stathis/blog/precompiled-qt4-qt5/ http://www.npcglib.org/~stathis/blog/preco ...
- U+00A0 (Non-breaking space)无法被正确压缩
Code Glyph Decimal HTML Description #U+00A0 Non-breaking space 0096 https://zh.wikipedia.org/wik ...