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

大数运算总结

发布时间:2020-12-14 02:26:31 所属栏目:大数据 来源:网络整理
导读:大数求和 #include stdio.h#include string.h#define max 3000char a[max],b[max],c[max];int main(){int i,j,k,s,x,y,z;while(~scanf("%s%s",a,b)){i=strlen(a)-1;j=strlen(b)-1;k=s=0;while(i=0||j=0){if(i0)x=0;elsex=a[i]-'0';if(j0)y=0;elsey=b[j]-'0';

大数求和

#include <stdio.h>
#include <string.h>
#define max 3000
char a[max],b[max],c[max];
int main(){
	int i,j,k,s,x,y,z;
	while(~scanf("%s%s",a,b)){
		i=strlen(a)-1;
		j=strlen(b)-1;
		k=s=0;
		while(i>=0||j>=0){
			if(i<0)
				x=0;
			else
				x=a[i]-'0';
			if(j<0)
				y=0;
			else
				y=b[j]-'0';
			z=x+y;
			if(s)
				z++;
			if(z>9){
				s=1;
				z%=10;
			}
			else
				s=0;
			c[k++]=z+'0';
			i--;
			j--;
		}
		if(s)
			c[k++]='1';
		for(i=k-1;i>=0;i--)
			putchar(c[i]);
		printf("n");
	}
	return 0;
}

大数相减

#include <stdio.h>
#include <string.h>
#define max 300
char a[max],d[max];
int c[max];
int main(){
	int i,z,flag;
	while(~scanf("%s%s",b)){
		memset(c,sizeof(c));
		k=flag=0;
		if(strcmp(a,b)==0){
			printf("0n");
			continue;
		}
		if(strcmp(a,b)<0){
			flag=1;
			strcpy(d,a);
			strcpy(a,b);
			strcpy(b,d);
		}
		i=strlen(a)-1;
		j=strlen(b)-1;
		while(i>=0||j>=0){
			if(i<0)
				x=0;
			else
				x=a[i]-'0';
			if(j<0)
				y=0;
			else
				y=b[j]-'0';
			z=x-y;
			c[k++]=z;
			i--;
			j--;
		}
		for(i=0;i<k;i++){
			if(c[i]<0){
				c[i]+=10;
				c[i+1]--;
			}
		}
		if(flag)
			printf("-");
		flag=0;
		for(i=k-1;i>=0;i--){
			if(!flag&&c[i]==0)
				continue;
			flag=1;
			printf("%d",c[i]);
		}
		printf("n");
	}
	return 0;
}

大数相乘

#include <stdio.h>
#include <string.h>
#define max 3000
char a[max],s[max];
int ans[max][max],t[max]={0};
void mul(){
	int i,lena,lenb,k;
	lena=strlen(a);lenb=strlen(b);
	for(i=lena-1;i>=0;i--){
		for(j=lenb-1;j>=0;j--)
			ans[lena-1-i][lenb-1-j]=(a[i]-'0')*(b[j]-'0');
	}
	for(i=0;i<lena+lenb-1;i++){
		if(i>=lenb)
			j=i-lenb+1;
		else
			j=0;
		for(;j<=i&&j<lena;j++)
			t[i]+=ans[j][i-j];
		if(t[i]>=10){
			t[i+1]=t[i]/10;
			t[i]%=10;
		}
	}
	if(t[lena+lenb-1]) 
		k=lena+lenb-1;
	else 
		k=lena+lenb-2;
	for(i=k;i>=0;i--) 
		s[k-i]=t[i]+'0';
	s[k+1]='';
}
int main(){
	while(~scanf("%s%s",b)){
		memset(t,sizeof(t));
		mul();
		puts(s);
	}
	return 0;
}

大数乘小数

#include <stdio.h>
#include <string.h>
char a[3000];
int b[3000];
int main()
{
	int len,add,i,n,flag,k;
	while(~scanf("%s%d",&n))
	{
		len=strlen(a);
		add=flag=0;
		for(i=0;i<len;i++)
			b[len-i-1]=a[i]-'0';
		for(i=0;i<len;i++){
			k=b[i]*n+add;
			if(k>=10){
				b[i]=k%10;
				add=k/10;flag=1;
			}
			else{
				b[i]=k;
				flag=0;
				add=0;
			}
		}
		if(flag){
			len=i+1;
			b[i]=add;
		}
		for(i=len-1;i>=0;i--)
			printf("%d",b[i]);
		printf("n");
	}
	return 0;
}


大数阶乘

?

#include <stdio.h>
#include <string.h>
#define max 3000
int a[max];
int main(){
	int len,c;
	while(~scanf("%d",&n)){
		memset(a,sizeof(a));
		a[0]=1;
		len=1;//表示位数
		for(i=2;i<=n;i++){
			c=0;//表示进位的数值
			for(j=0;j<len;j++){
				s=a[j]*i+c;
				c=s/10;
				a[j]=s%10;
			}
			while(c){
				a[j++]=c%10;
				c/=10;
				len++;
			}
		}
		for(i=len-1;i>=0;i--)
			printf("%d",a[i]);
		printf("n");
	}
	return 0;
}


大数相除(uva10494 If We Were a Child Again)

Sample Input
110 / 100
99 % 10
2147483647 / 2147483647
2147483646 % 2147483647

Sample Output
1
9
2147483646

#include<stdio.h>
#include<string.h>
#define MAXN 1002
int a[MAXN],c[MAXN],last[MAXN]; // a是存储整型的被除数,c是存储得数,last存储的是每次相除后(其实是相减)的余数 
char s[MAXN]; //存储输入的被除数 

int dealb(int (*b)[20],char *d)  // 求出 除数*n 的每个值并存于数组b中(n = 1 2 3 4 ..... 9) 
{
    int len = strlen(d),e,temp,t;
    for(i=0; i<len; ++i)
    for(j=1; j<10; ++j)
    b[j][i+1] = d[len-1-i] - '0';
    b[1][0] = len;

    for(i=2; i<10; i++)       //大数相乘 
    {
        e = 0;
        for(t=1; t<len+1; ++t)
        {
            temp = i*b[i][t] + e;
            b[i][t] = temp%10;
            e = temp/10;
        }
        if(e) b[i][t++] = e;
        b[i][0] = t-1;
    }
    return 0;
}

int cmp(int (*b)[20],int n)   // 从上到下筛选dealb函数得到的数组,返回的值是得数的依次低位数,
{                               //n存储的是余数数组或者说除数依次高位向下的数个数和最高下标 
    int i,t,flag;
    for(k=0; k<n && last[k]==0; ++k);
    for(i=9; i>0; --i)// 两个数比较的三种情况 
    {
        
        if(b[i][0] > n-k+1) continue;  // 位数不相同情况之一,减数较大则继续找下一位 
        if(b[i][0] < n-k+1) return i;  // 位数不相同情况之二,减数较小则返回减数的所在的下标,这个值也是得数的当前最低位数 
        for(j=b[i][0],t=k,flag=0; t<=n && j>0 && b[i][j] == last[t]; ++t,--j) //位数相同的,逐个位权的数进行比较 
            ;
        if(t>n || j<=0 || b[i][j] < last[t]) return i;
    }
    return 0;
}

int main()
{
    int i,len,count = 0,loc,h;
    int  b[12][20]; // b[i]存储的除数*i的值(i=1 2 3...9),每个第一位即b[i][0]存储该值的长度 
    char opt,d[20];
    while(scanf("%s",s) != EOF)
    {
        while((opt = getchar()) == ' ');
        scanf("%s",d);
        dealb(b,d);
        len = strlen(s);
        for(i=0; i<len; ++i) a[i] = s[i] - '0';
        count = loc = h = 0;
        for(i=0; i<len; ++i)
        {
            last[count++] = a[i];
            if((loc = cmp(b,count-1)) != 0)
            {
                for(t=count-1,j=1,e=0; t>=0 && j<=b[loc][0]; --t,++j)// 从cmp得到的信息保证了b[1oc] - last >=0,此处进行相减运算 
                {
                    if((temp = last[t]-b[loc][j] + e) < 0)
                    {
                        e = -1;
                        last[t] = 10 + temp;
                    }
                    else
                    {
                        e = 0;
                        last[t] = temp;
                    }
                }
                if(j>b[loc][0] && t>=0)
                {
                    for(; t>=0; --t)
                    {
                        temp = last[t] + e;
                        if(temp < 0) e = -1,last[t] = 10+temp;
                        else e = 0,last[t] = temp;
                    }
                }
                
            }
            c[h++] = loc;
        }
        if(opt == '/')
        {
            for(i=0; i<h-1 && c[i] == 0; ++i);   // 除去前缀零 
            for(; i<h; ++i) printf("%d",c[i]);
        }

        else 
        {
            for(i=0; i<count-1 && last[i] == 0; ++i);
            for(; i<count; ++i)printf("%d",last[i]);
        }
        printf("n");
    }
    return 0;
}

(编辑:李大同)

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

    推荐文章
      热点阅读