C语言 大数加法 大数乘法

news2024/10/1 21:43:23

最近刷题,总遇到大数加法(浮点数)和乘法问题(阶乘),总结一下思路。

大数乘法


主要思想:编程实现竖式乘法(小学时候学的列竖式计算乘法)

  1. 创建一个很大的数组,用于存储大数的每一位。(注意这里数组的下标是逆序的逻辑。)
  2. 外层循环用于从1开始递增到n。
  3. 内层循环分为两部分,
    其一:模拟竖式乘法;
    其二:处理进位
  4. 循环输出数组的大数。
#include <stdio.h>

int main() {
	int n, i ,j;

	while(scanf("%d",&n) != EOF){

        int last = 1;	//保存大数的位数 
        int a[100000] = {0,1,0};	
        //保存大数 数组是倒序存储的,即n-1,n-2,...,3,2,1,0 其中下标为0处不存数,存放0

        for (int i = 1; i <= n; i++){	
            //将大数的每一位都与当前的i阶相乘,并将结果存在当前大数的下标空间下,即此时不处理进位 ->模拟竖式乘法 
            for (int j = 1; j <= last; j++){
                a[j] *= i;
            }
            
            //处理进位 
            /*j <= last 保证结果是>=大数的位数的。 
            a[j] != 0避免结果位数<大数位数时,a[j]出现0的情况导致退出计算 。*/
            
            for(j = 1; j <= last || a[j] != 0; j++){ 	
                a[j+1] += a[j] /10;	//如果有进位直接就可以在下一个数组空间中,写入进位 
                a[j] %= 10;
            }
            
            last = j-1;//更新位数
            
            
        } 
        //输出阶乘结果
            for (j = last; j >= 1; j--) 
                printf("%d", a[j]);
                
            printf("\n");
            
        }
}

推荐B站的【大数乘法-40的阶乘-40!-详细解析-哔哩哔哩】 https://b23.tv/ZXkcmuj 讲的很详细,我是看这位up的讲解才懂的。

大数加法


思想类似于上述的大数乘法。(下面的方法最多只能计算到10位的数据,下次实现一下转成字符数组的形式,可以计算更多位数)

下面分步骤进行代码演示,最后给出完整代码。

  1. 大数的每一位都相加,并将结果存在当前大数的下标空间下,即此时不处理进位 ->模拟竖式加法
    注意,数组的逻辑是逆序的,即数组中存放数据的位次为:个位、十位、百位…以此类推。
    在这里插入图片描述
    在这里插入图片描述
  2. 处理进位
    在这里插入图片描述
    在这里插入图片描述
  3. 输出结果
    在这里插入图片描述
    完整代码
#include <stdio.h>

int main() {
	int m,n, i ,j;
	int last;	//保存大数的位数 
	int a[11] = {0};	//保存大数 数组是倒序存储的,即n-1,n-2,...,3,2,1,0 其中下标为0处不存数,存放0 
	long int aaa = 1234567891; //最多只能到10位 
	printf("enter two number:\n");
	scanf("%d",&m);
	scanf("%d",&n);
	
	//将大数的每一位都相加,并将结果存在当前大数的下标空间下,即此时不处理进位 ->模拟竖式加法 
	for (int j = 1; j <= 10; j++){
		a[j] = (m%10) + (n%10);
		m = m/10;
		n = n/10;
	}

	//处理进位 
	/*j <= last 保证结果是>=大数的位数的。 
	a[j] != 0避免结果位数<大数位数时,a[j]出现0的情况导致退出计算 。*/
		
	for(j = 1; j <= 10 || a[j] != 0; j++){ 	
		a[j+1] += a[j] /10;	//如果有进位直接就可以在下一个数组空间中,写入进位 
		a[j] %= 10;
	}
		
	last = j-1;//更新位数
		
	//输出结果
	for (j = last; j >= 1; j--) 
		printf("%d", a[j]);
			
	printf("\n");
	
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/338117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Q WiFi 代码框架

同学,别退出呀,我可是全网最牛逼的 WIFI/BT/GPS/NFC分析博主,我写了上百篇文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦。 1 wifi 架构图 备注:在Android 9.0中,WiFi的状态处理在WifiStateMachine中进行,到…

c语言数据结构-图的遍历

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 定义&#xff1a; 两种遍历方法&#xff1a; 深度优先搜索&#xff08;DFS&#xff09;&#xff1a; …

ElasticJob-Lite架构篇 - 认知分布式任务调度ElasticJob-Lite

前言 本文基于 ElasticJob-Lite 3.x 版本展开分析。 如果 Quartz 集群中有多个服务端节点&#xff0c;任务决定在哪个服务端节点上执行的呢&#xff1f; Quartz 采用随机负载&#xff0c;通过 DB 抢占下一个即将触发的 Trigger 绑定的任务的执行权限。 在 Quartz 的基础上&…

从0到1一步一步玩转openEuler--10 openEuler基础配置-设置kdump

10 openEuler基础配置-设置kdump 文章目录10 openEuler基础配置-设置kdump10.1 设置kdump10.1.1 设置kdump预留内存10.1.1.1 预留内存参数格式10.1.2 预留内存推荐值10.1.3 禁用网络相关驱动10.1 设置kdump 本节介绍如何设置kdump预留内存及修改kdump配置文件参数。 10.1.1 设…

写python爬虫,你永远绕不过去代理问题

如果你想要从事 Python 爬虫相关岗位&#xff0c;那你一定会接触到代理问题&#xff0c;随之而来的就是下面 5 大代理知识点。 什么是代理&#xff1a;代理是网络中间人&#xff08;中间商赚插件&#xff09;&#xff0c;它代表用户发送网络请求&#xff0c;隐藏用户的真实身份…

JDY-31蓝牙模块使用指南

前言 本来是想买个hc-05&#xff0c;这种非常常用的模块&#xff0c;但是在优信电子买的时候&#xff0c;说有个可以替代的&#xff0c;没注意看&#xff0c;买回来折腾半天。 这个模块是从机模块&#xff0c;蓝牙模块分为主机从机和主从一体的&#xff0c;主机与从机的区别就…

【安全】nginx反向代理+负载均衡上传webshel

Nginx负载均衡下上传webshell 什么是反向代理&#xff1f; 正向代理就是代替客户端进行各种服务的访问以及获取&#xff1b;那么反向代理自然就是代替服务器进行事务处理&#xff0c;就是此时的代理服务器负责将用户的各项请求做一个汇总、分类&#xff0c;将其分发到不同的服务…

网络抓包方式复现Tomcat- AJP协议文件读取/命令执行漏洞(CVE-2020-1938 / CNVD-2020-10487)

目录 测试是否安装成功​编辑 基础简介 Tomcat Connector(连接器) ​编辑Servlet(服务程序) Tomcat内部处理请求流程 Tomcat加载和处理jsp的流程图 抓包复现 需要将下图中抓取到的数据包修改一下 替换成二进制数据的形式&#xff1a; python版替换代码&#xff1a; 运…

WordPress网站日主题Ri主题RiProV2主题开启了验证码登录但是验证码配置不对结果退出登录后进不去管理端了

背景 WordPress网站日主题Ri主题RiProV2主题开启了验证码登录但是验证码配置不对结果退出登录后进不去管理端了;开启了腾讯云验证码防火墙但APPID,APPSecret没配置,结果在退出登录后,由于验证码验证失败管理端进不去了 提示如下:

自定义软件帮助文档(qt assistant实现)

网上搜了一下&#xff0c;软件的帮助文档&#xff0c;三个都可以&#xff1a;https://github.com/zealdocs/zeal&#xff0c;https://zealdocs.org/&#xff0c;看看这个博客说的 https://blog.csdn.net/libaineu2004/article/details/125028913&#xff0c;这个也是开源的&…

神经网络实战--使用迁移学习完成猫狗分类

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下如何使用基于tensorflow和keras的迁移学习完成猫狗分类&#xff0c;欢迎大家一起前来探讨学习~ 本文目录&#xff1a;一、加载数据集1.调用库函数2.加载数据集3.数据集管理二、猫狗数据集介绍1.猫狗数据集介…

【Spring(十一)】万字带你深入学习面向切面编程AOP

文章目录前言AOP简介AOP入门案例AOP工作流程AOP切入点表达式AOP通知类型AOP通知获取数据总结前言 今天我们来学习AOP,在最初我们学习Spring时说过Spring的两大特征&#xff0c;一个是IOC,一个是AOP,我们现在要学习的就是这个AOP。 AOP简介 AOP:面向切面编程,一种编程范式&#…

计算机网络自顶向下 -- 流水线,滑动窗口协议

流水线协议 Rdt3.0在停等操作的过程中浪费了大量的时间&#xff1a; 从而在Rdt 3.0上引入了流水线机制&#xff1a;为了提高资源利用率 流水线协议&#xff1a; 允许发送方在收到ACK之前连续发送多个分组&#xff0c;更大的序列号范围&#xff0c;同时发送方和/或接收方需要更…

关于自动驾驶高精定位的几大问题

交流群 | 进“传感器群/滑板底盘群”请加微信号&#xff1a;xsh041388交流群 | 进“汽车基础软件群”请加微信号&#xff1a;Faye_chloe备注信息&#xff1a;群名称 真实姓名、公司、岗位作者 | 许良定位是高等级自动驾驶的基础&#xff0c;但在高速NOA和城区NOA等场景中&…

Linux账号与用户组

目录 用户标识符&#xff1a;UID与GID 用户账号 /etc/passwd文件结构 1、账号名称 2、密码 3、UID 4、GID 5、用户信息说明栏 6、家目录 7、shell /etc/shadow文件结构 1、账号名称 2、密码 3、最近修改密码的日期 4、密码不可被修改的天数&#xff08;与第三字…

Git | 在IDEA中使用Git

目录 一、在IDEA中配置Git 1.1 配置Git 1.2 获取Git仓库 1.3 将本地项目推送到远程仓库 1.4 .gitignore文件的作用 二、本地仓库操作 2.1 将文件加入暂存区 2.2 将暂存区的文件提交到版本库 2.3 查看日志 三、远程仓库操作 3.1 查看和添加远程仓库 3.2 推送至远程仓…

fastcgi未授权访问漏洞(php-fpm fast-cgi未授权访问漏洞)

本文参考《Fastcgi协议分析 && PHP-FPM未授权访问漏洞 && Exp编写》进行该漏洞的复现以及分析。 1.前置基础 1.1 nginx中的fastcgi 先来看先前用过的一张图&#xff0c;其是nginx解析用户请求的过程。 图中的几个定义&#xff1a; CGI&#xff1a;CGI是一种…

1628_MIT 6.828 xv6_chapter0操作系统接口

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 这本书最初看名字以为是对早期unix的一个解读&#xff0c;但是看了开篇发现 不完全是&#xff0c;只是针对JOS教学OS系统来做的一些讲解。 Xv6是对UNIX v6的重新实…

【Java 面试合集】Java中修饰符有哪些,有什么应用场景

Java中修饰符有哪些&#xff0c;有什么应用场景 1. 概述 首先我们要知道Java的三大特性&#xff1a;封装&#xff0c;继承&#xff0c;多态。 而我们今天要分析的修饰符就跟封装有着密切的联系。因为权限修饰符可以控制变量以及方法的作用范围。 废话不多说&#xff0c;上图…

Python推导式

列表&#xff08;list&#xff09;推导式 [remove for source in xx_list]或者[remove for source in xx_list if condition] 实例&#xff1a; names[Bob,Mark,Mausk,Johndan,Wendy] new_names[name.upper() for name in names if len(name)<5] print(new_names)即迭代列…