c语言大数相加怎么写,大数相加

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

#include

#include

/**

*

* 定义双向节点

* 数据区为一个整型数字

*

**/

struct Node {

int number;//数据区,仅一个数字,保存一位数字

struct Node * next;

struct Node * prev;

};

typedef struct Node Node;

/**

* 创建头节点

* param:number,此数字赋值给创建出的节点的数字区

* return:创建出来的头结点

*

*

**/

Node * create_head(int number){

Node * head = (Node *)malloc(sizeof(Node));

head->number = number;

//只有一个节点的时候,此节点的next和prev均为NULL

head->next = NULL;

head->prev = NULL;

return head;

}

/**

* 创建一个新的节点,并将此节点追加到链表的最末端

* param:**tail链表尾指针的指针,因为方法中需要修改尾指针,因为你懂的原因,这里使用了指针的指针

* number整型数字,赋值给新节点的数据区

**/

void create_node_to_tail(Node ** tail,int number){

//为新节点开辟空间

Node * node = (Node *)malloc(sizeof(Node));

node->number = number;

//因为新节点要加到尾部,所以它的next变为NULL,prev指向原有的尾部

node->next = NULL;

node->prev = *tail;

//原有的尾部的next指向最新的节点

(*tail)->next = node;

//新节点到链表尾部之后,新节点成为链表的尾部

*tail = node;

}

/**

* 创建一个新的节点,并将此节点追加到链表的最前端

* param**head链表头指针的指针,原因同上

* number同上

*

**/

void create_node_to_head(Node ** head,int number){

//为新节点开辟空间

Node * node = (Node *)malloc(sizeof(Node));

node->number = number;

//新节点加到头前面,所以它的prev变为NULL,next指向原有的头部

node->prev = NULL;

node->next = *head;

//原有的头部的prev指向最新的节点

(*head)->prev = node;

//最新的节点成为新的头部

*head = node;

}

/**

* 大数相加

* param:number1_head加数1的头指针

* number2_head加数2的头指针

* return:计算结果的尾指针,主要是为了方便输出

*

**/

Node * add_big(Node * number1_head,Node * number2_head){

//进位

int carry = 0;

Node * number1_current = number1_head;

Node * number2_current = number2_head;

//保存计算结果的链表的头指针和尾指针

Node * result_head = NULL;

Node * result_tail = NULL;

//循环时,只要有一个加数没有结束,则继续循环

while(number1_current != NULL || number2_current != NULL){

//加数1,如果节点为NULL,则此加数为0,应对两个加数不一样长的情况

int number1 = (number1_current == NULL)?0:number1_current->number;

//加数2,如果节点为NULL,则此加数为0,应对两个加数不一样长的情况

int number2 = (number2_current == NULL)?0:number2_current->number;

//计算加数1+加数2+进位

int result = number1 + number2 + carry;

//更新进位

carry = result/10;

//获取当前位除掉进位后的值

result = result % 10;

//如果尚未创建链表,说明当前是第一次进入循环,则创建头节点

if(result_head == NULL){

result_head = create_head(result);

result_tail = result_head;

}else{

//进入这里,说明链表已创建,可以直接创建新节点,并追加到原链表后面

create_node_to_tail(&result_tail,result);

}

//移动指针,进入下一次循环,加入非空判断,应对两个加数不一样长的情况

if(number1_current != NULL){

number1_current = number1_current->next;

}

if(number2_current != NULL){

number2_current = number2_current->next;

}

}

//结束循环后,如果进位大于0,则还需要再创建一个节点

if(carry > 0){

create_node_to_tail(&result_tail,carry);

}

//返回尾指针

return result_tail;

}

/**

* 输入大数

* return:输入后产生的链表的头指针

*

**/

Node * input_number(){

printf("%s","请输入加数\n");

//保存输入的数字的头指针和尾指针

Node * head = NULL;

Node * tail = NULL;

while(1){

//每次输入一个字符

char c;

scanf("%c",&c);

//0-9对应的asicc码值为48-57,在此范围内,说明输入的是数字

if(c >= 48 && c <= 57) {

//减去48,将char型转为数字

int number = c - 48;

//如果尚未创建链表,说明是第一次进入循环,则创建头节点

if(head == NULL){

head = create_head(number);

tail = head;

}else{

//进入到这里,说明链表已创建,可以直接创建新节点,并加到原链表的前面

//注:链表保存的数字,低位在前,高位在后,而输入数字时,高位先输入,低位后输入

//所以这里链表的结点要加到链表的最前面

create_node_to_head(&head,number);

}

}

//如果输入的是回车,则退出循环

else if(c == '\n'){

break;

}else{

//如果输入的不是上两者,则返回NULL

printf("%s","只可以输入数字\n");

return NULL;

}

}

return head;

}

/**

* 输出大数

* param:tail要输出的链表的尾指针,因为存放数据的时候,低位在前,高位在后,为了正常输出,需要从尾向头输出

*

**/

void output_number(Node * tail){

Node * current = tail;

//从尾到头,一个一个输出数字

while(current != NULL){

printf("%d",current->number);

current = current->prev;

}

}

void main(){

//依次输入加数,如果返回为NULL,则说明输入不合法,退出

Node * number1_head = input_number();

if(number1_head == NULL)

return;

Node * number2_head = input_number();

if(number2_head == NULL)

return;

//计算结果,并根据返回的尾指针输出数字

Node * result_tail = add_big(number1_head,number2_head);

output_number(result_tail);

}

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

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

相关文章

苹果深度学习核心“神经引擎”方向性介绍

https://www.chiphell.com/thread-1785739-1-1.html转载于:https://www.cnblogs.com/eustoma/p/9858410.html

骆驼中的事件处理

在上一篇有关骆驼-小水车的帖子中&#xff0c;我介绍了骆驼-小水车的组件&#xff0c;并使用骆驼路线中的规则实现了一些简单的面向任务的过程。 今天&#xff0c;我将展示如何通过添加事件处理来扩展此示例。 那么如何描述一个事件呢&#xff1f; 每个事件在某个时间发生并持…

值得拥有!精心推荐几款超实用的 CSS 开发工具

当你开发一个网站或 Web 应用程序的时候&#xff0c;有合适的工具&#xff0c;绝对可以帮助您节省大量的时间。在这篇文章中&#xff0c;我为大家收集了超有用的 CSS 开发工具。 对于 Web 开发人员来说&#xff0c;找到有用的 CSS 开发工具&#xff0c;就像找到一个魔灯&#x…

matplotlib散点图笔记

定义: 由一组不连续的点完成的图形 散点图: 包含正相关性,负相关性和不相关性. 散点图生成函数: plt.scatter(x,y) 演示代码如下: import numpy as np import matplotlib.pyplot as plt open,closenp.loadtxt(‘000001.txt’,delimiter’,’,skiprows1,usecols(1,4),unpackTrue…

c语言循环嵌套do do while while结构例子,讲解C++的do while循环和循环语句的嵌套使用方法...

用do-while语句构成循环do-while语句的特点是先执行循环体&#xff0c;然后判断循环条件是否成立。其一般形式为&#xff1a;do语句while (表达式);它是这样执行的&#xff1a;先执行一次指定的语句(即循环体)&#xff0c;然后判别表达式&#xff0c;当表达式的值为非零(“真”…

nlog官方帮助_Nlog日志组件简介

NLog简介NLog是一个简单灵活的.NET日志记录类库,NLog的API非常类似于log4net&#xff0c;配置方式非常简单。支持多种形式输出日志:文本文件、系统日志、数据库、控制台、邮箱等1.NLog简介在nuget控制台输入安装nlog命令: Install-Package NLog.ConfigNlog配置的方式常用的有两…

怎样在体制内培养出离开体制的能力

你要有随时可以离开而且离开以后比现在过得更好的能力。 这句看似励志的废话&#xff0c;正如告诉一个穷人&#xff0c;你要有随时能够赚钱而且保持财富自由的能力。 这谈何容易呢&#xff1f; 不下到游泳池里怎么能学会游泳。 不离开体制&#xff0c;你离开体制的能力从何培养…

Java 8:开发人员怎么看?

由于Java 8发行倒计时已经开始&#xff0c;因此Java开发人员似乎肯定已经准备好参与其中。 根据Typesafe的一项调查 &#xff0c;参与其中的开发人员中有65&#xff05;回答说他们将在24个月的计划中迁移到Java 8&#xff0c;而从中有30&#xff05;的开发者将在接下来的6个月中…

比较好的一些 ConcurrentHashMap讲解博客

jdk8 https://blog.csdn.net/jianghuxiaojin/article/details/52006118#commentBox jdk7、8 https://crossoverjie.top/2018/07/23/java-senior/ConcurrentHashMap/ jdk7 http://www.yuanrengu.com/index.php/2017-01-17.html 转载于:https://www.cnblogs.com/Draymonder/p/105…

20款漂亮的长阴影 LOGO 设计作品【附免费生成工具】

长阴影&#xff08;Long Shadow&#xff09;概念来自于最新非常流行的扁平化设计&#xff08;Flat Design&#xff09;。扁平化设计趋势影响最大的是用户界面元素和图标&#xff0c;但它也开始蔓延到其他网页设计的其他部分。 长阴影其实就是扩展了对象的投影&#xff0c;感觉是…

c语言sqlist结构体,c语言里 sqlist

满意答案cielkong2018.08.12采纳率&#xff1a;43% 等级&#xff1a;9已帮助&#xff1a;463人c语言里 sqlist&#xff1f;//定义顺序表L的结构体typedef struct{Elemtype data[MaxSize]&#xff1b;int length;}SqList;//建立顺序表void CreateList(SqList * &L,ElemTy…

汇编语言实验三

1. 练习1 第1步&#xff0c;编写汇编源程序t1.asm, 源程序代码如图1-1所示。 (1) 运行程序&#xff0c;观察程序输出结果是什么&#xff1f; 2) 将 line4和line9种寄存器dl 的值分别修改为 0~9 中任何一个数字&#xff0c;重新汇编→ 连接→运行&#xff0c;观察结果的变化。 …

android dp转px的公式_公式px到dp,dp到px android

注意&#xff1a;上面广泛使用的解决方案基于displayMetrics.density。但是&#xff0c;文档解释说这个值是一个舍入值&#xff0c;与屏幕“桶”一起使用。例如。在我的Nexus 10上&#xff0c;它返回2&#xff0c;其中实际值为298dpi(实际)/ 160dpi(默认值) 1.8625。根据您的要…

Java事实让您大吃一惊! (信息图)

随着Java 8计划在未来几天内发布 &#xff0c;我们正在寻找一些Java事实&#xff0c;这些事实将真正捕捉这种编程语言对世界的影响。 因此&#xff0c;我们决定创建一个简单的图表&#xff0c;描述有关Java历史的一些重要统计数据。 信息的主要来源是Oracle的Java时间轴 。 我…

多线程爬取新闻标题和链接

新闻分页地址&#xff1a;https://news.cnblogs.com/n/page/10/&#xff1b;url中最后一个数字代表页码 from concurrent.futures import ThreadPoolExecutor import threading import time from queue import Queue import logging import requests from bs4 import Beautiful…

15个创意示例教您如何自定义 404 错误页面

在这篇文章中&#xff0c;你会看到一组充满创意的404错误页面设计。我希望这个集合能够启发和帮助你设计自己的 404 错误页面。一个自定义的404错误页面将鼓励用户在您的网站上停留更长的时间。 404页面必须让访客容易理解&#xff0c;最好有有一些互动。你会看到下面的例子中一…

C语言反序输出英文句子,C++实现英文句子中的单词逆序输出的方法

本文实例讲述了C实现英文句子中的单词逆序输出的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;#include "stdafx.h"#include #include #include using namespace std;int main(int arc,char** argv){string str"I come from liaoning.";sta…

r语言转化为python_数值型与字符型转换总结|R语言

在日常碰到问题时出现当前“数据类型不能进行操作”的提示时还是有些脑壳疼&#xff0c;所以这次整理了针对R数据类型转换的总结。理论部分主要是R for Data Science的向量节选翻译、《R语言实战》第二章2.2创建数据结构、《R in a Nutshell》以及猴子老师的向量ppt。————文…

input 输入值的监听 禁止输入特殊字符

1.input 输入值的监听 //用于监听input的值变化&#xff08;input的值产生变化才会触发事件&#xff09;(function ($) {$.fn.watch function (callback) {return this.each(function () {//缓存以前的值 $.data(this, originVal, $(this).val());//event $(this).on(keyu…

android 如何extends 多个,Android多线程:继承Thread类 使用解析(含实例教程)

前言在Android开发中&#xff0c;多线程的使用十分常见今天&#xff0c;我将全面解析多线程其中一种常见用法&#xff1a;继承Thread类。目录示意图1. 简介示意图2. 使用讲解2.1 使用步骤示意图2.2 具体使用// 步骤1&#xff1a;创建线程类 (继承自Thread类)class MyThread ext…