两个超大数的和

#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string>
#include <iostream>
using namespace std;

#define MAX 100

char* add_func(char *a,char*b)
{
int num1 = strlen(a);
int num2 = strlen(b);
if (num1<num2)
{
int temp = num1;
num1 = num2;
num2 = temp;

char *p = a;
a = b;
b = p;
}

int c = 0;
int num3 = num1;
char* r=(char*)malloc(MAX + 1);
memset(r,0,strlen(r));
int i = 0;
for (i = 0; i<num1; i++)
{
if (i<num2)
{
int d = a[num1 - 1 - i] - ‘0‘ + b[num2 - 1 - i] - ‘0‘ + c;
if (d >= 10)
{
c = 1;
r[i] = char((d - 10) + ‘0‘);
}
else
{
c = 0;
r[i] = char(d + ‘0‘);
}
}
else
{
int d = a[num1 - i - 1] - ‘0‘ + c;
if (d >= 10)
{
if (i == num1 - 1)
{
num3 += 1;
r[i + 1] = ‘1‘;
}
c = 1;
r[i] = char(‘0‘ + (d - 10));
}
else
{
c = 0;
r[i] = char(‘0‘ + d);
}
}
}
r[i + 2] = ‘\0‘;
return r;
}
int main()
{
char *a = (char*)malloc(MAX);
char *b = (char*)malloc(MAX);
cin >> a >> b;
char *sum = add_func(a,b);

int i = 0;
int len = strlen(sum);
for (i = 0; i<len; i++)
{
printf("%c", sum[len - i - 1]);
}
printf("\n");
return 0;
}

时间: 2024-08-04 16:22:08

两个超大数的和的相关文章

两个超大数相加

解决超大数相加的问题的一种思路是把整形转化成字符串,废话不多说直接上代码,已经调试通过. #include<iostream> #include<string> #include<cmath> using namespace std; string add(string str1, string str2) { int i; string str; int len_str1 = str1.length(); int len_str2 = str2.length(); i

使用OC语言编写两个超大数相乘或相加的算法的思路和超大正整数相乘的代码

正文: 在编程中,无论是OC还是C亦或是C++语言,所声明的整数变量都会在内存中占有固定的存储空间,而这些存储空间都是固定的. 比如我们知道的int.long.short.unsigend int.unsigend long.unsigend long long等等,都有固定的存储空间,而哪怕是64位系统下的变量unsigend long long,能存储的最大范围只有1844674407370955161. 下边复习一下基础类型的存储范围以及所占字节: 编程语言的基础类型速查表 char -1

两个超大数相乘

需要注意的都在代码注释里,自己看吧,欢迎讨论.另外,此代码调试通过 #include<iostream> #include<string> #include<cmath> using namespace std; //模拟手工加法 string add(string str1, string str2) { int i; string str; int len_str1 = str1.length(); int len_str2 = str2.length(); int

实现2个超大数的加法运算

一道笔试题~实现2个超大数据的加法运算,这2个超大数,意思就是long也装不下的数,就顶大概100位吧. 这道题其实看上去很简单,但是实际上涉及到的知识点还是很多的,非常考验一个人的程序设计能力和对API的熟悉程度. 思路很简单,这么大的数,long都存不下,那只能存在String中了,然后将每个数字取出,放到数组,由最末位开始计算,算加法,判断是否进位,进位则前位+1,若超过长度,则copy到新的数组. 下面上代码: public class BigInt { private int[] di

求一个int型整数的两种递减数之和(java)--2015华为机试题

题目描述: 给出一个整数(负数使用其绝对值),输出这个整数中的两种递减数(1.最大递减数:2.递减数中各位数之和最大的数)之和. 递减数:一个数字的递减数是指相邻的数位从大到小排列的数字,不包含相邻的数位大小相同的情况. 最大递减数:所输入整数的所有递减数中值最大的一个. 如: 75345323,递减数有:75,753,53,53,532,32.那么最大的递减数为753. 各位数字之和最大的递减数: 如75345323中的各递减数:75各位数之和=12(7+5=12),753各位数之和=15(7

查看两个int数的二进制有几位不同

题目:查看两个int(32位)数的二进制有几位不同. 分析:要理解该题目的意思,就要明白C语言中关于位的一些操作符. 1)"&",按位与操作符,从低位到高位对两个数的每位进行与操作,如1001&1101=1001,都为1则取1: 2)"|",按位或操作符,有一个是1就取1: 3)"^",异或,不同则取1: 4)"~",非操作符,用来对一个二进制数按位取反: 5)"<<",左移操作

(题目)超大数取模

问题描述:假如有一个很大的数,大到10^1000,那么求这个值对17取模的值! 1 #include <stdio.h> 2 int main() 3 { 4 char num[1001];//char数组存储 5 int i,ans=0; 6 gets(num); 7 for (i=0;num[i]!='\0';++i)//关键循环 8 ans=( ans*10+(num[i]-'0') )%17;//模拟的出原意中的数值,每次提前模17是可行的 9 printf("ans=%d\

两类Stirling数

转:http://blog.csdn.net/acdreamers/article/details/8521134 第一类Stirling数 s(p,k)    s(p,k)的一个的组合学解释是:将p个物体排成k个非空循环排列的方法数. s(p,k)的递推公式: s(p,k)=(p-1)*s(p-1,k)+s(p-1,k-1) ,1<=k<=p-1 边界条件:s(p,0)=0 ,p>=1  s(p,p)=1  ,p>=0   递推关系的说明: 考虑第p个物品,p可以单独构成一个非空

算法练习:两指针之三数之和为0

问题描述 给出一个整型数组,找出所有三个元素的组合,其组合之和等于0.要求在结果集里不含有重复的组合. 举例: 输入{-2, 1, -1, 2, 1} 输出{-2, 1, 1 } 问题分析 最容易想到的是穷举法,挑选第一个元素,然后在其后挑选第二个元素,再从除已经挑选出的两个元素之外挑第三个元素,判断三者之和是否为0:第二种想到的是用回溯递归,这两种方法的时间复杂度均为O(n^3),可参阅代码部分关于这两种方法的实现. 那有没有复杂度低一些的呢,答案是有的,就是使用两指针的方法,从而使复杂度下降