精度计算-大数乘小数

精度计算-大数乘小数

本算法是用来计算一个大数(现有的数据类型无法表示的数)乘以一个小数(10以内的数)。

算法思路是把大数的每一位都当做一个字符放入一个字符数组中,再从最后一位开始于要乘的小数相乘并加上前一位的进位,如果有进位存入一个变量中,加到下一位的计算中去。

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

int main()
{
	char c[100] = "1231231231231231231231231231231232";
	char t[101] ;
	int m = 10;
	mult(c,t,m);
	printf("%s",t);
	return 0;
}

void mult(char c[],char t[],int m)
{
	int i,l,k,flag,add=0;
	char s[100];
	l=strlen(c);
	/*这个是把原大数数组传人真正进行运算的数组,
	  因为从低位开始运算所以要见原数组进行逆置,
	  因为是字符,所以运算的数要减轻字符‘0’的
	  ASCII码值然后再进行运算。
	*/
	for (i=0;i<l;i++)
		s[l-i-1]=c[i]-'0';
	//这个循环是用来从最小的一位开始于m相乘
	for (i=0;i<l;i++)
	{
		k=s[i]*m+add;
		if (k>=10)
		{
			s[i]=k%10;
			add=k/10;
			flag=1;
		}
		else
		{
			s[i]=k;
			flag=0;
			add=0;
		}
	}
	//flag是用来记录最高位做乘法时有进位的情况
	if (flag)
	{
		l=i+1;
		s[i]=add;
	}
	else
		l=i;
	//这个循环是用来把s数组的内容存到结果数组中
	for(i=0;i<l;i++)
		t[l-1-i]=s[i]+'0';
	t[l]='\0';
}
时间: 2024-08-29 02:03:21

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

精度计算-大数阶乘

精度计算-大数阶乘 本算法的目的在于计算一个比较大的数的阶乘,由于得到的结果比较大,是现有的数据类型无法存储的,所以我决定将结果存储在一个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

精度计算-大数加大数

精度计算                大数加大数 本算法是用来计算一个大数(现有的数据类型无法表示的数)加上一个大数(现有的数据类型无法表示的数). 算法思路是把作为被加数和加数的大数的每一位都当做一个字符分别放入一个字符数组中,再把加数的各个位与被加数的各个位从最低位依次相加,将结果存放在一个字符指针中,最后再放入一个结果数组中. 下面是我的C语言实现过程 #include<stdio.h> #include<string.h> void add(char a[],char b

大数与小数的求和算法

原文首发于我的微信公众号:GeekArtT . 在计算机求和的过程中,一个大数和小数的相加会因为浮点数的有限精度,而导致截断误差的出现.所以在构建计算网格的时候,都要极力避免这样情形的发生,将计算统一在相对较近的数量级上.所以,当需要对一系列的数值做加法时,一个好的技巧是将这些数由大到小做排列,再逐个相加. 而如果一定要做出这样的大数与小数的求和,一个直观想法就是:大数部分和小数部分的高位相加,将剩余的小数部分作为单独的"补全"部分相加.这种直观想法的官方名称叫做Kahan求和法. 假

高精度之大数乘小数

今天下载百度文库资料时发现了 发现了内蒙古电子信息学院的ACM模板. 打开看了一下刚开始就是高精度的计算问题. 于是我就写了写.说实话在我的心里对这些东西有点抵触.因为接触的时候没能很好的掌握所以以后遇到这样的问题总是逃避,虽然逼着自己也能写出来,但是就是不愿意去写. 今天看到一个人的博客让我受益很深.其实不是内容,当然内容也很好.让我感觉到,其实厉害的人不是有多大的成就,会多少别人听都没听过的知识,把一件小事情做好,做的自己满意这就是成功. 闲话不扯了,我们来说一下高精度乘法问题. 大数乘小数

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

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

php的精度计算问题(bcadd和bcsub)

一.前言 我们在进行php开发的时候经常会遇到浮点型的问题,特别是涉及金额的部分,常常需要进行加减运算.当小数点的位数比较多的时候,往往容易犯一些很低级的错误.这里记录一下php的精度计算和封装的小demo. 二.关于php的高精度问题 1.概念解释 这篇文章的解释最清楚: php高精度计算问题 2.高精度数值对比大小问题 下面这篇文章讲的很好: 临时发一个项目遇到的PHP浮点计算问题 默认保留两位小数 bcadd(参数1,参数2,参数3) 参数1 和2 是要相加的参数 3是保留几位小数. 1.

HDU 2424-Gary&#39;s Calculator(表达式计算+大数)

Gary's Calculator Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 950    Accepted Submission(s): 209 Problem Description Gary has finally decided to find a calculator to avoid making simple cal

斯特林公式(计算大数阶乘)

#include <iostream> #include <cstdio> #include <cmath> #define PI 3.1415926535898 #define e 2.718281828459 using namespace std; ///斯特林 ///n!=sqrt(2*PI*n)*pow(n/e,n) int main() { int n;cin>>n; while(n--){ long long m; scanf("%l