C,C++大数相加

#include <stdio.h>
#include <stdlib.h>
#define NUM_LEN 100

int add_str(char * pch1,char * pch2 , char * chResult){
    chResult[NUM_LEN-1]='\0';
    int idx=NUM_LEN-2;

    char *pEnd1=pch1,*pEnd2=pch2;
    for(;*pEnd1!='\0';pEnd1++);
    for(;*pEnd2!='\0';pEnd2++);
    pEnd1--;
    pEnd2--;
    short flag=0;     //是否有进位
    for(;(pEnd1!=pch1-1) || (pEnd2!=pch2-1);){
        short b1=0;
        if(pEnd1!=pch1-1){
            b1= (short)(*pEnd1)-(short)'0'; // '0' -> 0
            pEnd1--;
        }
        short b2=0;
        if(pEnd2!=pch2-1){
            b2= (short)(*pEnd2)-(short)'0'; // '0' -> 0
            pEnd2--;
        }
        short sResult = b1+b2+flag;
        flag=0;
        if(sResult>9){flag=sResult/10;sResult %=10;}
        chResult[idx--] =(char)( sResult+(short)'0');
    }
    if(flag)chResult[idx--]=flag+(short)'0';
    return idx+1;
}

int main()
{
    char ch1[NUM_LEN],ch2[NUM_LEN],chResult[NUM_LEN];
    printf("Num1:");
    scanf("%s",ch1);

    printf("\nNum2:");
    scanf("%s",ch2);

    printf("\nNum1=%s",ch1);
    printf("\nNum2=%s",ch2);

    int idx=add_str(ch1,ch2,chResult);
    printf("\n结果:%s",(char*)chResult+idx);

    return 0;
}

  


GMP:GMP大数库是GNU项目的一部分,诞生于1991年。作为一个任意精度的大整数运算库,它包括了任意精度的带符号整数、有理数、浮点数的各种基本运算操作。它是一个c语言的库,但是官方提供了c++的包装类,主要的应用方向是密码学、网络安全、代数系统、计算科学等。GMP库的运行速度非常快的,它的官方网站上称自己为地球上最快的大数库,但是GMP库所提供的只是数学运算功能,并没有密码学相关的高级功能。

 Miracl:Miracl库是Shamus Software Ltd开发的一个大数库,它的使用许可针对教育科学研究或者非商业目的地应用是免费的。在应用上它是一个c语言的库,同时提供了几个较为简单的c++包装类。在功能上它不但提供了高精度的大整数和分数的各种数学运算操作而且提供了很多密码学算法中的功能模块,如SHA、AES、DSA等中的一些底层操作。最为特别的是它还提供了很多椭圆曲线密码体制中的底层功能模块。由于Miracl库的内部实现采用了很多的汇编层的代码,故运行速度也非常快。

 Crypto++:Crypto++库是一个开源项目,也是免费使用的。由于它是一个纯c++实现的库,所以应用非常的方便,库的结构清晰,使用方便,文档也很健全。Crypto++库提供了很多密码学算法的实现。

?OpenSSL:OpenSSL是一个开放源代码的实现了SSL及相关加密技术的软件包,由加拿大的Eric Yang等发起编写的。它可以实现消息摘要、文件的加密和解密、数字证书、数字签名和随机数字等。 它的主要用途并不是大数库,而是SSL协议的实现和应用,但是其中也有一些关于大整数的功能,此外它也是基于c语言。

原文地址:https://www.cnblogs.com/wucg/p/2271991.html