1 #include<stdio.h>
2 #include<string>
3 using namespace std;
4
5 const int N=30;
6 int min(int n,int m)//返回两个数中的最小一个数
7 {
8 return (n<m) ? n : m;
9 }
10
11 int max(int n,int m)//返回两个数中的最大一个数
12 {
13 return (n>m) ? n : m;
14 }
15
16 void Add()//两个长整数相加
17 {
18 int i,carry;
19 char num1[N],char num2[N];//数字1,数字2
20 int strlen_num1,strlen_num2;//数字1的长度,数字2的长度
21 int Num1[N],Num2[N],Result[N];
22 int minnum,maxnum;//两个数中长度最大的一个
23 printf(" ---------Add----------\n");
24 printf("请输入整数1:");
25 scanf("%s",&num1);
26 printf("请输入整数2:");
27 scanf("%s",&num2);
28
29 strlen_num1 = strlen(num1);//获得num1的长度
30 strlen_num2 = strlen(num2);//获得num2的长度
31 //printf("%d",strlen_num1);
32
33 for(i=0;i<strlen_num1;i++)
34 {
35 Num1[i] = num1[strlen_num1-1-i] - '0';//字符转化为整数
36 // printf("%d\n",Num1[i]);
37
38 }
39
40 for(i=0;i<strlen_num2;i++)
41 {
42 Num2[i] = num2[strlen_num2-1-i] - '0';//字符转化为整数
43 }
44
45
46 minnum = min(strlen_num1,strlen_num2);
47 maxnum = max(strlen_num1,strlen_num2);
48
49 carry = 0;//进位初始为0
50 for(i=0;i<minnum;i++)
51 {
52 Result[i] = (Num1[i] + Num2[i] + carry) % 10;
53 carry = (Num1[i] + Num2[i] + carry)/10;
54 }
55
56
57 if(strlen_num1>minnum)
58 {
59 for(i=minnum;i<strlen_num1;i++)
60 {
61 Result[i] = (Num1[i]+ carry) % 10;
62 carry = (Num1[i]+ carry)/10;
63
64 }
65 }
66
67 if(strlen_num2>minnum)
68 {
69 for(i=minnum;i<strlen_num2;i++)
70 {
71 Result[i] = (Num2[i]+ carry) % 10;
72 carry = (Num2[i]+ carry)/10;
73 }
74 }
75
76 if(carry>0)//最后一位有进位
77 {
78 Result[maxnum] = 1;
79 maxnum++;
80 }
81 printf("结果:");
82 printf("%s+%s=",num1,num2);
83 for(i=maxnum-1;i>=0;i--)
84 {
85 printf("%d",Result[i]);
86 }
87 printf("\n\n");
88 }
89
90 void Sub()//两个长整数相减
91 {
92 int i,j,carry;
93 char num1[N],char num2[N];//数字1,数字2
94 int strlen_num1,strlen_num2;//数字1的长度,数字2的长度
95 int Num1[N],Num2[N],Result[N];
96 int minnum,maxnum;//两个数中长度最大的一个
97 printf(" ---------Sub----------\n");
98 printf("请输入整数1:");
99 scanf("%s",&num1);
100 printf("请输入整数2:");
101 scanf("%s",&num2);
102
103 strlen_num1 = strlen(num1);//获得num1的长度
104 strlen_num2 = strlen(num2);//获得num2的长度
105
106 for(i=0;i<strlen_num1;i++)
107 {
108 Num1[i] = num1[strlen_num1-1-i] - '0';//字符转化为整数
109 }
110
111 for(i=0;i<strlen_num2;i++)
112 {
113 Num2[i] = num2[strlen_num2-1-i] - '0';//字符转化为整数
114 }
115
116 minnum = min(strlen_num1,strlen_num2);
117 maxnum = max(strlen_num1,strlen_num2);
118
119 if(minnum==strlen_num1)//被减数小
120 {
121 for(i=minnum;i<maxnum;i++)Num1[i] = 0;//补0
122 for(i=0;i<maxnum;i++)
123 {
124 if(Num2[i]<Num1[i])//需要借位
125 {
126 j = i +1;
127 while(j==0)
128 {
129 Num2[j] += 9;
130 j++;
131 }
132 Num2[j]--;
133 Result[i] = Num2[i] + 10 - Num1[i] ;
134 }else Result[i] = Num2[i] - Num1[i] ;
135 //printf("%d %d\n",Result[i],carry);
136 }
137
138 printf("结果:");
139 printf("%s-%s=",num1,num2);
140 printf("-");
141 for(i=maxnum-1;i>=0;i--)
142 {
143 if(Result[i]!=0)printf("%d",Result[i]);
144 }
145 printf("\n");
146 }else{//被减数大
147 for(i=minnum;i<maxnum;i++)Num2[i] = 0;//补0
148 for(i=0;i<maxnum;i++)
149 {
150 if(Num1[i]<Num2[i])//需要借位
151 {
152 j = i +1;
153 while(j==0)
154 {
155 Num1[j] += 9;
156 j++;
157 }
158 Num1[j]--;
159 Result[i] = Num1[i] + 10 - Num2[i] ;
160 }else Result[i] = Num1[i] - Num2[i] ;
161 //printf("%d %d\n",Result[i],carry);
162 }
163
164 printf("结果:");
165 printf("%s-%s=",num1,num2);
166 for(i=maxnum-1;i>=0;i--)
167 {
168 if(Result[i]!=0)printf("%d",Result[i]);
169 }
170 printf("\n");
171 }
172 }
173 int main()
174 {
175 int select,con;
176 printf("-----------两个长整数相加减------------\n");
177 do{
178 printf(" -----------------------\n");
179 printf(" |--------1::加法-------|\n");
180 printf(" |--------0::加法-------|\n");
181 printf(" -----------------------\n");
182 printf("你的选择:");
183 scanf("%d",&select);
184 if(select==1)
185 {
186 Add();
187 }else {
188 Sub();
189 }
190 printf(" -----------------------\n");
191 printf(" |--------1::继续-------|\n");
192 printf(" |--------0::退出-------|\n");
193 printf(" -----------------------\n");
194 printf("你的选择:");
195 scanf("%d",&con);
196 }while(con==1);
197 return 0;
198 }