超长整数处理
井盖为什么是圆形的-脚踏实地的近义词
沈 阳 航 空 航 天 大 学
课程设计
学 号 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));
}
}
}
}