它运行不了
它运行不了
它运行不了,不知道为什么
运行加,减之后后面就不输出了,想吐
思路是,创建两个链表头插法(方便计算),每一个节点储存一位数
加法是对应的位数相加,判断是否进位,向后循环
减法跟加法差不都,依次相减,判断是否向高位借1,结果符号要单独判断‘
乘法使用两个循环,分别用一组数的每一位循环×另一组数的每一位,注意乘完放入的位次
除法先判断两数大小 a==b,a<b,直接输出结果
a>b,a=a-b直到a<b,减的次数是商,余数是a
#include<stdio.h>
#include<string.h>
#include<malloc.h>
typedef struct LNode
{
int data;//注意类型 选择int 或者char都可以
struct LNode *next;
} LinkList;
static int fuhao=1;//定义一个全局变量 判断符号
int ListLength(LinkList *head)//求链表长度 有效长度
{
LinkList *p=head->next;
int i=0;
while(p!=NULL)
{
i++;
p=p->next;
}
return(i);
}
int GetElem(LinkList *head,int i)//求第i个数,并返回到e中
{
int j=1;
LinkList *p=head->next;
while(p!=NULL&&j<i)
{
j++;
p=p->next;
}
if(p==NULL)
return 0;
else
{
//*e=p->data;
return p->data;
}
}
int add(LinkList *head1,LinkList *head2,int m,int n)//加函数
{
int j,k,d;
j=m>n?m:n;//最大
k=n>m?m:n;//小
LinkList *head3,*s;
int i;
int flag;
LinkList *p,*q,*r;
p=head1->next;
q=head2->next;
head3=(LinkList*)malloc(sizeof(LinkList));//创建第三个链表储存结果
head3->next=NULL;
flag=0;
for(i=0;i<k;i++)
{
s=(LinkList*)malloc(sizeof(LinkList));
s->next=head3->next;
head3->next=s;
//((p->data+q->data+flag)>9)
// {
d=p->data+q->data+flag;
flag=d/10;//进位
s->data=d%10;//取余
q=q->next ;
p=p->next ;
}
while(i<n)
{//n 第一个长
s=(LinkList*)malloc(sizeof(LinkList));
s->next=head3->next;
head3->next=s;
d=p->data+flag;
flag=d/10;//进位
s->data=d%10;//取余
p=p->next ;
i++;
}
while(i<m)
{//m 第二个长
s=(LinkList*)malloc(sizeof(LinkList));
s->next=head3->next;
head3->next=s;
d=q->data+flag;
flag=d/10;//进位
s->data=d%10;//取余
q=q->next ;
i++;
}
r=head3->next ;
for(i=0;i<j;i++)
{
printf("%d",r->data );
r=r->next;
}
printf("\n");
return 0;
}
LinkList* sub(LinkList *head1,LinkList *head2,int m,int n,int l)
{
//printf("两数之差为\n");
if(l==0)
{
printf("差为0"); //两数相等 差为零
}
int j,k,d;
char f;//f表示符号
j=m>n?m:n;//最大
k=n>m?m:n;//小
LinkList *head3,*s;
int i;
int flag;
LinkList *p,*q,*r;
if(n>m){
//LinkList *p,*q,*r;
p=head1->next;
q=head2->next;
head3=(LinkList*)malloc(sizeof(LinkList));//创建第三个链表储存结果
head3->next=NULL;
flag=0;
for(i=0;i<k;i++)
{
s=(LinkList*)malloc(sizeof(LinkList));
s->next=head3->next;
head3->next=s;
//((p->data+q->data+flag)>9)
// {
d=p->data-q->data+flag;
if(d<0)
{flag=-1;//向高位借一
s->data =d+10;
}
else
{
flag=0;
s->data =d;
}
q=q->next ;
p=p->next ;
}
while(i<n)
{//n 第一个长
s=(LinkList*)malloc(sizeof(LinkList));
s->next=head3->next;
head3->next=s;
d=p->data+flag;
if(d<0)
{flag=-1;//向高位借一
s->data =d+10;
}
else
{
flag=0;
s->data =d;
}
//flag=d/10;//进位
//s->data=d;//取余
p=p->next ;
i++;
//f='+';
}
}
/*while(i<m)
{//m 第二个长
s=(LinkList*)malloc(sizeof(LinkList));
s->next=head3->next;
head3->next=s;
d=q->data+flag;
if(d<0)
{flag=-1;//向高位借一
s->data =d+10;
}
else
{
flag=0;
s->data =d;
}
//flag=d/10;//进位
//s->data=d;//取余
q=q->next ;
i++;
f='-';
}
*/
//printf("%c",f);
else
{
q=head1->next;
p=head2->next;
flag=0;
for(i=0;i<k;i++)
{
s=(LinkList*)malloc(sizeof(LinkList));
s->next=head3->next;
head3->next=s;
//((p->data+q->data+flag)>9)
// {
d=p->data-q->data+flag;
if(d<0)
{flag=-1;//向高位借一
s->data =d+10;
}
else
{
flag=0;
s->data =d;
}
q=q->next ;
p=p->next ;
}
while(i<m)
{//n 第一个长
s=(LinkList*)malloc(sizeof(LinkList));
s->next=head3->next;
head3->next=s;
d=p->data+flag;
if(d<0)
{flag=-1;//向高位借一
s->data =d+10;
}
else
{
flag=0;
s->data =d;
}
//flag=d/10;//进位
//s->data=d;//取余
p=p->next ;
i++;
//f='+';
}
fuhao=0;
}
/* r=head3->next;
for(i=0;i<j;i++)
{
printf("%d",r->data );
r=r->next;
}
return 0;*/
//printf("两数之差为");
return head3;
}
int ride(LinkList *head1,LinkList *head2,int m,int n)
{
int l1,l2,d;
int j,z,k;
z=m>n?m:n;//最大
//k=n>m?m:n;//小
LinkList *head3,*s;
int i=0;
int flag;
LinkList *p,*q,*r;
p=head1->next;
q=head2->next;
head3=(LinkList*)malloc(sizeof(LinkList));//创建第三个链表储存结果
head3->next=NULL; //初始化
while(i<m+n)
{
s=(LinkList*)malloc(sizeof(LinkList));//创建第三个链表储存结果
s->next=head3->next;
head3->next=s;
s->data=0;//初始赋0
i++;
}
s=head3;
for(i=0;i<m;i++)
{//第一层循环
flag=0;
for(k=0;k<i+1;k++)
{
s=s->next ;//放在合适
}
for(j=0;j<n;j++)
{//第二次循环
d=p->data*q->data+flag;
s->data+=( s->data+d)%10;//保存本位
flag=( s->data+d)/10;//进位
p=p->next ;
s=s->next ;
}
if(flag>0)
{
s->data=flag;//判断最后一次是否有进位
//j++;//j是表示长度
}
q=q->next ;
s=head3;
p=head1->next ;
}
r=head3->next;
// if(fuhao==0)
// printf("-");
for(i=0;i<z;i++)
{
printf("%d",r->data );
r=r->next;
}
}
int divide(LinkList *head1,LinkList *head2,int m,int n,int l,char a[])
{
//char u[];
LinkList *p,*q,*r,*t;
char *a1,*b1;
int i,j,k;
i=0;
j=m>n?m:n;//最大
if(l==0) //两数相等
{
printf("商为1 余数为0\n");
}
if(l<0)//第一个数小于第二个数
{
printf("商为0 余数为");
printf("%s",a);
}
//第一个数大于第二个数
else
{ while(1)
{
//t=head1;
head1=sub(head1,head2,m,n,l);
i++;
if(ListLength(head2)>ListLength(head1) ) //第一个数比第二个短
break;
if(ListLength(head2)==ListLength(head1) ) //两个数一样长
{
k=ListLength(head2);
for(i=0;i<k;i++)
{
//GetElem(head1,k-i-1);//倒序循环 比较两数大小
//GetElem(head2,k-i-1);
if(GetElem(head1,k-i-1)<GetElem(head2,k-i-1))
break;
}
}
printf("商为%d,余数为 ",i);
r=head1->next;
for(i=0;i<j;i++)
{
printf("%d",r->data );
r=r->next;
}
}
}
/*printf("商为%d,余数为 ",i);
r=head1->next;
for(i=0;i<j;i++)
{
printf("%d",r->data );
r=r->next;
}
} */
}
int main()
{
LinkList *head1,*head2,*s,*r;
printf("请输入两组大数");
int i,j,n,m,k,l;
//static int fuhao=1;
char a[100];
scanf("%s",a);
n=strlen(a);
//int a[100];
/*do{
i=0;
scanf("%d",&a[i]);
printf("%d",a[i]);
//循环数组接受大数
n=i+1;
i++; //n是长度
}
while(a[i]);
for(i=n;i<100;i++)
a[i]=0;
*/
head1=(LinkList*)malloc(sizeof(LinkList));
head1->next=NULL;
for(i=0;i<n;i++)
{
s=(LinkList*)malloc(sizeof(LinkList));
//s->data=a[i];
s->data=a[i]-'0';
//printf("%d",s->data);
s->next=head1->next;
head1->next=s;
}
char b[100];
scanf("%s",b);
m=strlen(b);
head2=(LinkList*)malloc(sizeof(LinkList));
head2->next=NULL;
for(i=0;i<m;i++)
{
s=(LinkList*)malloc(sizeof(LinkList));
s->data=b[i]-'0';
//printf("%d",s->data);
//canf("%c",&s->data);
//s->data=a[i];
s->next=head2->next;
head2->next=s;
}
printf("两数之和为\n");
add(head1,head2,m,n);//调用add函数
l=strcmp(a,b);
printf("两数之差为\n");
r=sub(head1,head2,m,n,l)->next;
if(fuhao==0)
{
printf("-");
}
for(i=0;i<j;i++)
{
printf("%d",r->data);
r=r->next;
}
r=NULL;
printf("测\n");
printf("两数之积为\n");
ride(head1,head2,m,n);
printf("\n");
divide(head1,head2,m,n,l,a);
}