大数运算

/大数加法
#include
#include
#include
using namespace std;
int x[100]={0},y[100]={0},z[105]={0};//将数组元素全部初始化为0
int main()
{
char a[100],b[100];//通过字符串对大数进行输入并储存
int len1,len2,len;
while(cin>>a>>b)
{
int i,j=0,k=0;
len1=strlen(a);
len2=strlen(b);
for(i=len1-1;i>=0;i–)//将两个字符串中的字符转化为数字,并倒序储存到数组中,即字符串为123456,则数组为654321
{
x[j]=a[i]-‘0’;
j++;
}
for(i=len2-1;i>=0;i–)
{
y[k]=b[i]-‘0’;
k++;
}
if(len1>len2)
len=len1;
else
len=len2;
i=0;//从最低位(个位)开始进行计算
int m=0;
for(i=0;i<len;i++)
{
z[i]=(x[i]+y[i]+m)%10;//将所得数的个位存到数组z[i]中去
if((x[i]+y[i]+m)>=10)
m=1;
else
m=0;
}
if((x[i-1]+y[i-1]+m)>=10)//判断运算的最大位的和是否>=10
z[i]=1;
else
i=i-1;
for(;i>=0;i–)//到序输出数组
cout<<z[i];
cout<<endl;
}
return 0;
}
/
/大数减法
#include
#include
#include
using namespace std;
int x[100]={0},y[100]={0},z[105]={0};//将数组元素全部初始化为0
void sub(int x[],int y[],int len);
int main()
{
char a[100],b[100];//通过字符串对大数进行输入并储存
int len1,len2;
while(cin>>a>>b)
{
int x[100]={0},y[100]={0},z[105]={0};//将数组元素全部初始化为0
int i,j=0,k=0;
len1=strlen(a);
len2=strlen(b);
for(i=len1-1,j=0;i>=0;i–)//将两个字符串中的字符转化为数字,并倒序储存到数组中,即字符串为123456,则数组为654321
x[j++]=a[i]-‘0’;
for(i=len2-1,k=0;i>=0;i–)
y[k++]=b[i]-‘0’;
if(len1>len2) //若减数长度 > 被减数,正常减
sub(x,y,len1);
else if(len1<len2) //若减数长度 < 被减数,被减数 减 减数
{
cout<<"-";
sub(y,x,len2);
}
else //若减数长度 == 被减数,判断两个数的大小
{
for(i=len1-1;i>=0;i–)//判断每一位两个数的大小
{
if(x[i]==y[i])
continue;
if(x[i]>y[i])//即减数大
{
sub(x,y,len1);
break;
}
if(x[i]<y[i])//即被减数大
{
cout<<"-";
sub(y,x,len1);
break;
}
}
if(i<0) cout<<0<<endl;
}
}
return 0;
}
void sub(int x[],int y[],int len)
{
int i,j;
for(i=0;i<len;i++)
{
if(x[i]>=y[i])//如果x[i]>=y[i],不用向前一位借1,可直接减
z[i]=x[i]-y[i];
else //如果x[i]<y[i],向前一位借1,同时前一位应减1
{
z[i]=x[i]+10-y[i];
x[i+1]=x[i+1]-1;
}
}
for(i=len-1;i>0;i–)//删除前缀0
{
if(z[i]==0)
len–;
else
break;
}
for(i=len-1;i>=0;i–) //倒序输出数组
cout<<z[i];
cout<<endl;
}
/
/大数乘法
#include
#include
#include
using namespace std;
#define MAX 1000
char a[MAX],b[MAX];//用字符串进行数字的输入
int main()
{
int len1,len2,i,j;
while(cin>>a>>b)
{
int x[MAX+10]={0},y[MAX+10]={0},z[MAX
2+10]={0};//积的位数最多是因数位数的两倍
len1=strlen(a);
len2=strlen(b);
for(j=0,i=len1-1;i>=0;i–)//将字符串中字符转化为数字,并倒序储存
x[j++]=a[i]-‘0’;
for(j=0,i=len2-1;i>=0;i–)
y[j++]=b[i]-‘0’;
for(i=0;i<len1;i++)//将因数各个位上的数字与另一个各个位上的数字相乘
{
for(j=0;j<len2;j++)
z[i+j]=z[i+j]+x[i]y[j];//先乘起来,后面统一进行进位
}
for(i=0;i<MAX
2;i++)//进行进位
{
if(z[i]>=10) //若>=10
{
z[i+1]=z[i+1]+z[i]/10; //将十位上数字进位
z[i]=z[i]%10; //将个位上的数字留下
}
}
for(i=MAX2;i>0;i–) //删除0的前缀
{
if(z[i]==0)
continue;
else
break;
}
for(;i>=0;i–) //倒序输出
cout<<z[i];
cout<<endl;
}
return 0;
}
/
/大数除法
#include<stdio.h>
#include<string.h>
char a[100],b[100];//用两个字符串用来输入两个大数
int x[100],y[100],z[100],m[100];//被除数 除数 商 余数
int digit;//大数的位数
void sub(int x[],int y[],int len1,int len2)//大数减法
{
int i;
for(i=0;i<len1;i++)
{
if(x[i]<y[i])
{
x[i]=x[i]+10-y[i];
x[i+1]–;
}
else
x[i]=x[i]-y[i];
}
for(i=len1-1;i>=0;i–)//判断减法结束之后,被除数的位数
{
if(x[i])
{
digit=i+1;
break;
}
}
}
int judge(int x[],int y[],int len1,int len2)
{
int i;
if(len1<len2)
return -1;
if(len1==len2)//若两个数位数相等
{
for(i=len1-1;i>=0;i–)
{
if(x[i]==y[i])//对应位的数相等
continue;
if(x[i]>y[i])//被除数 大于 除数,返回值为1
return 1;
if(x[i]<y[i])//被除数 小于 除数,返回值为-1
return -1;
}
return 0;//被除数 等于 除数,返回值为0
}
}
int main()
{
int i,j=0,k=0,temp;
int len1,len2,len;//len两个大数位数的差值
while(~scanf("%s %s",a,b))
{
len1=strlen(a);//被除数位数
len2=strlen(b);//除数位数
for(i=len1-1,j=0;i>=0;i–)//将字符串中各个元素倒序储存在数组中
x[j++]=a[i]-‘0’;
for(i=len2-1,k=0;i>=0;i–)
y[k++]=b[i]-‘0’;
if(len1<len2)//当被除数位数 小于 除数位数时
{
printf(“商是:0\n”);
printf(“余数是:”);
puts(a);
}
else //当被除数位数 大于或者 除数位数时
{
len=len1-len2;//两个大数位数的差值
for(i=len1-1;i>=0;i–)//将除数后补零,使得两个大数位数相同。被除数:4541543329 除数:98745,加零后:9874500000
{
if(i>=len)
y[i]=y[i-len];
else
y[i]=0;
}
len2=len1;//将两个大数数位相同
digit=len1; //将原被除数位数赋值给digit
for(j=0;j<=len;j++)
{
z[len-j]=0;
while(((temp=judge(x,y,len1,len2))>=0)&&digit>=k)//判断两个数之间的关系以及位数与除数原位数的关系
{
sub(x,y,len1,len2); //大数减法函数
z[len-j]++;//储存商的每一位
len1=digit;//重新修改被除数的长度
if(len1<len2&&y[len2-1]==0)
len2=len1;//将len1长度赋给len2;
}
if(temp<0)//若被除数 小于 除数,除数减小一位。例如:被除数:4541543329 除数:(原)98745,(加零后)9874500000,后退一位后:0987450000
{
for(i=1;i<len2;i++)
y[i-1]=y[i];
y[i-1]=0;
if(len1<len2)
len2–;
}
}
printf(“商是:”);
for(i=len;i>0;i–)//去掉前缀0
{
if(z[i])
break;
}
for(;i>=0;i–)
printf("%d",z[i]);
printf("\n");
printf(“余数是:”);
for(i=len1;i>0;i–)
{
if(x[i])
break;
}
for(;i>=0;i–)
printf("%d",x[i]);
printf("\n");
}
}
return 0;
}
/
/大数阶乘(求位数)
#include<stdio.h>
#include<math.h>
int main()
{
int n;
double sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
sum=sum+log10(i);
}
printf("%d\n",(int)sum+1);
return 0;
}
#include<stdio.h>
#include<math.h>
#define PI 3.141592654
#define E 2.71828182846
int main()
{
int n,sum=1;
scanf("%d",&n);
if(n>3)
sum=log10(2
PIn)/2+nlog10(n/E)+1;
printf("%d\n",sum);
return 0;
}*/
//大数阶乘
#include
using namespace std;
#define m 20000
int a[m+10];
int main()
{
int n;
cin>>n;
a[0]=1;
int dight=1;
int i,j,t;
for(i=2;i<=n;i++)
{
int num=0;
for(j=0;j<dight;j++)
{
t=a[j]*i+num;
a[j]=t%10;
num=t/10;
}
while(num!=0)
{
a[dight]=num%10;
num=num/10;
dight++;
}
}
for(i=dight-1;i>=0;i–)
{
cout<<a[i];
}
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值