超大数的加法、取模、进制转换
超大数就是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;
}

浙公网安备 33010602011771号