亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

大數(高精度數)模板(分享)

2020-01-26 16:08:45
字體:
來源:轉載
供稿:網友
復制代碼 代碼如下:

#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;  
}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一区二粉嫩精品国产一线天| 久久免费国产视频| 日韩av在线播放资源| 97视频在线看| 亚洲va男人天堂| 国产精品视频精品视频| 性夜试看影院91社区| 亚洲一区二区中文字幕| 久久久久久国产精品久久| 亚洲视频在线观看免费| 亚洲国产欧美在线成人app| 不卡av在线播放| 国产精品日日做人人爱| 国产精品三级久久久久久电影| 日韩一区二区三区xxxx| 欧美丰满老妇厨房牲生活| 另类专区欧美制服同性| 久久久精品久久久久| 亚洲视频777| 91精品国产高清久久久久久91| 91精品国产高清久久久久久| 久久精品国产久精国产一老狼| 91禁国产网站| 大荫蒂欧美视频另类xxxx| 国产精品一二区| 91精品国产91久久久| 一区二区在线视频播放| 久久久999国产精品| 91久久精品一区| 久久99国产精品久久久久久久久| 亚洲网站在线观看| 免费不卡欧美自拍视频| 国产精品揄拍500视频| 国产精品久久久久久久久久久新郎| 亚洲最新av在线网站| 黄色一区二区在线| 中文字幕av一区二区三区谷原希美| 国产欧美一区二区三区在线看| 日韩福利伦理影院免费| 91豆花精品一区| 欧美极品美女视频网站在线观看免费| 日韩免费看的电影电视剧大全| 亚洲性生活视频在线观看| 欧美www视频在线观看| 亚洲黄色有码视频| 91久久精品国产91久久性色| 国产亚洲美女久久| 亚洲欧美日韩爽爽影院| 一个人www欧美| 国产精品日韩在线观看| 亚洲精品视频免费在线观看| 国产精品免费观看在线| 国产色婷婷国产综合在线理论片a| 最近2019年好看中文字幕视频| 揄拍成人国产精品视频| 欧洲成人午夜免费大片| 日韩av成人在线| 91禁国产网站| 亚洲va欧美va国产综合久久| 亚洲欧美激情四射在线日| 亚洲激情中文字幕| 亚洲成**性毛茸茸| 久久99热精品| 亚洲欧洲中文天堂| 欧美成人精品在线播放| 欧美激情在线视频二区| 日本欧美在线视频| 色综合亚洲精品激情狠狠| 91亚洲精品视频| 国产精品精品一区二区三区午夜版| 成人免费观看49www在线观看| 久久久精品在线观看| 日本不卡免费高清视频| 久久精品一偷一偷国产| 亚洲性视频网站| 成人av在线天堂| 久久久久国产精品一区| 欧洲s码亚洲m码精品一区| 久久精品国产91精品亚洲| 精品亚洲一区二区三区在线观看| 亚洲精选在线观看| 精品在线小视频| 亚洲国产精品人久久电影| 亚洲精品91美女久久久久久久| 91久久精品美女高潮| 久久亚洲国产精品成人av秋霞| 久久精品最新地址| 黑人极品videos精品欧美裸| 久久亚洲私人国产精品va| 国产精品久久久久久久9999| 久久久成人的性感天堂| 国产91在线视频| 欧美激情成人在线视频| 蜜臀久久99精品久久久无需会员| 欧美午夜电影在线| 亚洲综合自拍一区| 国产精品对白刺激| 精品久久久久久久大神国产| 久久免费精品视频| 欧美另类极品videosbest最新版本| 亚洲精品一二区| 日韩中文字幕在线观看| 成人免费高清完整版在线观看| 欧美黄色www| 国产午夜一区二区| 午夜精品在线观看| 中文字幕在线看视频国产欧美| 91精品国产网站| 国产91精品久久久久久久| 在线国产精品视频| 国产午夜精品全部视频在线播放| 欧美另类第一页| 久久91精品国产91久久久| 亚洲视频免费一区| 欧美精品亚州精品| www.日韩av.com| 国产午夜精品美女视频明星a级| 欧美日韩亚洲高清| 亚洲第一精品夜夜躁人人躁| 亚洲图片制服诱惑| 亚洲图片制服诱惑| 日韩欧美高清视频| 久久国产天堂福利天堂| 北条麻妃一区二区在线观看| 久久久精品2019中文字幕神马| 日韩欧美中文字幕在线播放| 日韩免费高清在线观看| 久久综合五月天| 26uuu国产精品视频| 日韩有码在线电影| 91久久嫩草影院一区二区| 日韩电影在线观看永久视频免费网站| 亚洲精美色品网站| 国产精品亚洲综合天堂夜夜| 日韩精品在线免费播放| 91免费综合在线| 538国产精品视频一区二区| 蜜臀久久99精品久久久无需会员| 日韩av综合网| 久久久久五月天| 亚洲精品在线91| 57pao成人永久免费视频| 日韩国产欧美精品一区二区三区| 国产精品久久久久久久9999| 亚洲香蕉成视频在线观看| 91在线免费看网站| 一区二区三区在线播放欧美| 伊人久久久久久久久久| 91精品视频一区| 欧美猛交免费看| 日韩成人网免费视频| 亚洲精品视频久久| 在线国产精品播放| 在线电影中文日韩| 日韩精品一区二区视频| 欧美高清第一页| 欧美最顶级丰满的aⅴ艳星| 国产精品久久国产精品99gif| 日韩av中文字幕在线播放| 久久久久久一区二区三区| 欧美日韩不卡合集视频| 亚洲成人三级在线| 久久九九免费视频| 国产精品成人一区二区|