忙里偷闲,终于完成了无限大整数相加算法的C语言代码,无限大整数相加算法的算法分析在这里

500位的加法运行1000次,不打印结果的情况下耗时0.036秒,打印结果的情况下耗时16.285秒。

下面是源码:

#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#include <time.h> #define MAXNUM 1000000000000000000
/*
存储数据用的结构
long int型指针(Number)指向一个long int 数组,索引值最底的位,
为10进制数的最低18位。依次类推。
int型数值(Length)为数组的长度。
因为数组长度受int型最大值的限制,所以这个算法也不能真正实现“无限”。
*/
struct BigInt{
long long* Number;
int Length;
}; void PrintBigInt(BigInt* bigNumber); long long pow(int x, int y); BigInt* MakeBigIntFromString(char* bigIntString); void DeleteBigInt(BigInt* bigNumber); BigInt* Add2BigInt(BigInt* n1, BigInt* n2); void main(){ char* numberStr = "99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999\0";
char* numberStr2 = "99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999\0";
BigInt* bn = MakeBigIntFromString(numberStr);
BigInt* bn2 = MakeBigIntFromString(numberStr2);
double tstart, tend, tcost;
tstart = clock();
PrintBigInt(bn);
PrintBigInt(bn2);
for (int i = ; i < ; i++){
BigInt* result = Add2BigInt(bn, bn2);
//PrintBigInt(result);
DeleteBigInt(result);
}
DeleteBigInt(bn);
DeleteBigInt(bn2);
tend = clock();
tcost = (double)(tend - tstart) / CLOCKS_PER_SEC;
printf("%lf\n", tcost);
} BigInt* Add2BigInt(BigInt* n1, BigInt* n2){ int maxLength = n1->Length;
if (maxLength < n2->Length){
maxLength = n2->Length;
} /*
加法只可能产生1位的进位,所以,只需要创建一个和最大长度相同的。
*/
BigInt* nOut = (BigInt*)malloc(sizeof(BigInt));
nOut->Length = maxLength;
nOut->Number = (long long*)malloc(sizeof(long long)* nOut->Length);
for (int i = ; i < nOut->Length; i++){
nOut->Number[i] = ;
}
for (int i = ; i < nOut->Length; i++){
if (n1->Length > i){
nOut->Number[i] += n1->Number[i];
}
if (n2->Length > i){
nOut->Number[i] += n2->Number[i];
} /*
处理进位。最高位不需要处理。
*/
if (i != (nOut->Length - )){
if (nOut->Number[i] >= MAXNUM){
nOut->Number[i] -= MAXNUM;
nOut->Number[i + ] = ;
}
}
} return nOut; } /*
从高到低显示数值
不考虑单个long long数据超出18位的情况。
*/
void PrintBigInt(BigInt* bigNumber){
if (bigNumber == NULL){
return;
}
if (bigNumber->Length < ){
return;
}
int length = bigNumber->Length - ;
for (int i = length; i >= ; i--){
if (i != length){
if (bigNumber->Number[i] == ){
printf("");
}
else{
printf("%018lld", bigNumber->Number[i]);
}
}
else{
if ((*bigNumber).Number[i] != ){
printf("%lld", bigNumber->Number[i]);
}
}
}
printf("\n"); } /*
把字符串表示的数值格式化为BigInt型的结构
字符串结束位置用\0表示。
*/
BigInt* MakeBigIntFromString(char* bigIntString){
/*获取字符串长度*/
int cLength = strlen(bigIntString);
BigInt* outBigInt = (BigInt*)malloc(sizeof(BigInt));
if (cLength % != ){
outBigInt->Length = cLength / + ;
}
else{
outBigInt->Length = cLength / ;
}
if (outBigInt->Length == ){
outBigInt->Length == ;
outBigInt->Number = (long long *)malloc(sizeof(long long));
outBigInt->Number[] = ; return outBigInt;
}
outBigInt->Number = (long long *)malloc(sizeof(long long)* outBigInt->Length);
for (int i = ; i < outBigInt->Length; i++){
outBigInt->Number[i] = ;
} int powNum = ;
int numPos = ;
for (int i = cLength - ; i >= ; i--){
powNum = (cLength - - i) % ;
numPos = (cLength - - i) / ;
outBigInt->Number[numPos] += (bigIntString[i] - ) * pow(, powNum);
} return outBigInt;
} /*
简单的幂函数
x y 都必须为正整数
*/
long long pow(int x, int y){
if (x == || x < || y < ){
return ;
}
if (x == || y == ){
return ;
}
long long outNum = x; for (int i = ; i < y; i++){
outNum = outNum * x;
} return outNum;
} void DeleteBigInt(BigInt* bigNumber){
if (bigNumber != NULL){
if (bigNumber->Number != NULL){
free(bigNumber->Number);
}
free(bigNumber);
}
}

无限大整数相加算法的C语言源代码的更多相关文章

  1. 大整数相加 a+b 的c语言实现

    终于来到我所期盼的高精度整数相加的题目了.这个题很经典,也算是一个很好的算法入门题吧. 如果是java的话,系统类库已经内置了BigInteger类,直接调用就可以很轻易地解决了.但是学习c的编写也是 ...

  2. 【算法】C语言趣味程序设计编程百例精解

    C语言趣味程序设计编程百例精解 C/C++语言经典.实用.趣味程序设计编程百例精解(1)  https://wenku.baidu.com/view/b9f683c08bd63186bcebbc3c. ...

  3. 【转载】常见十大经典排序算法及C语言实现【附动图图解】

    原文链接:https://www.cnblogs.com/onepixel/p/7674659.html 注意: 原文中的算法实现都是基于JS,本文全部修改为C实现,并且统一排序接口,另外增加了一些描 ...

  4. 华为"128为大整数相加"机试题

    最近正直春招,偶尔接触到了华为的这道大整数相加的测试题,在网上找了一个算法,然后自己尝试进行了优化,最后也对memmove()函数效率有了进一步把握. #include <time.h># ...

  5. 1164: 零起点学算法71——C语言合法标识符(存在问题)

    1164: 零起点学算法71——C语言合法标识符 Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitted: 10 ...

  6. SOJ 1002/1003/1004 大整数相加/相乘/相除

    三个题目分别考察大整数相加相乘相除运算.如果按照传统算法是取一个长数组,之后进行模拟或者FFT来进行运算.但是相对繁琐. 后来昨天的青岛区域赛网赛1001,用到了JAVA的BigDecimal,于是反 ...

  7. 排序算法总结(C语言版)

    排序算法总结(C语言版) 1.    插入排序 1.1     直接插入排序 1.2     Shell排序 2.    交换排序 2.1     冒泡排序 2.2     快速排序 3.    选择 ...

  8. 魔方阵算法及C语言实现

    1 魔方阵概念 填充的,每一行.每一列.对角线之和均相等的方阵,阶数n = 3,4,5….魔方阵也称为幻方阵. 例如三阶魔方阵为: 魔方阵有什么的规律呢? 魔方阵分为奇幻方和偶幻方.而偶幻方又分为是4 ...

  9. 一个UUID生成算法的C语言实现 --- WIN32版本 .

    一个UUID生成算法的C语言实现——WIN32版本   cheungmine 2007-9-16   根据定义,UUID(Universally Unique IDentifier,也称GUID)在时 ...

随机推荐

  1. Eclipse能否把选中的一段代码向前或向后缩进一个tab的位

    选中代码按TAB /shift + tab

  2. MongoDB介绍及下载与安装

    MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型.M ...

  3. 使用CSS3和jQuery可伸缩的搜索条

    使用CSS3和jQuery可伸缩的搜索条 helloweba.com 作者:月光光 时间:2013-12-09 21:23 标签: CSS3 jquery 搜索条在我们网站是必不可少的,尤其是在有限的 ...

  4. CSS modules 与 React中实践

    最近一直在学习React,看上去蛮简单的内容,其实学习曲线还是比较高的. 目前学到css绑定的问题,看到有一篇好的文章,就转过来了. CSS 模块化的解决方案有很多,但主要有两类.一类是彻底抛弃 CS ...

  5. The Sorrows of Young Werther

    The Sorrows of Young Werther J.W. von Goethe Thomas Carlyle and R.D. Boylan Edited by Nathen Haskell ...

  6. linux系统基础(一)

    Linux简介与安装Unix ;windows; linux; apple(mac) linux=kernel (内核)=OSlinux全是文件============================ ...

  7. Ubuntu字体设置

    Ubuntu所带的字体不是很好看,比较模糊,现修改为微软雅黑 Win7安装分区下的 \windows\fonts\文件夹下,复制msyh.ttf和msyhhd.ttf到/home/m/msfonts文 ...

  8. 详解UML中的聚合,关联,泛化等关系

    1. Overview UML设计类中,类的关系分为Generalization(泛化),Dependency(依赖关系).Association(关联关系).Aggregation(聚合关系).Co ...

  9. jquery美化滚动条插件jscrollpane应用(转)

    原文地址:http://www.jqcool.net/jquery-jscrollpane.html jScrollPane是一个设计非常灵活的跨浏览器的jQuery ,它将浏览器的默认滚动条或是元素 ...

  10. android学习日记05--Activity间的跳转Intent实现

    Activity间的跳转 Android中的Activity就是Android应用与用户的接口,所以了解Activity间的跳转还是必要的.在 Android 中,不同的 Activity 实例可能运 ...