超大数的加法、取模、进制转换

超大数就是long long 也读不出来的数,这时候就要开一个字符数组,将一个个数存储下来。

加法就是用近乎小学那样算加法,一位位进
总体是对应位相加,如果超过10,再用一个数组储存这个1,进位的数组再把数字补到对应求和相加的下一位里面
写法应该可以优化,有相同的步骤写了两遍

include <stdio.h>

include <string.h>

int a_1[56]={0};
int b_1[56]={0};

void correct_1(int a[],int len_1)//将读入的数字反过来成为正常的数
{
	for(int i=0;i<len_1;i++)
	{
		a_1[len_1-i-1]=a[i];
	}
}

void correct_2(int b[],int len_2)
{
	for(int i=0;i<len_2;i++)
	{
		b_1[len_2-i-1]=b[i];
	}
}

int main()
{
	
	char x[56],y[56];
	while((scanf("%s %s",&x,&y))!=EOF)
	{
		int len_1=strlen(x);
		int len_2=strlen(y); 
		
		memset(a_1,0,sizeof(a_1));
		memset(b_1,0,sizeof(b_1));
		
		int a[56]={0},b[56]={0},c[56]={0},d[56]={0};
		
		for(int i=0;i<len_1;i++)
		{
			a[i]=x[i]-'0';	//字符、数字转换				
		} 
		
		for(int i=0;i<len_2;i++)
		{
			b[i]=y[i]-'0';
		}
		
		correct_1(a,len_1);
		correct_2(b,len_2);
		
		 for(int m=0;m<56;m++)
		 {
		 	if(a_1[m]+b_1[m]>=10) 
			{
			 	c[m]=c[m]+a_1[m]+b_1[m]-10; 
				d[m+1]++;
			}
			else c[m]=a_1[m]+b_1[m];
		 }
		 
		 for(int m=0;m<56;m++)
		 {
		 	if(c[m]+d[m]>=10)
		 	{
		 		c[m]=c[m]+d[m]-10;
		 		c[m+1]++;
			}
		 	else c[m]=c[m]+d[m];
		 }
		 
		 //以下是格式输出需要,并非算法
		 for(int j=0;j<len_1;j++)
		 {
		 	printf("%d",a[j]);
		 }
		 printf(" + ");
		 for(int j=0;j<len_2;j++)
		 {
		 	printf("%d",b[j]);
		 }
		 printf(" = ");
		 int n=55;
		 while(c[n]==0)
		 {
		 	n--;
		 }
		 
		 
		 
		 for(n;n>=0;n--)
		 {
		 	printf("%d",c[n]);
		 }
		 printf("\n");
	}
}

给你一个很大的数N,求它对P取模的结果
模拟手算竖式的方法。用x从高到低的每一位加上前一位余数*10来对bi进行%,最后得到的结果就是x%bi的结果。
利用到公式:(a+b) mod (n) = (a mod n) + (b mod n) mod (n);

1 %m = 1
12 % m = ( 1 * 10 + 2 ) % m = ( 1 % m * 10 + 2 ) % m
123 % m = ( 12 * 10 + 3) % m = ( 12 % m * 10 + 3) % m
...
12345678901234567890 % m =(( 1 % m * 10 + 2 ) % m * 10 + 3 ) % m...

include <stdio.h>

include <string.h>

int main()
{
	char a[10001];
	long long b;
	while((scanf("%s",a))!=EOF)
	{
		scanf("%d",&b);	
		int len=strlen(a);
		long long s=0;
		for(int i=0;i<len;i++)
		{
			s=(s*10+a[i]-'0')%b;
		}
		
		printf("%ld\n",s);
		
		
	}
	
	
}

将一个十进制的大数转为二进制
这里还是字符数组的处理,不过计算需要循环,每一位的去算

include<stdio.h>

include<string.h>

int main()
{
    char m[1000];
    int i,a[1000],n[1000];
 
    while((scanf("%s",m))!=EOF)
    {
        int k=strlen(m),j=0;
        while(1)
        {
            n[j++]=(m[k-1]-'0')%2;
            int c=0;
            for(i=0; i<k; i++)
            {
                int s=((m[i]-'0')+10*c)/2;
                c=(m[i]-'0')%2;
                m[i]=s+'0';
            }
            for(i=0; i<k; i++)
                if(m[i]!='0') break;
            if(i==k) break;
        }
        for(i=j-1; i>=0; i--) printf("%d",n[i]);
        printf("\n");
    }
    return 0;
}
posted @ 2021-01-06 23:23  empty_thought  阅读(639)  评论(0)    收藏  举报