加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

大数运算的基本处理方法

发布时间:2020-12-14 03:56:51 所属栏目:大数据 来源:网络整理
导读:参考:《剑指offer》以及网络相关博客。 对于大数超过我们所有数据类型所能表达的范围时,我们将其称为大数。对此我们的统一处理方法就是将其转换数组来处理,下面我们将通过两个实例展示此类问题的处理方法。 1,大数相乘: 如果两个数据特别大,那么当其相

参考:《剑指offer》以及网络相关博客。

对于大数超过我们所有数据类型所能表达的范围时,我们将其称为大数。对此我们的统一处理方法就是将其转换数组来处理,下面我们将通过两个实例展示此类问题的处理方法。

1,大数相乘:

如果两个数据特别大,那么当其相乘之后数据将会更大,这样我们采用上述的大数处理方法:直接上代码:
/*
1,大数相乘的主要思想是将两个大数以字符串的形式表示
按照字符串的形式相乘;
2,将其存放在数组中;


-----------------------同时回顾一下字符转换成数----------num+= num*10+ a[i] - '0';
Ok let's begin our fun;

  存在问题该算法没有考虑符号问题

*/


#include<stdio.h>
#include <string.h>
#define Max 100

void getdigit(int a[],//用数组来存放字符串转换过来的数
			 char s[]	//存放字符串的数组
			 )
{
	int temp;
	int len = strlen(s);

	for(int i = 0; i < len; i++)
		a[i] = s[i] - '0'; //减去'0'?????不见去得到的是ASSIC码

	//数字反转
	int n1 = 0;
	int n2 = len - 1;
	while(n1 < n2)
	{

		temp = a[n1];
		a[n1] = a[n2];
		a[n2] = temp;
		n2--;
		n1++;
	}


}

void Multi(int a[],int len1,//存放其中一个大数
		   int b[],int len2,//存放另一个大数
		   int c[]	 //存放最终的结果
		   )
{
	for(int i = 0; i < len1; i++)
	{
		for(int j=0; j< len2; j++)
		{
			c[i+j]+= a[i] * b[j];
		//	printf("%d",c[j]);
		}
	//	printf("n");
	}
	
	//下面处理进位问题

	for(i = 0; i< 2*Max; i++)
	{
		c[i+1] += c[i]/10;
		c[i] = c[i] % 10;
	}

}


void main()
{
	char s1[Max];   //第一个字符串
	char s2[Max];	//第二个字符串
	int a1[Max] = {0};    // 转换后的第1个整数!!!!开始时没有注意到初始化导致程序乱码,以后要注意开辟空间后记住:::立即初始化
	int a2[Max] = {0};	// 转换后的第二整数
	int c[3*Max] = {0};	// 相乘后的总和
	printf("输入第一个字符串");
	scanf("%s",s1);
	printf("输入第二个字符串");
	scanf("%s",s2);
	printf("n");
	int len1 = strlen(s1);
	int len2 = strlen(s2);

	
	getdigit(a1,s1);
	getdigit(a2,s2);
	Multi(a1,len1,a2,len2,c);
	int j = 2*Max -1;

	while(c[j] == 0)
		j--;    //找到第一个不是0的数输出注意我们的输出顺序
	while(j >= 0)
	{
		
		printf("%d",c[j--]);
	}
}

2,输出从1到n位的所有数:假如输入3则输出为1 2...... 999的所有数;直接上代码:

// the computation of Big Num

#include<stdio.h>
#include<stdlib.h>
#include<string.h>


//enum bool {false=0,true};   //我的linux下gcc没有bool型想通过enum定义一个可是老是报错


void BigNum(int n)   //大数处理
{

	char *String = (char *)malloc(sizeof(char)*n+1);  开辟能够容纳n位的空间
	memset(String,0+'0',sizeof(char)*n);  //赋值为‘0’,由于‘’ASSIC码就是0所以不能赋值为0
	String[sizeof(char)*n + 1] = '';
	
	while(Compute(String))
	{	
		
		printf("%sn",String);
	}
}

int Compute(char *String)  //每次加一
{
	
	unsigned int len = strlen(String);
	int j=0;
        int n1 = 0;
	int n = 1;
	int Isvalid = 1;  //判断有没有溢出0表示溢出
	int sum;
	for(j=len -1; j>=0; j--)
	{
		sum = String[j] - '0' + n+ n1;
		
		if(10==sum)
			{
				sum = 0;
				n1 = 1;
				if(0==j)
				{
					Isvalid = 0;
					break;
				}	
				String[j] = sum + '0';			
			}
			else
			{
				String[j] = sum + '0';
				break;
			}
			
			
		n = 0;
	}

	return Isvalid;
}

int main()
{
	int n = 10;
	BigNum(n);
	return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读