大数相加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/354834.shtml

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

相关文章

关联关系、依赖关系总结

一、关联关系总结&#xff1a; 1.对象和对象之间的连接。在Java中&#xff0c;关联关系的代码表现形式为一个类做为另一个类的属性类型存在。即“有”的关系&#xff1a;”has-a”。 2.关联关系的方向&#xff1a;关联关系分为单向关联和双向关联 ①单向关联&#xff1a; A类…

使用cglib创建代理对象

在上一篇文章中&#xff0c;我讨论了基于标准Java的代理对象。 当您要在实现接口的对象上具有方法调用处理程序时&#xff0c;可以使用这些方法。 Java反射代理的创建要求您具有一个实现接口的对象。 我们要代理的对象已经失控&#xff0c;它没有实现我们要从处理程序调用的接口…

四阶龙格库塔c语言,四阶龙格库塔算法的C语言实现

解微分方程&#xff12;&#xff10;&#xff10;&#xff11;年&#xff13;月焦作大学学报&#xff2a;&#xff2f;&#xff35;&#xff32;&#xff2e;&#xff21;&#xff2c;&#xff2f;&#xff26;&#xff2a;&#xff29;&#xff21;&#xff2f;&#xff3a;&a…

8个超震撼的HTML5和纯CSS3动画源码

HTML5和CSS3之所以强大&#xff0c;不仅因为现在大量的浏览器的支持&#xff0c;更是因为它们已经越来越能满足现代开发的需要。Flash在几年之后肯定会消亡&#xff0c;那么HTML5和CSS3将会替代Flash。今天我们要给大家分享8个最新的HTML5和纯CSS3动画及其源码&#xff0c;这些…

c语言打砖块游戏代码,打砖块游戏的源代码(请多指教)

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼#include#include#include#include#includevoid draw(int x1){int m0,n0,x40,y20;int t0,i,j,k1;int a0,b127,c88;for(i0;i<8;i){ni*20;yn20;for(j0;j<16-t;j){m(ji)*40;xm40;int points[]{m,n,x,n,x,y,m,y}; setfillstyle(R…

git本地创建新分支并推送到远程仓库

1,在当前项目目录&#xff0c;从已有的分支创建新的分支(如从master分支),创建一个dev分支 git checkout -b dev 2,创建完可以查看一下,分支已经切换到dev git branch * dev master 3,提交该分支到远程仓库 git push origin dev 4,测试从远程获取dev git pull origin dev 5,我觉…

javadoc 开源项目_在下一个项目中不使用JavaDoc的5大原因

javadoc 开源项目JavaDoc对于框架和库的开发是绝对必需的&#xff0c;这些框架和库为其他框架&#xff08;例如Spring Framework&#xff0c;JDK&#xff09;提供了公共接口。 对于内部企业软件和/或产品开发&#xff0c;我有以下原因会在将来忽略“ 100&#xff05;JavaDoc Po…

android拍照功能无预览,Android 无预览拍照

最近得到了一个需求&#xff0c;在后台拍照并保存public void onTakePhotoClicked() {final SurfaceView preview new SurfaceView(this);SurfaceHolder holder preview.getHolder();// deprecated setting, but required on Android versions prior to 3.0holder.setType(Su…

vim选中字符复制/剪切/粘贴

问题描述&#xff1a; vim 中选中指定字符&#xff0c;进行复制/剪切/粘贴 问题解决&#xff1a; 进入vim中visual模式&#xff0c;visual模式进入&#xff0c;可以有三种方式&#xff1a; &#xff08;1&#xff09;在普通模式&#xff08;normal&#xff09;下&#xf…

使用JavaFX构建反应系统

JavaFX是用于在Java中构建图形应用程序的新标准库&#xff0c;但是许多程序员仍然对Swing甚至&#xff08;高音&#xff09;AWT感到困惑。 在Java诞生20年来&#xff0c;发生了很多事情。 两年前&#xff0c;当我开始研究Speedment UI的JavaFX库时&#xff0c;发现很多东西很着…

android中访问手机存储空间,android – 访问手机内部存储以推入SQLite数据库文件...

我正在使用Netbeans和java开发我的android应用程序.当我使用模拟器时,我可以通过访问以下路径,data / data / com.example.helloandroid / database来访问File explorer并将SQLite数据库插入设备内部存储器但是当我使用真实设备时,我无法访问此位置以将SQLite文件推送到手机的内…

Spring中@Autowired注解、@Resource注解的区别

Spring不但支持自己定义的Autowired注解&#xff0c;还支持几个由JSR-250规范定义的注解&#xff0c;它们分别是Resource、PostConstruct以及PreDestroy。Resource的作用相当于Autowired&#xff0c;只不过Autowired按byType自动注入&#xff0c;而Resource默认按 byName自动注…

android中白色怎么表示,通知栏图标在android 5中变成白色

接受的答案不完全正确。当然&#xff0c;它会使通知图标显示颜色&#xff0c;但是这样做有一个很大的缺点-将目标SDK设置为比AndroidLolliop低&#xff01;如果您按照建议将目标SDK设置为20来解决您的白色图标问题&#xff0c;您的应用程序将不会针对AndroidLolliop&#xff0c…

Merge Sorted Array

这是一道我觉得有点不是很好的简单题 题目&#xff1a; Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:     You may assume that nums1 has enough space (size that is greater or equal to m n) to hold additi…

阿里巴巴android图标素材网,阿里巴巴矢量图标库

网站简介&#xff1a;IconFont:阿里巴巴矢量图标库是由阿里巴巴体验团队倾力打造的中国第一个最大且功能最全的矢量图标库&#xff0c;提供矢量图标下载、在线存储、格式转换等功能&#xff0c;是设计师和前端开发的便捷工具。IconFont平台是由阿里巴巴UX部门推出的矢量图标管理…

gkz cloud sql_使用Cloud SQL的Google App Engine全文搜索

gkz cloud sql许多Google AppEngine开发人员一直在等待全文搜索功能&#xff0c;特别是来自网络上最大的搜索引擎Google。 我很高兴看到Google团队正在努力&#xff0c;您可以在Google I / O 2011会议上查看&#xff1a;Bo Majewski和Ged Ellis进行的全文本搜索 。 据我所知&am…

poj1419 Graph Coloring 最大独立集(最大团)

最大独立集&#xff1a; 顶点集V中取 K个顶点&#xff0c;其两两间无连接。 最大团&#xff1a; 顶点集V中取 K个顶点&#xff0c;其两两间有边连接。 最大独立集补图的最大团最大团补图的最大独立集 #include<iostream> #include<cstring> #include<cstdio>…

android短信增加条目,Android仿短信条目右上角的红色小圆球提示气泡

可以重写View的onDraw完成该功能&#xff0c;也可以写布局文件完成该功能。现在使用布局文件完成。暂时先简单写一个TextView右上角的提示小红球&#xff0c;也可以根据需要写一个ImageView右上角的小红球提示。android:layout_width"match_parent"android:layout_he…

AccuREST Stub Runner发布

最近发布时间不错&#xff01; 我在Too Much Coding博客上的博客更多是关于发布&#xff0c;然后是关于任何具体主题;&#xff09; 在作为Brixton RC1的一部分发布Spring Cloud Sleuth之后&#xff0c;我们刚刚发布了AccuREST 1.0.4版本。 我们修复了一些错误&#xff0c;但引…

idea使用码云

每更改项目的内容会弹出框提示你是否需要发送码云更新 如果没选yes后想要更新码云 联合开发 发现回到A同事的项目中&#xff0c;Student.java并没有修改 完成后&#xff0c;发现的Student.java已经更新了&#xff0c;跟B同事的代码也是一样。因为从服务器下载了最新的代码。 …