超长整数处理

别妄想泡我
979次浏览
2021年01月11日 10:21
最佳经验
本文由作者推荐

井盖为什么是圆形的-脚踏实地的近义词

2021年1月11日发(作者:耿九畴)


沈 阳 航 空 航 天 大 学


课程设计







学 号 2

班 级 14070301
姓 名 韩长荣
指导教师 尹航

2012年 9 月 7 日


沈 阳 航 院 设 计 用 纸

沈阳航空航天大学
课程设计任务书
系: 自动化学院 专业:运载器综合测试 班级:14070301 学号:
2
一、课程设计题目:超长整数处理
二、课程设计工作自2012年9月2日起至2012年9月7日止
三、课程设计内容:

用C语言编写软件完成以下任务:
采用链表来表示一个带符号的超长整数(20位以上)。并且进行如下处理。
将超长整数s按 3位为一组分割,该三位数相加,并替换原来的三位数,构成一个新数(不考虑
进位)。显示并存在文件 中。例如,当s为875时,显示的数为:57718。
提示:超长整数要用字符串实现输入,按3位截 取,转成整型存放在链表中(每个节点存放3
位,如870-539-421-768-945),然后 即可处理。
四、课程设计要求:
程序质量:


贯彻结构话程序设计思想。
 用户界面友好,功能明确,操作方便;可以加以其他功能或修饰。
 用户界面中的菜单至少应包括“输入超长整数”、“运算”、“退出”3项。
 代码应适当缩进,并给出必要的注释,以增强程序的可读性。
课程设计说明书:
课程结束后,上交课程设计说明书(打印稿和电子稿),其内容如下:
 封面
 课程设计任务书
 目录
 需求分析(分析题目的要求)
 程序流程图(总体流程图和主要功能模块流程图)
 核心技术的实现说明及相应程序段
 个人总结
 参考资料
 源程序及适当的注释


指导教师: 学生签名:______



目录

一、需求分析
........... .................................................. ............ ………3
二.程序流程图
................................................ …….…错误!未定义书签。
三、核心技术的实现方法、程序段及注释
…7
四.个人总结
................................... ..................................... ……...12
五、参考文献
................................... ..................................... ……...12
六、源程序
.................................... .......................................... ………12


















一、需求分析
大整数 可用如下带表头结点 head 的循环链表表示:

大整数 “56789” 可用如下带头结点 head 的循环链表表示:


两者的和也用循环链表表示。先创建一个空循环链表:进位标志为 0 。

创建一个结点, s 指向它。求 *p 结点的值域与 *q 结点的值域与进位标志之和。



4321+4321+0=8642 ,重新设置进位标志和 *s 的值域:分别为 “ 和与
10000 的商 ” 、 “ 和与 10000 的余数 ” 。 864210000=0 ,
8642%10000=8642 。
连接: r->next=s; s->next=head; r=s;
p 后移, q 后移。

重复上述操作,直到 *p 结点的值域为 -1 或 *q 结点的值域为 -1 。

判断 p 和 q 的情况:
如果 p!=head ,则将其余结点依次连入和的链表中。
如果 q!=head ,则将其余结点依次连入和的链表中。
输出和的链表:从最后一个结点到第一个结点依次输出其值域。
可先将表逆置:




再从第一个到最后一个依次输出其值域。










二.程序流程图

1.程序总体结构图:









定义循环链表指针*p1,*p2有放和值的循环链表*r,建立动态链表的指针*s.以上三
个指针struct nedo型指针。并且循环链表头指针,尾指针相重合。
输入p1→num,p2→num
-1=head→num;关于head=s=(struct nedo*)malloc(sizejof(struct nedo))
While(p1→num!=-1||p2→num!=-1)

*p1与p2*两链表对应节点求和;
并把和存放在*r中;
每次只和一个节点;
开辟一个节点,并把指针赋给*s.
s→num%10000的值保留于原节点;
s→num10000的值加在下一个节点中
r→next=s建立链接关系;使新开辟的节点链入*r中
s→next=head;使s再去开辟并认为地址是head
r=s;使r作为表头
p1=p1→next p1后移
p2=p2→next p2后移
P1!=head

假 真


链入其余节点

P2!=head



链入其余节点
输入和链表,从最后一个节点到第一个节点依次输出其值域





三、核心技术的实现方法、注释
#include
#include
#define HUNTHOU 10000 *不带参数的宏定义*
typedef struct node{ int data;
struct node *next;
}NODE; *定义链表结构*

NODE *insert_after(NODE *u,int num); *在u结点后插入一个新的NODE,其值为
num*
NODE *addint(NODE *p,NODE *q); *完成加法操作返回指向*p+*q结果的指针*
void printint(NODE *s);
NODE *inputint(void);

int main()
{
NODE *s1,*s2,*s;
NODE *inputint(), *addint(), *insert_after();
printf(
s1=inputint(); *输入被加数*
printf(
s2=inputint(); *输入加数*
printf(显示被加数*



printf(显示加数*
s=addint(s1,s2); *求和*
printf(输出结果*
}
NODE *insert_after(NODE *u,int num)
{
NODE *v;
v=(NODE *)malloc(sizeof(NODE)); *申请一个NODE*
v->data=num; *赋值*
u->next=v; *在u结点后插入一个NODE*
return v;
}
NODE *addint(NODE *p,NODE *q) *完成加法操作返回指向*p+*q结果的指针*
{
NODE *pp,*qq,*r,*s,*t;
int total,number,carry;
pp=p->next; qq=q->next;
s=(NODE *)malloc(sizeof(NODE)); *建立存放和的链表表头*
s->data=-1;
t=s; carry=0; *carry:进位*
while(pp->data!=-1&&qq->data!=-1) *均不是表头*
{
total=pp->data+qq->data+carry; *对应位与前次的进位求和*



number=total%HUNTHOU; *求出存入链中部分的数值 *
carry=totalHUNTHOU; *算出进位*
t=insert_after(t,number); *将部分和存入s向的链中*
pp=pp->next; *分别取后面的加数*
qq=qq->next;
}
r=(pp->data!=-1)?pp:qq; *取尚未自理完毕的链指针*
while(r->data!=-1) *处理加数中较大的数*
{
total=r->data+carry; *与进位相加*
number=total%HUNTHOU; *求出存入链中部分的数值*
carry=totalHUNTHOU; *算出进位*
t=insert_after(t,number); *将部分和存入s指向的链中*
r=r->next; *取后面的值*
}
if(carry) t=insert_after(t,1); *处理最后一次进位*
t->next=s; *完成和的链表*
return s; *返回指向和的结构指针*
}
NODE *inputint(void) *输入超长正整数*
{
NODE *s,*ps,*qs;
struct number {int num;



struct number *np;
}*p,*q;
int i,j,k;
long sum;
char c;
p=NULL; *指向输入的整数,链道为整数的最低的个位,链尾为整数的最高位*
while((c=getchar())!='n') *输入整数,按字符接收数字*
if(c>='0'&&c<='9') *若为数字则存入*
{
q=(struct number *)malloc(sizeof(struct number)); *申请空间*
q->num=c-'0'; *存入一位整数*
q->np=p; *建立指针*
p=q;
}
s=(NODE *)malloc(sizeof(NODE));
s->data=-1; *建立表求超长正整数的链头*
ps=s;
while(p!=NULL) *将接收的临时数据链中的数据转换为所要求的标准形式*
{
sum=0;i=0;k=1;
while(i<4&&p!=NULL) *取出低四位*
{
sum=sum+k*(p->num);
i++; p=p->np; k=k*10;



}
qs=(NODE *)malloc(sizeof(NODE)); *申请空间*
qs->data=sum; *赋值,建立链表*
ps->next=qs;
ps=qs;
}
ps->next=s;
return s;
}
void printint(NODE *s)
{
if(s->next->data!=-1) *若不是表头,则输出*

{
printint(s->next); *递归输出*
if(s->next->next->data==-1)
printf(
else{
int i,k=HUNTHOU;
for(i=1;i<=4;i++,k=10)
putchar('0'+s->next->data%(k)(k10));
}
}
}




四.个人总结
通过这次课设,让我对以前所学的C语言知识有了更深刻的理解,还知道了程
序的精密性,稍有 一点错误,程序就不会运行,所以从中我明白了做事以及做人都
要有这种一丝不苟的精神,还有计算机真 的是一门学问,很深的学问,想要弄懂它
真的要下一份苦功才行啊,最后呢,课程设计还是我们以后走向 岗位的基础啊,所
以我们一定要重视它啊!
五、参考文献
1 谭浩强.C程序设计.北京:清华大学出版社,2005
2 刘成等.C语言程序设计实验指导与习题集.北京:中国铁道出版社,2006


六、源程序



#include
#include
#define HUNTHOU 10000
typedef struct node{ int data;
struct node *next;
}NODE;

NODE *insert_after(NODE *u,int num);
NODE *addint(NODE *p,NODE *q); *
void printint(NODE *s);
NODE *inputint(void);

int main()
{
NODE *s1,*s2,*s;
NODE *inputint(), *addint(), *insert_after();
printf(
s1=inputint();
printf(
s2=inputint();
printf(
printf(
s=addint(s1,s2);
printf(
}
NODE *insert_after(NODE *u,int num)
{


NODE *v;
v=(NODE *)malloc(sizeof(NODE));
v->data=num;
u->next=v;
return v;
}
NODE *addint(NODE *p,NODE *q)
{
NODE *pp,*qq,*r,*s,*t;
int total,number,carry;
pp=p->next; qq=q->next;
s=(NODE *)malloc(sizeof(NODE));
s->data=-1;
t=s; carry=0; *carry
while(pp->data!=-1&&qq->data!=-1)
{
total=pp->data+qq->data+carry;
number=total%HUNTHOU;
carry=totalHUNTHOU;
t=insert_after(t,number);
pp=pp->next;
qq=qq->next;
}
r=(pp->data!=-1)?pp:qq;
while(r->data!=-1)
{
total=r->data+carry;
number=total%HUNTHOU;
carry=totalHUNTHOU;
t=insert_after(t,number);


r=r->next;
}
if(carry) t=insert_after(t,1);
t->next=s;
return s;
}
NODE *inputint(void)
{
NODE *s,*ps,*qs;
struct number {int num;
struct number *np;
}*p,*q;
int i,j,k;
long sum;
char c;
p=NULL;
while((c=getchar())!='n')
if(c>='0'&&c<='9')
{
q=(struct number *)malloc(sizeof(struct number));
q->num=c-'0'
q->np=p;
p=q;
}
s=(NODE *)malloc(sizeof(NODE));
s->data=-1;


ps=s;
while(p!=NULL)
{
sum=0;i=0;k=1;
while(i<4&&p!=NULL)
{
sum=sum+k*(p->num);
i++; p=p->np; k=k*10;
}
qs=(NODE *)malloc(sizeof(NODE));
qs->data=sum;
ps->next=qs;
ps=qs;
}
ps->next=s;
return s;
}
void printint(NODE *s)
{
if(s->next->data!=-1)

{
printint(s->next);
if(s->next->next->data==-1)
printf(
else{
int i,k=HUNTHOU;
for(i=1;i<=4;i++,k=10)
putchar('0'+s->next->data%(k)(k10));
}


}
}
}



讨论组名字-怜悯的近义词是什么


保养皮肤的步骤-中秋快乐祝福语


大黔门-水的资料


鞋垫图纸-雨季三防措施


如何关闭自动更新-失物招领怎么写


最高人民法院院长-前方曹文轩


有关雨的诗句-燕王喜


什么是爱情-金石可镂