精度计算-大数加大数

精度计算                大数加大数

本算法是用来计算一个大数(现有的数据类型无法表示的数)加上一个大数(现有的数据类型无法表示的数)。

算法思路是把作为被加数和加数的大数的每一位都当做一个字符分别放入一个字符数组中,再把加数的各个位与被加数的各个位从最低位依次相加,将结果存放在一个字符指针中,最后再放入一个结果数组中。

下面是我的C语言实现过程

#include<stdio.h>
#include<string.h>
void add(char a[],char b[],char back[]);
main()
{
	char a[65] = "1312312321";
	char b[65] = "123123123123";
	char back[130] = "";
	add(a,b,back);
	printf("%s",back);
}
void add(char a[],char b[],char back[])
{
	int i,j,k,up,x,y,z,l;
	char *c;
	if (strlen(a)>strlen(b))
		l=strlen(a)+2;
	else
		l=strlen(b)+2;
	c=(char *) malloc(l*sizeof(char));
	i=strlen(a)-1;
	j=strlen(b)-1;
	k=0;up=0;
	while(i>=0||j>=0)
	{
		if(i<0)
			x='0';
		else
			x=a[i];
		if(j<0)
			y='0';
		else
			y=b[j];
		z=x-'0'+y-'0';
		if(up)
			z+=1;
		if(z>9)
		{
			up=1;
			z%=10;
		}
		else
			up=0;
		c[k++]=z+'0';
		i--;
		j--;
	}
	if(up)
		c[k++]='1';
	i=0;
	c[k]='\0';
	for(k-=1;k>=0;k--)
		back[i++]=c[k];
	back[i]='\0';
} 
时间: 2024-08-06 20:43:52

精度计算-大数加大数的相关文章

精度计算-大数乘小数

精度计算-大数乘小数 本算法是用来计算一个大数(现有的数据类型无法表示的数)乘以一个小数(10以内的数). 算法思路是把大数的每一位都当做一个字符放入一个字符数组中,再从最后一位开始于要乘的小数相乘并加上前一位的进位,如果有进位存入一个变量中,加到下一位的计算中去. 下面是我的C语言实现过程. int main() { char c[100] = "1231231231231231231231231231231232"; char t[101] ; int m = 10; mult(c

精度计算-大数阶乘

精度计算-大数阶乘 本算法的目的在于计算一个比较大的数的阶乘,由于得到的结果比较大,是现有的数据类型无法存储的,所以我决定将结果存储在一个long a[]数组中. 我们的思路是把每4位数看做数组的一个元素来存储,例如:个.十.百.千存在a[0],万.十万.百万.千万存在a[1]以此类推. 我们用10的阶乘来模拟一下求结果大于4位数阶乘的过程,9的阶乘为362880,而10的阶乘为9的阶乘乘以10,在计算完9的阶乘时a[0] = 2880,a[1]=36,因为362880*10 = (36*10+

精度计算-大数乘大数

精度计算                     大数乘大数 本算法是用来计算一个大数(现有的数据类型无法表示的数)乘以一个大数(现有的数据类型无法表示的数). 算法思路是把大数的每一位都当做一个字符放入一个字符数组中,再把乘数的各个位与被乘数的各个位从最高位依次相乘,将结果存放在一个二维数组res中.例如计算12*12,res[0][0] = 1,res[0][1] = 2,res[1][0] = 2,res[1][1] = 4,那么最终结果的数组s,s[0] = res[0][0]= 1,s

POJ 2756 Autumn is a Genius 使用string的大数加减

本题就是说一个小神童,能计算加减法. 不过题目知识说这个小神童,到底有多神,要我们自己发现. 因为最后给出的数据非常非常巨大,听说接近50k就是超过50000个数位相加,可想而知他多神. 看来题目也是考IQ啊! 如果以为是超级水题,按照一般加减法做,肯定是WA了. 这里给出使用string的加减法运算,因为string是长度可增可减的,所以不管是多少位,只要内存支持,那么本算法都可以支持了.也可以使用vector这些容器.不过string应该更加省点内存. 注意: POJ比较讨厌的就是不支持C+

字符串大数加减运算问题

这里自己利用STL模板中的容器和链表实现字符串大数加减运算. 1 #include<iostream> 2 #include<vector> 3 #include<list> 4 using namespace std; 5 6 list<char> Input_Number(list<char> ilist)//输入链表字符串,以‘#’作为结束符 7 { 8 cout<<"please Input string ,end

大数加减1——将两个数均前后倒置,以对齐最低位

#include <stdio.h> //将读入的数据存储到num[1]~num[x]中,num[0]表示存入数据的长度. void read(int num[]) { int i; char ch; for (i = 0; i<500; i++) num[i] = 0; i = 1; while ((ch = getchar()) != '\n') { num[i] = ch - '0'; i++; num[0]++; } } //将数据num[]中的数翻转,以便计算 void rev

常见的编程问题(一)少大数加减

存储区的概念 常见的存储区域可分为: 栈 由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等. 堆 由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete.如果程序员没有释放掉,程序会一直占用内存,导致内存泄漏,在程序结束后,操作系统会自动回收. 由malloc等分配的内存块,它和堆是十分相似的,不过它是用free来释放分配的内存. 全局/静态存储区 全局变量和静态变量被分配到同一块内存中,在

大数加减乘模板

大数加法: 1 #include <stdio.h> 2 3 #include <string.h> 4 5 #define M 100 //定义了数量M是100作为数组初始化的数量 6 7 8 9 int main() 10 11 { 12 13 int i, j, len_s1, len_s2; // len_s1是字符数组s1的长度, len_s2是字符数组s2的长度, 14 15 char s1[M], s2[M]; 16 17 int num1[M] = {0}; //

多精度计算备忘录之乘法 ------ 复杂度分析

多精度计算里,多精度乘法是其中最重要的运算之一,编写的多精度库(类)的其中一个重要效率标识就是其乘法的速度. 根据曾经写的大数类的记忆,简单记录下其中的一些技巧,以备查询. 一般的算法有如: 多精度乘法,所知的几个主要的优化方法有: 1:直接乘法. 2:comba乘法 3:Karatsuba乘法 4:toom_cook乘法 5:FFT乘法 6:FNT算法,或其他类似的有限域上对应类似的FFT算法 7:自己未曾理解的算法. 8:改进技巧, 1:直接乘法. a   b    c *