大数运算C语言实现

大数运算C语言实现大数乘法利用字符数组进行大数乘法的位运算#include<stdio.h>#include<math.h>#include<string.h>voidprint_cheng(chars1[],chars2[]);voidmain(){chars1[1000],s2[1000];while(scanf(“%s%s”,s1,s2))pr…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

大数乘法

利用字符数组进行大数乘法的位运算

#include<stdio.h>
#include<math.h>
#include<string.h>
void print_cheng(char s1[],char s2[]);
void main()
{
char s1[1000],s2[1000];
while(scanf("%s%s",s1,s2))
print_cheng(s1,s2);
}

void print_cheng(char s1[],char s2[])
{
int a[1000],b[1000],c[1000]={0};
//当然用memset(c,0,sizeof(c));且应用memset方法需要调用#include<>是等价于c[1000]={0},同样表示将c数组全部初始化为0
int i,j;
int len_a,len_b,len;
len_a=strlen(s1);  len_b=strlen(s2);
printf("s1=%d  s2=%d  ",len_a,len_b);
len=len_a+len_b;                   //两个大数相乘所得的结果的最大项便是len_a+len_b

	for(i=0;i<len_a;i++)           //将大数s1倒序传递给整型数组a
		a[i]=s1[len_a-1-i]-'0';
	
	for(i=0;i<len_b;i++)      //将大数s2倒序传递给整型数组b
		b[i]=s2[len_b-1-i]-'0';

	for(i=0;i<len_a;i++)
		for(j=0;j<len_b;j++)
			c[i+j]+=a[i]*b[j];   //用大数b的每一项乘以大数a的所有项

		for(i=0;i<len;i++){    //进位取整
			if(c[i]>=10){
			c[i+1]+=c[i]/10;
			c[i]%=10;
			}
		}  //此时i的值为len

		i=len-1;   
		if(c[i]==0)i--;    //判断首位是否为零
		if(i<0)printf("0");   
		else{
		for(;i>=0;i--)
			printf("%d",c[i]);   //倒序输出结果
		}
printf("\n");
}

大数加法

利用字符数组进行大数加法的位运算

#include<stdio.h>
#include<string.h>
void print_Big(char a[],char b[]);
void main()
{
char a[1000],b[1000];
scanf("%s%s",a,b);
print_Big(a,b);
}

//大数求和
void print_Big(char a[],char b[])
{
char c[1000];    //定义字符数组c并且初始化使其a[0]为1,其他为0;    用于存放大数求和后的结果
int i,sum,t=0;
int len,len_a,len_b;
len_a=strlen(a); 
len_b=strlen(b);
len=strlen(a)>strlen(b)? strlen(a):strlen(b);
c[len+1]='\0';   //使其和的最大项的可能的项的后一项赋空
		for(i=0;i<len;i++)     //进行倒序相加,从最小为开始相加
		{
			if(len_a-1-i>=0&&len_b-1-i>=0){     //满10进位,不满则不进位
			sum=a[len_a-1-i]-'0'+b[len_b-1-i]-'0'+t;
			c[len-i]=sum%10+'0';
			t=sum/10;
			}
			else if(len_a-1-i>=0&&len_b-1-i<0){
				sum=a[len_a-1-i]-'0'+t;
				c[len-i]=sum%10 + '0' ;
				t=sum/10;
			}
			else if(len_a-1-i<0&&len_b-1-i>=0){
				sum=b[len_b-1-i]-'0'+t;
				c[len-i]=sum%10+'0';
				t=sum/10;
			}
		}
	c[0]='0'+t;
	//正序输出
	if(c[0]=='0')printf("%s\n",c+1);    //如果第一位为0,便从a[1]开始输出
	else printf("%s\n",c);     //第一位不为0,直接输出
}

大数阶乘

利用整型数组进行大数阶乘的位运算

#include<stdio.h>
void print_Big(int n);
void main()
{
int n;  
while(1){
	scanf("%d",&n);
	print_Big(n);
}
}

//大数阶乘
void print_Big(int n)
{
int i,j,len;
int a[1000]={1};
	if(n<0){printf("error\n"); return; }
	else if(n==1||n==0){printf("%d\n",1); return; }
	
	len=1;   //大数阶乘前,它的位数为1位
	for(i=2;i<=n;i++)
	{
	int t=0;  int sum;
		for(j=0;j<len;j++)
		{
		sum=a[j]*i+t;     
		a[j]=sum%10;
		t=sum/10;
		//进位的条件是:进位数t不等于0,并且算到最后现有的最高项
		if(t!=0&&j==len-1)len++;
		}
	}
	//倒叙输出
	for(i=len-1;i>=0;i--)
		printf("%d",a[i]);
printf("\n");
}

大数幂

利用整型数组进行大数幂的位运算

//大数幂
#include<stdio.h>
void print_Big(int x,int n);
void main()
{
int x,n;
	while(1){
		scanf("%d%d",&x,&n);  //x的n次方
		print_Big(x,n);  
	}
}

void print_Big(int x,int n)
{
int a[100000]={1};
int i,j,t,sum,len=1;   //默认阶乘初始项数为1
	if(n==0){ printf("%d\n",1); return ; }
	for(i=1;i<=n;i++){
		t=0;
		for(j=0;j<len;j++){
			sum=a[j]*x+t;
			a[j]=sum%10;
			t=sum/10;
			if(t!=0&&j==len-1)
				len++;
		}
	}
	for(i=len-1;i>=0;i--)
		printf("%d",a[i]);
	printf("\n");
}

多次运用函数进行大数运行,是为了方便代码的移植性
本人新手程序员,都是个人的代码感悟,可能不够简洁,老练,但新手易懂
代码会友交天下朋友,用心处事结四海豪杰
第一次写,若有瑕疵还请见谅。
自写代码,如有雷同纯属意外。
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/185029.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Intellij IDEA 实用插件

    Intellij IDEA 实用插件1.前言从2020年JVM生态报告解读可以看出IntellijIDEA目前已经稳坐JavaIDE头把交椅。而且统计得出付费用户已经超过了八成(国外统计)。IDEA的优良设计保证了我的生产力,也是我情愿为之付费的软件之一。今天把我自己经常用的一些插件拿出来分享一波。同时欢迎加入[微信圈子]SpringForAll社区交流编程经验。2.IDEA插件分享之前我们来看看其插件体系。IntellijIDEA大部分功能是通过插件集成进来的。默认情况下已经集成了很多插件。你可以…

  • java ipv6转换成ipv4,如何映射IPv4的IPv6地址转换为IPv4(字符串格式)?「建议收藏」

    IhaveastructsockaddrstructurecontaininganIPv4-mapped-IPv6addresslike::ffff:10.0.0.1.IwanttoobtainonlytheIPv4versionofitinastring(inthiscase,10.0.0.1)inCprogramminglangu…

  • Mac配置Maven环境[通俗易懂]

    Mac配置Maven环境[通俗易懂]1.下载maven包到本地https://maven.apache.org/download.cgi1.在应用程序找到终端(实用工具)文件夹里面2.输入命令:vi~/.bash_profile输入i进入编辑模式输入:(注意⚠️M2_HOME需要填写为自己的路径哦~)exportM2_HOME=/Library/apache-maven-3.5.3exportPATH…

  • 高级创意,单片机电子DIY制作精华资料汇总「建议收藏」

    高级创意,单片机电子DIY制作精华资料汇总「建议收藏」高级创意,单片机电子DIY制作精华资料汇总今天给大家分享创意小生活,电子DIY制作精华资料汇总,资料有点多,将近400个电子创意,够同学们学习和交作业的了,需要的可以在闯客网技术论坛下载,有问题加群解决:813238832下载链接:https://bbs.usoftchina.com/thread-203642-1-1.html一、温度控制和湿度控制  1.简单实用的恒温控制器 …

  • Android 基于TCP的 Socket 编程实现(结合 okio)

    Android 基于TCP的 Socket 编程实现(结合 okio)两个进程如果要进行通讯最基本的一个前提就是能够唯一的标识一个进程,在本地进程通讯中我们可以使用PID来唯一标识一个进程,但PID只在本地是唯一的,网络中两个进程PID冲突几率很大,这时我们就需要通过其他手段来唯一标识网络中的进程了,我们知道IP层的ip地址可以唯一标示主机,而TCP层协议和端口号结合就可以唯一标示主机的一个进程了。

  • 电脑预览,电脑怎么预览psd格式?[通俗易懂]

    电脑预览,电脑怎么预览psd格式?[通俗易懂]经常使用PS的朋友们都知道Photoshop文档的默认格式是psd格式,可是在电脑上可能不能像jpg图片一样显示缩略图预览。遇到这种情况我们该怎么办?要是电脑上并没有安装PS软件又该怎么预览?下面我们就一起来看看哪些解决方法。步骤如下:方法一:有安装PS,使用PS软件预览。1.首先双击桌面的PS软件,等待进入PS,如图所示。2.进入PS初始界面,将你需要预览psd格式图片打开,就可以在软件中看到图…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号