算法之【仿竖式算法】

另类四则运算之大整数加减法:

十进制的数值运算在计算机里都将转换成二进制的数值运算,而二进制的运算就是cpu中最根本的逻辑运算,最后再转化成十进制输出。这次介绍的方法是保留十进制的运算方式(小学生的列竖式计算),仅仅将每位数字转换成二进制。这种算法既在速度上有所提升,又能克服单个数据存储大小的限制。因此可以用来进行大整数的加减法(大整数通常指16位或32位以上整型数)。至于竖式计算的原理就不说了哦,不然有损大家的智商!

 

核心:模拟竖式计算,将大整数的每一位分开来存储与计算。

 

C语言完整程序:

//大整数加法:

#include

#include

char a[100],b[100];

int c[100],d[100];

int main()

{

        
int m,n,i,j;

        
scanf("%s %s",a,b);

        
m=strlen(a);

        
n=strlen(b);

        
for(i=0;i<=m-1;i++)

        
c[i]=a[m-1-i]-'0';

        
for(i=0;i<=n-1;i++)

        
d[i]=b[n-1-i]-'0';

        
for(i=0;i<=99;i++)

        
{

                  
c[i]+=d[i];

                  
if(c[i]>=10)

                  
{

                           
c[i]-=10;

                           
c[i+1]+=1;

                  
}

        
}

        
for(i=99;i>=0;i--)

        
{

                  
if(c[i]!=0)

                  
{j=i;break;}

   
}

   
for(i=j;i>=0;i--)

   
printf("%d",c[i]);

}

//大整数减法:

#include

#include

char a[100],b[100];

int c[100],d[100];

int main()

{

        
int m,n,i,j;

        
scanf("%s %s",a,b);

        
m=strlen(a);

        
n=strlen(b);

        
for(i=0;i<=m-1;i++)

        
c[i]=a[m-1-i]-'0';

        
for(i=0;i<=n-1;i++)

        
d[i]=b[n-1-i]-'0';

        
for(i=0;i<=99;i++)

        
{

                  
c[i]-=d[i];

                  
if(c[i]<0)

                  
{

                           
c[i]+=10;

                           
c[i+1]-=1;

                  
}

        
}

        
for(i=99;i>=0;i--)

        
{

                  
if(c[i]!=0)

                  
{j=i;break;}

   
}

   
for(i=j;i>=0;i--)

   
printf("%d",c[i]);

}

时间: 2024-11-17 10:21:53

算法之【仿竖式算法】的相关文章

SPOJ Transform the Expression 逆波兰式算法题解

把带括号的一般正常的算式,转换成逆波兰式. 输入和输出如下例子: Input: 3 (a+(b*c)) ((a+b)*(z+x)) ((a+t)*((b+(a+c))^(c+d))) Output: abc*+ ab+zx+* at+bac++cd+^* 总结规律是很困难的事情,总结好就能很快解决: 1 字母直接放结果 2  '('入栈 3 ')' 出栈到'(',然后出栈'(' 更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Program

图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用

图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 B(G).其中 T(G)是遍历图时所经过的边的集合,B(G) 是遍历图时未经过的边的集合.显然,G1(V, T) 是图 G 的极小连通子图,即子图G1 是连通图 G 的生成树. 深度优先生成森林   右边的是深度优先生成森林: 连通图的生成树不一定是唯一的,不同的遍历图的方法得到不同的生成树;从不

MD5算法之C#程序 MD5算法描述

程序|算法 当我要写一个MD5算法的程序时,发现中英文的语言描述都有一些不确切的地方,某些个细节讲得不清楚,或者说很费解.最后不得不拿出C语言的源程序来调试,这对于理解算法是很不利的.于是就总结了一下我摸索到的一些要点. 1.来历MD5的全称是message-digest algorithm 5(信息-摘要算法,在90年代初由mit laboratory for computer science和rsa data security inc的ronald l. rivest开发出来,经md2.md

JVM内存管理:GC算法精解(复制算法与标记/整理算法)

本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算法 我们首先一起来看一下复制算法的做法,复制算法将内存划分为两个区间,在任意时间点,所有动态分配的对象都只能分配在其中一个区间(称为活动区间),而另外一个区间(称为空闲区间)则是空闲的. 当有效内存空间耗尽时,JVM将暂停程序运行,开启复制算法GC线程.接下来GC线程会将活动区间内的存活对象,全部复

JavaScript中数据结构与算法(五):经典KMP算法

  这篇文章主要介绍了JavaScript中数据结构与算法(五):经典KMP算法,本文详解了KMP算法的方方面在,需要的朋友可以参考下 KMP算法和BM算法 KMP是前缀匹配和BM后缀匹配的经典算法,看得出来前缀匹配和后缀匹配的区别就仅仅在于比较的顺序不同 前缀匹配是指:模式串和母串的比较从左到右,模式串的移动也是从 左到右 后缀匹配是指:模式串和母串的的比较从右到左,模式串的移动从左到右. 通过上一章显而易见BF算法也是属于前缀的算法,不过就非常霸蛮的逐个匹配的效率自然不用提了O(mn),网上

链表-求助Java算法,这两个算法问题有Java代码实现

问题描述 求助Java算法,这两个算法问题有Java代码实现 从N个元素集合里面随机抽取M个元素(M<N). C/C++: void randomChoose(int*data, intn, int *result, int m); Java: void randomChoose(int data[], int result[]); 说明: 1.Data是待抽取的元素集合,n是data的长度,result是抽取的结果,m是结果集的长度. 2.同一个元素不能被反复抽取. 3.每个元素被抽取到的概率

一步一步写算法(之克鲁斯卡尔算法 下)

原文:一步一步写算法(之克鲁斯卡尔算法 下) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com]     前面在讨论克鲁斯卡尔的算法的时候,我们分析了算法的基本过程.基本数据结构和算法中需要解决的三个问题(排序.判断.合并).今天,我们继续完成剩下部分的内容.合并函数中,我们调用了两个基本函数,find_tree_by_index和delete_mini_tree_from_group,下面给出详细的计算过程. MINI_GENERATE_T

跪求:算法复杂度最低的算法

问题描述 算法题:两个数组,M和N,分别存了任意个整数,从M中取一个数,从N中取一个数,如果相加等于1000,则计数为1,以此类推,求M和N中和为1000的数的个数.(M×N的复杂度的就算了,大家都知道),求算法复杂度最低的算法 解决方案 解决方案二:我对算法的复杂度不太了解,不知道怎么算的.如果先对某个数组排序,算法复杂度是O(N·logN)的话然后再遍历另一个数组,那复杂度是O(N),再用1000减去遍历出来的那个数得到差,再到排序数组中使用二分法找这个数,复杂度为O(logN)我不知道这样

求助一道算法题,关于数组算法

问题描述 求助一道算法题,关于数组算法 有一个字符串数组{"用户1,商品1,200","用户2,商品2,100","用户3,商品1,300","用户4,商品3,50","用户5,商品3,50"},写的方法需要返回的是{"用户2,商品2","用户3,商品1","用户4,商品3"}也就是说比较下每种商品的最高价格是谁,并返回谁买了,如果价格相同取最先买