【c语言】大整数计算

大整数加法

#include <stdio.h>
#include <string.h>
char a1[2000],b1[2000];
int a[205],b[205],c[205],la,lb,lc,x,i;
int main(){
	la=strlen(gets(a1));
	lb=strlen(gets(b1));
	for(i=0;i<=la-1;i++) a[la-i]=a1[i]-'0';	//倒序存储 
	for(i=0;i<=lb-1;i++) b[lb-i]=b1[i]-'0';
	lc=1;
	while(lc<=la||lc<=lb){				//进行加法进位 
		c[lc]=a[lc]+b[lc]+x;		//对应第i位相加并加上上一次的进位 
		x=c[lc]/10;				//向高位进位 
		c[lc]%=10;			//存储第i位的值 
		lc++;			//位置下标变量 
	}
	c[lc]=x;
	if(c[lc]==0) lc--;	//相加结果数组最高位有前导零 
	for(i=lc;i>=1;i--) printf("%d",c[i]);		//倒序输出 
	return 0;
}

大整数减法

#include <stdio.h>
#include <string.h>
char a1[205],b1[205],a[205],b[205],c[205],t[205];
int la,lb,lc,x,i;
int main(){
	la=strlen(gets(a1));				//输入被减数 
	lb=strlen(gets(b1));				//输入减数
	if(la<lb||la==lb&&strcmp(a1,b1)<0){
		strcpy(t,a1),strcpy(a1,b1),strcpy(b1,t);
		printf("-");
	}
	for(i=0;i<la;i++) a[la-i]=a1[i]-'0';
	for(i=0;i<lb;i++) b[la-i]=b1[i]-'0';
	i=1;
	while(i<=la||i<=lb){
		if(a[i]<b[i]){					//不够减向高位借一当十 
			a[i]+=10;
			a[i+1]--;
		}
		c[i]=a[i]-b[i];					//对应位相减 
		i++;
	}
	lc=i;
	while((c[lc]==0)&&(lc>1)) lc--;		//最高位的零0不输出 
	for(i=lc;i>=1;i--) printf("%d",c[i]);
	return 0;
}

高精度乘法

#include <stdio.h>
#include <string.h>
char a1[101],b1[101],a[101],b[101],c[10000];
int la,lb,lc,x,i,j;
int main(){
	la=strlen(gets(a1));				//输入乘数
	lb=strlen(gets(b1));				//输入被乘数
	for(i=0;i<=la-1;i++) a[la-i]=a1[i]-'0';	//倒序存储
	for(i=0;i<=lb-1;i++) b[lb-i]=b1[i]-'0';
	for(i=1;i<=la;i++){
		x=0;							//用于存放进位
		for(j=1;j<=lb;j++){				//对乘数的每一位进行处理
			c[i+j-1]=a[i]*b[j]+x+c[i+j-1];	//当前乘积+上次乘积进位+原数
			x=c[i+j-1]/10;				//计算进位 
			c[i+j-1]%=10;				// 
		}
		c[i+lb]=x;						//进位
	}
	lc=la+lb;							//确定最终结果总长度 
	while((c[lc]==0)&&(lc>1)) lc--;		//最高位的零0不输出
	for(i=lc; i>=1; i--) printf("%d",c[i]);
	return 0;
}

高精除以低精

#include <stdio.h>
#include <string.h>
char a1[301];
int a[301],c[301];
int la,lc,x,i,b;
int main(){
	la=strlen(gets(a1));
	scanf("%d",&b);
	for(i=0;i<=la-1;i++) a[i+1]=a1[i]-'0';
	for(i=1;i<=la;i++){
		c[i]=(x*10+a[i])/b;
		x=(x*10+a[i])%b;
	} 
	lc=1;
	while((c[lc]==0)&&lc<la) lc++;
	for(i=lc;i<=la;i++) printf("%d",c[i]);
	return 0;
}

高精除以高精

#include <stdio.h>
#include <string.h>
int a[501],b[501],c[501],d,i,s;
int in(int a[]){		//输入 
	char s[501];
	gets(s);			//读入字符串
	a[0]=strlen(s);		//用a[0] 计算字符串s的位数 
	for(i=1;i<=a[0];i++) a[i]=s[a[0]-i]-'0';	//将数串s转换成数组a,并倒序存储
}
int put(int a[]){		//打印输出
	int i;
	if(a[0]==0){		//字符长度为0,输出0
		putf("0\n");
		return 0;
	}
	for(i=a[0];i>0;i--) putf("%d",a[i]);		//倒序输出
	putf("\n");
	return 0;
}
int cmp(int a[],int b[]){		//比较ab的大小关系,如果a大于b为1,a等于b为0,a小于b为-1
	int i;
	if(a[0]>b[0]) return 1;		//长度不相等,则两数组肯定不相等 
	if(a[0]<b[0]) return -1;
	for(i=a[0];i>0;i--){		//从高位到低位进行比较
		if(a[i]>b[i]) return 1;
		if(a[i]<b[i]) return -1;
	}
	return 0;
}
int jian(int a[],int b[]){		//计算a=a-b 
	int flag,i;
	flag=cmp(a,b);			//调用比较函数判断大小
	if(flag==0){			//除数等于被除数,余数肯定为零 
		a[0]=0;return 0;
	}
	if(flag==1){			//大于 
		for(i=1;i<=a[0];i++){
			if(a[i]<b[i]){
				a[i+1]--;a[i]+=10;	//不够减则向上借一位
			}
			a[i]-=b[i];
		}
		while(a[0]>0&&a[a[0]]==0) a[0]--;	//修正a的位数
		return 0;
	}
}
void cpy(int p[],int q[],int t){//复制p数组到q数组从t开始的地方
	int i;
	for(i=1;i<=p[0];i++) q[i+t-1]=p[i];
	q[0]=p[0]+t-1;
}
int f(int a[],int b[],int c[]){
	int i,t[501];
	c[0]=a[0]-b[0]+1;
	for(i=c[0];i>0;i--){
		memset(t,0,sizeof(t));
		cpy(b,t,i);
		while(cmp(a,t)>=0){
			c[i]++;jian(a,t);
		}
	}
	while(c[0]>0&&c[c[0]]==0) c[0]--;
	return 0;
}
int main(){
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	memset(c,0,sizeof(c));
	in(a);in(b);				//输入被除数a与除数b 
	f(a,b,c);
	put(c);						//输出结果 
	put(a);						//输出余数 
	return 0;
}

回文数

#include <stdio.h>
#include <string.h>
int a[101],b[101],n,i,ans;
int in(int a[]){
	char t[101];
	memset(a,0,sizeof(a));
	scanf("%d",&n);
	a[0]=strlen(gets(t));
	for(i=1;i<=a[0];i++){
		if(t[a[0]-i]>='0'&&t[a[0]-i]<='9') a[i]=t[a[0]-i]-'0';
		else a[i]=t[a[0]-i]-'A'+10;
	}
} 
int det(int a[]){
	for(i=1;i<=a[0];i++)
		if(a[i]!=a[a[0]-i+1]) return 0;
	return 1;
}
int jia(int a[]){
	int i,k;
	for(i=1;i<=a[0];i++) b[i]=a[a[0]-i+1];
	for(i=1;i<=a[0];i++) a[i]+=b[i];
	for(i=1;i<=a[0];i++){
		a[i+1]+=a[i]/n;
		a[i]%=n;
	}
	if(a[a[0]+1]>0) a[0]++;
}
int main(){
	in(a);
	if(det(a)){
		printf("0\n");return 0;
	}
	ans=0;
	while(ans<=30){
		ans++;
		jia(a);
		if(det(a)){printf("%d\n",ans);return 0;}
	}
	printf("Impossible");
	return 0;
}

大整数的因子

#include <stdio.h>
#include <string.h>
int det(int d[],int k,int len){
	int ans=0,mod=0,i=0;
	while(i<len){
		mod=(mod*10+d[i])%k;
		i++;
	}
	if(mod==0) ans=1;
	return ans;
}
int main(){
	int mod=0,i,k,d[31],flag;
	char s[31];
	int len=strlen(gets(s));
	for(i=0;i<len;i++) d[i]=s[i]-'0';
	for(k=2;k<=9;k++){
		if(det(d,k,len)){
			if(flag==1) printf(" ");
			printf("%d",k);
			flag=1;
		}			
	}
	if(flag==0) printf("none");
	return 0;
}

求10000以内n的阶乘

#include <stdio.h>
int a[1000000]={1,1},len=1;
int main() { 
	int n,i,j,x;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		x=0;						//用于存放进位
		for(j=1;j<=len;j++){		//对乘数的每一位进行处理
			a[j]=a[j]*i+x;
			x=a[j]/10;
			a[j]%=10;
			if(x>0&&j==len) len++;
		}
	}
	for(i=len;i>=1;i--) printf("%d",a[i]);
	return 0;
}

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值