大数加减
本文与作者在csdn上的博文【大数加减】保持同步
#include<stdio.h>
#include<math.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
int main(){
char a[1024];
char b[1024];
char tem[1024];
memset(a,'\0',1024);
memset(b,'\0',1024);
memset(tem,'\0',1024);
while(scanf("%s%s",a,b)!=EOF){
int alen=strlen(a);
int blen=strlen(b);
for(int i=0;i<alen;i++){
tem[i]=a[alen-1-i];
}
memset(a,'\0',1024);
strcpy(a,tem);
memset(tem,'\0',1024);
for(int i=0;i<blen;i++){
tem[i]=b[blen-1-i];
}
memset(b,'\0',1024);
strcpy(b,tem);
memset(tem,'\0',1024);
memset(a+alen,'0',1024-alen);
memset(b+blen,'0',1024-blen);
//--------------------------------------------- 加法
int len=alen>blen?alen:blen;
int t=0;
int i;
for(i=0;i<len;i++){
tem[i]='0'+t+(a[i]-'0'+b[i]-'0')%10;
t=(a[i]-'0'+b[i]-'0')/10;
}
if(t)tem[i]='0'+t+(a[i]-'0'+b[i]-'0')%10;
len=strlen(tem);
for(int i=len-1;i>=0;i--){
printf("%c",tem[i]);
}
printf("\n");
//--------------------------------------------------减法
int jw=0;
for(i=0;i<len;i++){
for(i=0;i<len;i++){
if(alen>blen){
if(a[i]<b[i]){
jw=1;
}
tem[i]='0'+(a[i]-t+jw*10-b[i]);
if(jw){
t=1;
jw=0;
}else t=0;
}else{
if(a[i]>b[i]){
jw=1;
}
tem[i]='0'+(b[i]-t+jw*10-a[i]);
if(jw){
t=1;
jw=0;
}else t=0;
}
}
}
len=strlen(tem);
for(int i=len-1;i>=0;i--){
printf("%c",tem[i]);
}
memset(a,'\0',1024);
memset(b,'\0',1024);
memset(tem,'\0',1024);
}
}
猜你喜欢
算法--库函数实现全排列
阅读 294c++的STL中提供了一个库函数next_permutation,代码如下: #include #include #include #include #include #include using namespace std; int main(){ int n,p[10]; ...
算法--生成可重集排列
阅读 297在生成1~n的排列一文中,我们获取排列时用了控制不相等来实现让每个数都不重复地出现,所以如果要生成含有重复元素的全排列,对对生成1~n的排列的程序适当修改即可。 首先,把各个元素改成用户输入,输入数组为p,然后把if(a[k]==j)改为if(a[k]==p[j]),a[cur]=j改成a[cur...
大数乘法(二)
阅读 420乘法运算过程模拟法首先获取输入的乘数(a)与被乘数(b)字符串,按一般乘法运算过程,先是a的最后一位数字与b的最后一位数字相乘,接着a中用于相乘的数下标递减,直到a中所有数字与b最后一位都相乘过,保存结果后再递减b中的用于相乘的数字的下标,循环下去,直到b中每一位数都与a所有数相乘完。 在这个过程...
大数乘法(一)
阅读 374常用的大数相乘算法有模拟加减法和分治法,第一种符合我们的运算习惯,第二种用数学方法提高了效率,(具体描述与实现可参考http://www.cnblogs.com/heyonggang/p/3599857.html)而两种各有优势的方法的程序实现都比较复杂,并且不易于初学者理解,于是我琢磨出了一个将...
生成子集——二进制法
阅读 329用二进制位的0和1表示集合中是否存在该元素要生成0~n的子集,先生成0~n的二进制序列,这些序列的0、1位正好可以对应一个子集中全集在该位置上的元素是否存在,将其作为子集中存在的元素的标记,输出对应元素。#include
算法--生成1~n的排列
阅读 324在暴力求解法中,我们常常要用上枚举一些简单内容以便方便获得解,若要输出整数n的前n个整数的全排列,则按字典序输出为: (1,2,3),(1,3,2),(2,1,3),(2,3,1),(3,1,2),(3,2,1)。 从中我们似乎发现了一些规律:先输出以1开头的排列,再输出以2开头的排列,然后是3;...
动态规划入门之国王的金矿
阅读 396最近学习算法,对动态规划不太了解,使用的时候照搬转移方程式,知其然不知其所以然,今天看到一篇动态规划的教程,解释得非常通俗,原文在这里[动态规划入门教程] (http://blog.csdn.net/woshioosm/article/details/7438834),下面我用自己的记忆和理解...
用大数乘法计算阶乘
阅读 354在比较小的范围内阶乘可以递归实现,而求更大的数的阶乘一般用到long long长整形数,不过,即使这样,在耗时和再大些的阶乘上力有不逮,所以,在输入比较大的情况下,用大数乘法计算阶乘是最好的选择。 计算过程分2步: 1、输入字符串s,将它的值保存到整型n中; 2、从1~i~n-1循环将i转化...