1.大整数的加法:
#include <stdio.h>
const int N=4;
static int carry=0;
void add(int *a, int *b, int *c)
{
/********* Begin *********/
for(int i=3;i>=0;i--){
c[i]=carry;
int num=a[i]+b[i];
if(num>=10000){
carry=1;
c[i]+=num-10000;
}else{
carry=0;
c[i]+=num;
}
}
/********* end *********/
}
void print(int *c,int k)
{int i;
for (i=0;i<k;i++)
printf("%04d",c[i]);
printf("\n");
}
int main()
{//1234034523670098+213654305769786
int i,d=123,a[N]={1234,345,2367,98},b[N]={213,6543,576,9786},c[N];
for (i=0;i<N;i++)
{c[i]=0;}
add(a,b,c);
if (carry==1)
printf("%d",carry);
print(c,N);
}
2.大整数的减法:
#include <stdio.h>
const int N=4;
int borrow=0;
void sub(int *a, int *b, int *c)
{
/********* Begin *********/
for(int i=3;i>=0;i--){
c[i]-=borrow;
int num=a[i]-b[i];
if(num<0){
num+=10000;
c[i]+=num;
borrow=1;
}else{
c[i]+=num;
borrow=0;
}
}
/********* end *********/
}
void print(int *c,int k)
{int i;
for (i=0;i<k;i++)
printf("%04d",c[i]);
printf("\n");
}
int main()
{int i,a[N]={1234,5678,3344,5566},b[N]={4321,8765,8899,7766},c[N];
for (i=0;i<N;i++)
{c[i]=0;}
sub(a,b,c);
if (borrow==0)
print(c,N);
else
{borrow=0;
for (i=0;i<N;i++)
{c[i]=0;}
sub(b,a,c);printf("-");print(c,N);
}
}
3.大整数的乘法:
#include <stdio.h>
const int N=4;
static int carry=0;
void mul(int *a, int b, int *c)
{
/********* Begin *********/
for(int i=3;i>=0;i--){
c[i]+=carry;
int num=a[i]*b;
if(num>10000){
carry=num/10000;
c[i]+=num%10000;
}else{
carry=0;
c[i]+=num;
}
}
/********* end *********/
}
void print(int *c,int k)
{
int i;
for (i=0;i<k;i++)
printf("%04d",c[i]);
printf("\n");
}
int main()
{
int i,d=123,a[N]={1234,5678,3344,5566},c[N];
for (i=0;i<N;i++)
{c[i]=0;}
mul(a,d,c);
if (carry!=0) printf("%d",carry);
print(c,N);
}
4.大整数的除法:
#include <stdio.h>
const int N=4;
int remain=0;
void div(int *a, int b, int *c)
{
/********* Begin *********/
for(int i=0;i<=3;i++){
int num1=a[i]+remain*10000;
int num=num1/b;
remain=num1%b;
c[i]=num;
}
/********* end *********/
}
void print(int *c,int k)
{
int i,j,t;
printf("%d",c[0]);
for (i=1;i<k;i++){
printf("%04d",c[i]);
}
printf("\n");
}
int main()
{
int i,d=123,a[N]={1234,5678,3344,5566},c[N];
for (i=0;i<N;i++)
{c[i]=0;}
div(a,d,c);
print(c,N);
}
5.大整数-求n!:
#include<stdio.h>
#include<math.h>
int main()
{ int g,j,k,m,n,p,t,a[40000];double s;
scanf("%d",&n);
s=0;
/********* Begin *********/
for(k=1;k<=m;k++){
a[k]=0;
}
a[1]=1;g=0;
for(k=2;k<=n;k++){
s+=log10(k);
}
m=(int)s+1;
for(int k=2;k<=n;k++){
for(int j=1;j<=m;j++){
t=a[j]*k+g;
a[j]=t%10;
g=t/10;
}
}
/********* end *********/
p=0;
for(j=m;j>=1;j--)
if(a[j]==0) p++;
int p2;
p2=0;
for(j=1;j<=m;j++)
{
if(a[j]==0) p2++;
else break;
}
printf(" %d!=",n);
for(j=m;j>=1;j--){
printf("%d",a[j]);
}
printf("\n");
printf("p=%d\n",p);
printf("p2=%d\n",p2);
}
6.大整数与大整数相乘:
#include <stdio.h>
const int N=10;
const int K = 10000;
int a[N]={0,0,0,0,0,99,8877,6655,4433,2211},b[N]={0,0,0,0,0,11,2233,4455,6677,8899},c[N]={0,0,0,0,0,0,0,0,0,0};
int carry=0;
void print(int *c);
void mul2(int *a, int *b, int *c)
{
/********* Begin *********/
for(int i=9;i>=0;i--){
int s=0;
for(int j=9;j>=0;j--){
if(a[j]==0 || b[i]==0)continue;
else{
int num=a[j]*b[i];
if(num>10000){
carry=num/10000;
c[i-s]+=num%10000;
}else{
carry=0;
c[i-s]+=num;
}
if(c[i-s]>10000){
c[i-s-1]+=1;
c[i-s]=c[i-s]%10000;
}
c[i-s-1]+=carry;
s++;
}
}
}
/********* end *********/
}
void print(int *c)
{int i=0,j;
while (c[i]==0) i++;
for (j=i;j<N;j++)
printf("%04d",c[j]);
printf("\n");
}
int main()
{
mul2(a,b,c);
print(c);
}