#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>
#include <ctype.h>
#include <map>
#include <string>
#include <set>
#include <bitset>
#include <utility>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <iostream>
#include <fstream>
#include <list>
using namespace std;
const int MAXL = 500;
struct BigNum
{
int num[MAXL];
int len;
};
//高精度比较 a > b return 1, a == b return 0; a < b return -1;
int Comp(BigNum &a, BigNum &b)
{
int i;
if(a.len != b.len) return (a.len > b.len) ? 1 : -1;
for(i = a.len-1; i >= 0; i--)
if(a.num[i] != b.num[i]) return (a.num[i] > b.num[i]) ? 1 : -1;
return 0;
}
//高精度加法
BigNum Add(BigNum &a, BigNum &b)
{
BigNum c;
int i, len;
len = (a.len > b.len) ? a.len : b.len;
memset(c.num, 0, sizeof(c.num));
for(i = 0; i < len; i++)
{
c.num[i] += (a.num[i]+b.num[i]);
if(c.num[i] >= 10)
{
c.num[i+1]++;
c.num[i] -= 10;
}
}
if(c.num[len])
len++;
c.len = len;
return c;
}
//高精度减法,保证a >= b
BigNum Sub(BigNum &a, BigNum &b)
{
BigNum c;
int i, len;
len = (a.len > b.len) ? a.len : b.len;
memset(c.num, 0, sizeof(c.num));
for(i = 0; i < len; i++)
{
c.num[i] += (a.num[i]-b.num[i]);
if(c.num[i] < 0)
{
c.num[i] += 10;
c.num[i+1]--;
}
}
while(c.num[len] == 0 && len > 1)
len--;
c.len = len;
return c;
}
//高精度乘以低精度,当b很大时可能会发生溢出int范围,具体情况具体分析
//如果b很大可以考虑把b看成高精度
BigNum Mul1(BigNum &a, int &b)
{
BigNum c;
int i, len;
len = a.len;
memset(c.num, 0, sizeof(c.num));
//乘以0,直接返回0
if(b == 0)
{
c.len = 1;
return c;
}
for(i = 0; i < len; i++)
{
c.num[i] += (a.num[i]*b);
if(c.num[i] >= 10)
{
c.num[i+1] = c.num[i]/10;
c.num[i] %= 10;
}
}
while(c.num[len] > 0)
{
c.num[len+1] = c.num[len]/10;
c.num[len++] %= 10;
}
c.len = len;
return c;
}
//高精度乘以高精度,注意要及时进位,否则肯能会引起溢出,但这样会增加算法的复杂度,
//如果确定不会发生溢出, 可以将里面的while改成if
BigNum Mul2(BigNum &a, BigNum &b)
{
int i, j, len = 0;
BigNum c;
memset(c.num, 0, sizeof(c.num));
for(i = 0; i < a.len; i++)
{
for(j = 0; j < b.len; j++)
{
c.num[i+j] += (a.num[i]*b.num[j]);
if(c.num[i+j] >= 10)
{
c.num[i+j+1] += c.num[i+j]/10;
c.num[i+j] %= 10;
}
}
}
len = a.len+b.len-1;
while(c.num[len-1] == 0 && len > 1)
len--;
if(c.num[len])
len++;
c.len = len;
return c;
}
//高精度除以低精度,除的结果为c, 余数为f
void Div1(BigNum &a, int &b, BigNum &c, int &f)
{
int i, len = a.len;
memset(c.num, 0, sizeof(c.num));
f = 0;
for(i = a.len-1; i >= 0; i--)
{
f = f*10+a.num[i];
c.num[i] = f/b;
f %= b;
}
while(len > 1 && c.num[len-1] == 0)
len--;
c.len = len;
}
//高精度*10
void Mul10(BigNum &a)
{
int i, len = a.len;
for(i = len; i >= 1; i--)
a.num[i] = a.num[i-1];
a.num[i] = 0;
len++;
//if a == 0
while(len > 1 && a.num[len-1] == 0)
len--;
}
//高精度除以高精度,除的结果为c,余数为f
void Div2(BigNum &a, BigNum &b, BigNum &c, BigNum &f)
{
int i, len = a.len;
memset(c.num, 0, sizeof(c.num));
memset(f.num, 0, sizeof(f.num));
f.len = 1;
for(i = len-1;i >= 0;i--)
{
Mul10(f);
//余数每次乘10
f.num[0] = a.num[i];
//然后余数加上下一位
///利用减法替换除法
while(Comp(f, b) >= 0)
{
f = Sub(f, b);
c.num[i]++;
}
}
while(len > 1 && c.num[len-1] == 0)
len--;
c.len = len;
}
void print(BigNum &a) //输出大数
{
int i;
for(i = a.len-1; i >= 0; i--)
printf("%d", a.num[i]);
puts("");
}
//将字符串转为大数存在BigNum结构体里面
BigNum ToNum(char *s)
{
int i, j;
BigNum a;
a.len = strlen(s);
for(i = 0, j = a.len-1; s[i] != '\0'; i++, j--)
a.num[i] = s[j]-'0';
return a;
}
void Init(BigNum &a, char *s, int &tag) //将字符串转化为大数
{
int i = 0, j = strlen(s);
if(s[0] == '-')
{
j--;
i++;
tag *= -1;
}
a.len = j;
for(; s[i] != '\0'; i++, j--)
a.num[j-1] = s[i]-'0';
}
int main(void)
{
BigNum a, b;
char s1[100], s2[100];
while(scanf("%s %s", s1, s2) != EOF)
{
int tag = 1;
Init(a, s1, tag); //将字符串转化为大数
Init(b, s2, tag);
a = Mul2(a, b);
if(a.len == 1 && a.num[0] == 0)
{
puts("0");
}
else
{
if(tag < 0) putchar('-');
print(a);
}
}
return 0;
}
分享到:
相关推荐
本篇文章对大数(高精度数)模板进行了详细的分析介绍,需要的朋友参考下
本篇文章是对大数与高精度数的处理进行了详细的分析介绍,需要的朋友参考下
目前支持任意长度的十进制大数高进度算法,可修改为任意进制计算,亲测可用
自己写的高精 加法 乘法 代码 有注释 希望能够帮助你 赚点分 谢谢 多包涵 看不懂的 发消息给我吧
教师频道的功能开通了!!! 1307:【例1.3】高精度乘法 ...求这两个高精度数的积。 【输入】 输入两个高精度正整数M和N。 【输出】 求这两个高精度数的积。 【输入样例】 36 3 【输出样例】 108 【来源】
数组型高精度数详解 By Nettle 2009-3-4 C++&Pascal描述 目录 一、高精度简介 二、高精度数 三、高精度数与整型的运算...四、高精度数与高精度数的运算 五、高精度数的进制转换 六、高精度幂运算 七、压位高精度数
高精度计算1000阶乘,详细输出!#include using namespace std; #include const int N = 100000; int a[N];
高精度模板( 加,减,乘低精高精,除低精高精(有余数),高精阶乘(200000以内) ) (C语言实现)(注释多多)
高精度乘法 个人觉得还不错,是学习的好资料!
高精度的十进制运算,有利于学习PASCAL语言
高精医院手术室展板模板PSD分层模板,高精医院手术室展板模板PSD分层模板.
屏幕取色器是一款简单方便的屏幕取色工具。屏幕取色器可以对屏幕中任意一块的内容拾取颜色,并将颜色转化为各种代码方式,方便复制粘贴至其他地方,用途极广。
(纯算法党别喷我,以后我再写高精算法的文) P1601 → A+B Problem 题目要求 P1601题目链接 AC代码(Java语言描述) import java.util.Scanner; public class Main { public static void main(String[] args) { ...
这个版本的高精度整数库不仅支持高精度除高精度,同时修复了减法计算中的一个严重的bug。并支持高精度类型与其他一切可转换为高精度类型的类型(int,long long,unsignd,string)进行混合运算。同时,全面优化了除法、...
高精化妆品广告海报PSD分层模板,高精化妆品广告海报PSD分层模板,高精化妆品广告海报PSD分层模板。
写高精度运算和矩阵乘法的时候,把常用的都封装在一起,写在一个头文件里方便...高精度数-高精度数(大数-小数) 高精度数/低精度数 常用的这些写在一起用起来比较方便...但是自己太懒了,减法就偷工减料了,(困啊)
C++的高精度模版
算法设计中有关贪心法的几个实用小程序,包括背包问题,带期限的作业排序,高精度数,调度问题。仅供学习之用,欢迎交流!
高精加.cpp 给自己看的模板