C程序训练:大数相乘与阶乘的计算

两个大数相乘,我们可以利用小学生列竖式做乘法的方法编写程序即可。例如,计算123*23,可以按以下步骤做:

1. answer = 0;

2. temp=123*3 =369

3. answer = answer + temp

4. temp = 123 * 20 = 2460

5. answer = answer + temp

按该方法编写程序,需要设计:

1. 计算两个数的加,完成上面的3和4步。

2. 完成被乘数与一位数的乘法,完成上面的第2步和第4步。注意低位的0,比如第4步,123和乘数的十位2相乘,结果还需乘10。如果有百位,计算结果需要乘以100。在实现时,可以预先留出0的位数,计算的结果放在前面。


#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define DIGIT 500
void reserved(char * str, int len) // 逆置
{for (int m = 0, n = len - 1; m < n; m++, n--) {char temp = str[m];str[m] = str[n];str[n] = temp;}  
} 
// 加法  a=a+b, 返回a的长度。
int add(char *a, char *b, int len_a, int len_b) {int len, i;len = (len_a>=len_b)?len_a:len_b;for(i=0; i<len; i++){a[i] = a[i] + b[i];  a[i+1] += a[i] / 10;a[i] %= 10;        }if(a[i]) i++;return i;
}int multiply(char *a, char *b, char *answer, int len1, int len2) 
{char temp[DIGIT]={0};//每一轮乘法的值int anslen = 0;  int k;for (int i = 0; i <len2; i++) {    memset(temp,0,DIGIT);k = i;  for(int j=0; j<len1; j++,k++) {temp[k] += a[j] * b[i];temp[k+1] = temp[k] / 10;temp[k] %= 10;}if(temp[k]) k++;   anslen = add(answer, temp, anslen, k);//加法运算    }reserved(answer, anslen);return anslen;
}int main() 
{char num1[DIGIT]={0}, num2[DIGIT]={0}, answer[DIGIT]={0};int i,len1,len2,len;scanf("%s", num1);scanf("%s", num2);len1 = strlen(num1);i=len1;while(i) {num1[--i] -= '0';    if(num1[i]<0 || num1[i]>9) {printf("输入错。\n");exit(1);} }len2 = strlen(num2);i=len2;while(i) {num2[--i] -= '0';    if(num2[i]<0 || num2[i]>9) {printf("输入错。\n");exit(2);} }  reserved(num1, len1);reserved(num2, len2);len = multiply(num1, num2, answer, len1, len2);for(i=0; i<len; i++) printf("%d", answer[i]);printf("\n");  return 0;
}

对上面的算法进行优化,将add和multiply两个函数合并在一起,代码更紧凑。

优化后的multiply代码如下。

int multiply(char *a, char *b, char *answer, int len1, int len2) {int anslen = 0;  for (int i = 0; i <len2; i++) {for (int j = 0; j <len1; j++) {answer[i+j] += a[j] * b[i];answer[i+j+1] += answer[i+j]/10;answer[i+j] %= 10;}    }for(anslen=len2+len1;!answer[anslen]; anslen--);reserved(answer, ++anslen);return anslen;
}

同样,按此思路,我们可以计算出任何数的阶乘。

程序代码如下:

#include <stdio.h>
#define DIGIT 5000int multiply(int *answer,int n) 
{int length = 1;int k,i,j,c=0;  for (i = 2; i <= n; i++) {for(k=0; k<length; k++) {answer[k] = answer[k] * i + c;c = answer[k] / 10;    answer[k] %= 10;        }while(c) {answer[length++]=c % 10;        c /= 10;}        }return length;
}int main() {int answer[DIGIT]={1};int n,len;scanf("%d",&n);len = multiply(answer,n);for(int i=len-1; i>=0; i--) printf("%d", answer[i]);printf("\n");return 0;
}

为了让程序看起来更加容易,对程序进行改进、优化,代码如下。


#include <stdio.h>
#define DIGIT 5000
int multiply(int answer[],int len, int n) 
{  int i,c=0;  for (i = 0; i < len; i++) {answer[i] = answer[i] * n + c;c = answer[i] / 10;    answer[i] %= 10;        }while(c){answer[i++] = c%10;  c = c / 10;         }return i;
}int main() {int answer[DIGIT]={1};int n,len=1;scanf("%d",&n);for(int i=2; i<=n; i++) {len = multiply(answer,len,i);}for(int i=len-1; i>=0; i--) printf("%d", answer[i]);printf("\n");return 0;
}

参考文献:

[1]李红卫,李秉璋. C程序设计与训练(第四版)[M],大连,大连理工大学出版社,2003.

[2]https://pan.baidu.com/s/17ZXphwqySNIsIgcGtYMjvg?pwd=lhwc

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

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

相关文章

如何从电脑找回/恢复误删除的照片

按 Shift Delete 以后会后悔吗&#xff1f;想要恢复已删除的照片吗&#xff1f;好吧&#xff0c;如果是这样的话&#xff0c;那么您来对地方了。在本文中&#xff0c;我们将讨论如何从 PC 中检索已删除的文件。 自从摄影的概念被曝光以来&#xff0c;人们就对它着迷。早期的照…

Markdown编辑器

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Linux 挂载卸载 设备

如何挂载 Linux中挂载一个存储设备&#xff0c;你可以按照以下步骤进行&#xff1a; 首先&#xff0c;你需要找到你的设备在系统中的标识。你可以使用lsblk或fdisk命令来查看。例如&#xff0c;设备可能被标识为/dev/sdb1。 创建一个挂载点。这是一个目录&#xff0c;你将在…

Windows Server 2012 R2部署项目

JDK 下载JDK 1.直接官网下载&#xff1a;http://www.oracle.com/&#xff1b; 2.我用的是1.8&#xff0c;阿里云盘分享地址&#xff1a;https://www.aliyundrive.com/s/u4V9x1AHL2r 安装jdk 双击安装点击下一步如果不改变路径就一直下一步 安装完成直接点击关闭即可&#x…

GPT Store,是否会成为下一个App Store?

经历了一场风波后&#xff0c;原本计划推出的GPT Store终于成功上线。OpenAI在北京时间1月11日推出了GPT Store&#xff0c;被广泛视为类似于苹果的"App Store"&#xff0c;为人工智能应用生态系统迈出了重要一步。然而&#xff0c;OpenAI要想将GPT Store打造成苹果般…

一、docker的安装与踩坑

目录 一、安装docker&#xff08;centos7安装docker&#xff09;1.安装环境前期准备2.参考官网安装前准备3.参考官网安装步骤开始安装docker4.运行首个容器 二、安装一些软件的踩坑1.启动docker踩坑2.安装mysql踩坑3.罕见问题 三、关于我的虚拟机 一、安装docker&#xff08;ce…

【WPF.NET开发】WPF中的文档

本文内容 文档类型文档控件和文本布局文档打包XPS 文档 Windows Presentation Foundation (WPF) 提供丰富的文档功能&#xff0c;可创建旨在比前几代 Windows 更易于访问和读取的高保真内容文档。 除增强功能和质量外&#xff0c;WPF 还对文档显示、打包和安全性能提供集成服…

Rockchip | FIQ-Debugger调试工具

FIQ-Debugger fiq debugger是集成到内核中的一种系统调试手段。 FIQ在arm架构中相当于nmi中断&#xff0c;fiq debugger把串口注册成fiq中断&#xff0c;在串口fiq中断服务程序中集成了一些系统调试命令。 一般情况下串口是普通的console模式&#xff0c;在串口工具下键盘输入…

如何再造宇宙厂所有APP?

本文内容&#xff0c;纯属十年老架构师杜撰&#xff0c;切勿照着实操&#xff0c;可能会给你带来几十亿的流量&#xff0c;怕你的服务器扛不住。 1. 破音 前端用uniapp&#xff0c;花800买个短视频应用模板&#xff0c;后端用golang支持高并发, 数据库用图数据库加elastic se…

openssl3.2 - 官方demo学习 - cipher - ariacbc.c

文章目录 openssl3.2 - 官方demo学习 - cipher - ariacbc.c概述笔记END openssl3.2 - 官方demo学习 - cipher - ariacbc.c 概述 ARIA-256-CBC EVP_EncryptInit_x()的区别 EVP_EncryptInit() 参数为ctx, cipher, key, iv EVP_EncryptInit_ex2() 参数为 ctx, cipher, key, iv, …

什么是激励函数?

激励函数&#xff08;激活函数&#xff09;在神经网络中扮演着至关重要的角色。它们是用于决定一个神经元是否应该被激活的函数&#xff0c;帮助神经网络学习复杂的模式。激活函数对输入信号进行非线性变换&#xff0c;然后输出到下一层。 不同的激励函数具有不同的数学特性&a…

ArchVizPRO Interior Vol.8 URP

ArchVizPRO Interior Vol.8 URP是一个在URP中制作的建筑可视化项目。这是一个完全可导航的现代公寓,包括一个带开放式厨房的客厅、休息区、两间卧室和两间浴室。从头开始构建每一个细节,这个室内有130多件家具和道具、自定义着色器和4K纹理。所有家具和道具都非常详细,可以在…

aigc 局部动画

ComfyUIAnimateDiffControlNet的Inpainting生成局部重绘动画_哔哩哔哩_bilibili 动图&#xff1a; 【Stable Diffusion】SD生成超稳定丝滑卡通动画&#xff08;附安装包&#xff09;&#xff0c;一分钟就能搞定动图&#xff01;小白轻松上手&#xff01;_哔哩哔哩_bilibili

基于 LangChain+大模型,我打造一款自己的LLM应用

本文共计1.7w字&#xff0c;梳理不易&#xff0c;喜欢点赞、收藏、关注。需要技术交流&#xff0c;可以加入我们 目录 通俗易懂讲解大模型系列技术交流一、LangChain是什么二、LangChain核心组件2.1 Models2.2 Indexes2.2.1 Document Loaders2.2.2 Text Splitters2.2.3 Vectors…

网络安全B模块(笔记详解)- MYSQL信息收集

MYSQL信息收集 1.通过渗透机场景Kali中的渗透测试工具对服务器场景MySQL03进行服务信息扫描渗透测试(使用工具Nmap,使用必须要使用的参数),并将该操作显示结果中数据库版本信息作为Flag提交; Flag:MySQL 5.5.12 2.通过渗透机场景Kali中的渗透测试工具对服务器场景MySQL0…

【光波电子学】基于MATLAB的多模光纤模场分布的仿真分析

基于MATLAB的多模光纤模场分布的仿真分析 一、引言 &#xff08;1&#xff09;多模光纤的概念 多模光纤&#xff08;MMF&#xff09;是一种具有较大纤芯直径的光纤结构&#xff0c;其核心直径通常在10-50微米范围内。与单模光纤&#xff08;SMF&#xff09;相比&#xff0c;…

【基础数据结构】栈和队列

例题1 化栈为队 实现一个MyQueue类&#xff0c;该类用两个栈来实现一个队列。 示例&#xff1a; MyQueue queue new MyQueue(); queue.push(1); queue.push(2); queue.peek(); // 返回 1 queue.pop(); // 返回 1 queue.empty(); // 返回 false说明&#xff1a; 你只能使用标…

Linux QT以太网配置及相关知识

Linux QT以太网配置及相关知识 平台和内容概述安装Qt Creator设计用户界面编辑源代码自定义LineEdit创建槽函数以太网逻辑功能实现静态配置ui逻辑:功能概述代码实现DNS退出程序输入框中的ip规范保存数据和读取数据构建文件编译运行平台注意点开机自动配置以太网总结平台和内容…

FreeRtos Queue (一)

本篇主要讲队列的数据结构和初始化 一、队列的数据结构 二、队列初始化完是什么样子的 队列初始化的函数调用关系&#xff1a;xQueueGenericCreate->prvInitialiseNewQueue->xQueueGenericReset 所以&#xff0c;最终初始化完的队列是这样的 假设申请了4个消息体&…

SQL:一行中存在任一指标就显示出来

当想要统计的两个指标不在一张表中时&#xff0c;需要做关联。但很多情况下&#xff0c;也没有办法保证其中一张表的维度是全的&#xff0c;用left join或right join可能会导致数据丢失。所以借助full join处理。 如&#xff0c;将下面的数据处理成表格中的效果&#xff08;维…