两个大数相加
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fstream.h>
#define MAX 400
void my_read(int *a) //对操作数进行处理(倒序排列数组,便于运算)
{
int len,i,flag=0;
char s[MAX];
aa:
while(1)
{
scanf("%s",&s);
len=strlen(s);
if (s[0]=='-'){
printf("输入错误:操作数不为负数");
goto aa;
}
for(i=len;i>=1;i--)
{
if ((s[len-i]-'0')<0||(s[len-i]-'0')>9)
{
printf("\t\t\t你输入的第%d位不合法,按任意键重新输!!",len-i+1);
getchar();
goto aa;
}
else
a[i]=s[len-i]-'0';
}
a[0]=len;
break;
}
return;
}
void my_print(int *a) //输出时把数组倒过来就是答案
{
int i;
if (a[0]<0) printf("-");
if (a[0]==0)
{
printf("0");
return;
}
for(i=abs(a[0]);i>=1;i--)
printf("%d",a[i]);
printf("\n");
}
void format(int *a) //当两个字符相加时超过10时
{
int p;
for(p=1;p<a[0]||a[p]>=10;p++)
{
if (p>=a[0]) a[p+1]=0;
a[p+1]+=a[p]/10;
a[p]=a[p]%10;
}
if (p>=a[0]) a[0]=p;
return;
}
void add(int *a,int *b,int *c) //加法的运算
{
int len,i;
if (a[0]<b[0]) len=a[0];
else len=b[0];
for(i=1;i<=len;i++)
c[i]=a[i]+b[i];
if (len<a[0])
{
for (;i<=a[0];i++)
c[i]=a[i];
c[0]=a[0];
}
else
{
for(;i<=b[0];i++)
{
c[i]=b[i];
}
c[0]=b[0];
}
format (c);
}
void format1(int *a) //减法 相减为负时
{
int i;
for (i=1;i<=a[0];i++)
if (a[i]<0)
{
a[i]+=10;
a[i+1]-=1;
}
}
void sub_1(int *a,int *b,int *c)
{
int i;
for (i=1;i<=b[0];i++)
c[i]=a[i]-b[i];
if (a[0]==b[0]) goto loop;
for (;i<=a[0];i++)
c[i]=a[i];
loop:
c[0]=a[0];
format1(c);
i=c[0];
while(1)
if (c[i]==0) i--;
else break;
c[0]=i;
return;
}
void sub(int *a,int *b,int *c)
{
int i,flag=0;
for (i=1;i<=a[0];i++)
if (a[i]!=b[i]) { flag=1; break; }
if (flag==0) {
c[0]=0;
return;
}
flag=0;
if (a[0]==b[0]) {
i=a[0];
while(i>0)
{
if (a[i]>b[i]){
sub_1(a,b,c);
break;
}
if (a[i]<b[i]){
flag=1;
sub_1(b,a,c);
break;
}
i--;
}
}
if (a[0]>b[0])
sub_1(a,b,c);
else
if (a[0]<b[0])
{
flag=1;
sub_1(b,a,c);
}
if (flag)
c[0]=-c[0];
else
c[0]=c[0];
}
void main()
{
int a[MAX],b[MAX],c[MAX];
char yn,eq;
strat: printf("请输入表达式(操作数和操作符之间需空格):\n");
my_read(a);
scanf("%s",&yn);
my_read(b);
scanf("%s",&eq);
if (yn=='+'&&eq=='=')
{
add(a,b,c);
printf("\n\t\t\t");
printf("A=");
my_print(a);
printf("\n\t\t\t");
printf("B=");
my_print(b);
printf("\n\t\t\t");
printf("C=A+B=");
my_print(c);
goto loop;
}
if (yn=='-'&&eq=='=')
{
sub(a,b,c);
printf("A=");
my_print(a);
printf("\nB=");
my_print(b);
printf("\nC=A-B=");
my_print(c);
goto loop;
}
else{ printf("输入错误");
goto loop;
}
loop:
while(1)
{
printf("\n\t\t\t继续计算吗?(y/n)");
yn=getchar();
if (yn=='y') goto strat;
if (yn=='n') return;
}
}
这个输入的时候运算符左右需加空格(比如1 + 1 =),如果我不想加空格(1+1=),那要怎么办?谢谢啦
----------------解决方案--------------------------------------------------------
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*#include <fstream.h>*/
#define MAX 400
void my_print(int *a) /* 输出时把数组倒过来就是答案 */
{
int i;
if (a[0]<0) printf("-");
if (a[0]==0)
{
printf("0");
return;
}
for(i=abs(a[0]);i>=1;i--)
printf("%d",a[i]);
printf("\n");
}
void format(int *a) /* 当两个字符相加时超过10时 */
{
int p;
for(p=1;p<a[0]||a[p]>=10;p++)
{
if (p>=a[0]) a[p+1]=0;
a[p+1]+=a[p]/10;
a[p]=a[p]%10;
}
if (p>=a[0]) a[0]=p;
return;
}
void add(int *a,int *b,int *c) /* 加法的运算 */
{
int len,i;
if (a[0]<b[0]) len=a[0];
else len=b[0];
for(i=1;i<=len;i++)
c[i]=a[i]+b[i];
if (len<a[0])
{
for (;i<=a[0];i++)
c[i]=a[i];
c[0]=a[0];
}
else
{
for(;i<=b[0];i++)
{
c[i]=b[i];
}
c[0]=b[0];
}
format (c);
}
void format1(int *a) /* 减法 相减为负时 */
{
int i;
for (i=1;i<=a[0];i++)
if (a[i]<0)
{
a[i]+=10;
a[i+1]-=1;
}
}
void sub_1(int *a,int *b,int *c)
{
int i;
for (i=1;i<=b[0];i++)
c[i]=a[i]-b[i];
if (a[0]==b[0]) goto loop;
for (;i<=a[0];i++)
c[i]=a[i];
loop:
c[0]=a[0];
format1(c);
i=c[0];
while(1)
if (c[i]==0) i--;
else break;
c[0]=i;
return;
}
void sub(int *a,int *b,int *c)
{
int i,flag=0;
for (i=1;i<=a[0];i++)
if (a[i]!=b[i]) { flag=1; break; }
if (flag==0) {
c[0]=0;
return;
}
flag=0;
if (a[0]==b[0]) {
i=a[0];
while(i>0)
{
if (a[i]>b[i]){
sub_1(a,b,c);
break;
}
if (a[i]<b[i]){
flag=1;
sub_1(b,a,c);
break;
}
i--;
}
}
if (a[0]>b[0])
sub_1(a,b,c);
else
if (a[0]<b[0])
{
flag=1;
sub_1(b,a,c);
}
if (flag)
c[0]=-c[0];
else
c[0]=c[0];
}
int main()
{
int a[MAX],b[MAX],c[MAX],i,j,len;
char yn,eq,s[2*MAX];
start:
printf("请输入表达式:\n");
scanf("%s",s);
len=strlen(s);
for(i=0;i<len;i++)
if(s[i]=='+'||s[i]=='-')
j=i;
for(i=0;i<j;i++)
a[i+1]=s[j-i-1]-'0';
a[0]=j;
for(i=0;i<len-j-2;i++)
b[i+1]=s[len-i-2]-'0';
b[0]=len-j-2;
yn=s[j];
eq=s[len-1];
if (yn=='+'&&eq=='=')
{
add(a,b,c);
printf("\n\t\t\t");
printf("A=");
my_print(a);
printf("\n\t\t\t");
printf("B=");
my_print(b);
printf("\n\t\t\t");
printf("C=A+B=");
my_print(c);
goto loop;
}
if (yn=='-'&&eq=='=')
{
sub(a,b,c);
printf("A=");
my_print(a);
printf("\nB=");
my_print(b);
printf("\nC=A-B=");
my_print(c);
goto loop;
}
else{ printf("输入错误");
goto loop;
}
loop:
while(1)
{
printf("\n\t\t\t继续计算吗?(y/n)");
yn=getchar();
if (yn=='y') goto start;
if (yn=='n') return;
}
return 0;
}