1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
[color=blue]
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<string.h>
#define maxlen 400
#define result 500
#define base 10
int a= 0 ,b= 0 ;
void menu_action()
{
printf("Addition -->'+'\n");
printf("Subtraction(!!!!! num_1 >= num_2 else error!!!!!!!)-->'-'\n");
printf("Multiplication -->'*'\n");
printf("Division -->'/'\n");
}
//чтение числа и переворачиваем его
int read_num(int ar[])
{
char ch;
int ar_temp[maxlen] = { 0 };
int j= 0 ,p= 0 ;
int i= 0 ;
while((ch=getchar()) >= '0' && ch <= '9')
ar_temp[i++]=(ch - '0');
p=i;
for(i=p- 1 ,j= 0 ;i>= 0 ,j<p;i--,j++)
{
ar[j]+=ar_temp[i];
printf("%d",ar[j]);
}
printf("\n%d\n", p);
return p;
}
//размер выводимого числа без лишних единиц
int size_num(int size_1,int size_2)
{
return (size_1>size_2)?size_1:size_2;
}
void write_num(int ar[], int size)
{
int i;
for(i = 0 ; i < size; i++)
printf("%d", ar[i]);
}
//вывод результата
void write_res(int ar[], int size)
{
int i;
for(i = size; i >= 0 ; i--)
printf("%d", ar[i]);
}
//Сравнение длинных чисел
int compare_bignum(int ar1[],int size1, int ar2[],int size2)
{
int i;
if (size2 > size1) return ( 1 );
if (size1 > size2) return ( 0 );
for (i = size1; i>= 0 ; i--) {
if (ar1[i] > ar2[i]) return( 0 );
if (ar2[i] > ar1[i]) return( 1 );
}
return( 0 );
}
//Определяем нулевые ли числа
int null(int ar_1[],int size_1)
{
int i= 0 ;
while(i<=size_1)
{
if(ar_1[i]== 0 )
{
i++;
}
else
return 1 ;
}
return 0 ;
}
//сложение
int add(int ar_1[],int ar_2[],int size,int add[])
{
int flag= 0 ;
int i,j,h= 0 ;
int tmp= 0 ;
for(i= 0 ,j= 0 ; i<=size&&j<=size ;i++,j++,h++)
{
tmp=ar_1[i]+ar_2[j]+flag;
if(tmp<base)
{
add[h]=tmp;
flag= 0 ;
}
else
{
add[h]=tmp-base;
flag= 1 ;
if((i >= j ? i : j) == size)
{
add[h]=flag;
h++;
}
}
}
return (h);
}
//вычитание
int sub(int ar_1[],int ar_2[],int size,int sub[])
{
int flag= 0 ;
int i,j,h= 0 ;
int tmp= 0 ;
for(i= 0 ,j= 0 ;i<=size&&j<=size ;i++,j++,h++)
{
tmp=ar_1[i]-ar_2[j]-flag;
if(tmp>= 0 )
{
sub[h]=tmp;
flag= 0 ;
}
else
{
sub[h]=base+tmp;
flag= 1 ;
}
}
return (h);
}
//умножение
int Mul(int ar_1[],int ar_2[],int size1,int size2,int res[])
{
int tmp= 0 ,carry= 0 ;
int i,j,h= 0 ;
for(j= 0 ;j<=size2;j++)
{
for(i= 0 ;i<=size1;i++,h++)
{
tmp=ar_1[i]*ar_2[j]+carry+res[i+j];
res[i+j]=tmp%base;
carry=tmp/base;
if(i==size1&&j==size2)
{
if(carry!= 0 )
{
res[i+j]=carry;
}
}
}
carry= 0 ;
}
return (h);
}
//умножение на короткое число
void SMul(int A[],int a,int d,int B[])
{
int tmp= 0 ,carry= 0 ;
int i,j= 0 ;
for(i= 0 ;i<=a- 1 ;i++)
{
tmp=A[i]*d+carry;
if(tmp<base)
{
B[j++]=tmp;
carry= 0 ;
}
else
B[j++]=tmp%base;
carry=tmp/base;
}
}
//деление
/*void Div_BIG(int A[],int a,int B[],int b,int Q[])
{
int U[a+1];
int u_size=a+1;
int vJ,uJ;
int qGuess=0,r;
int scale=0;
int i;
int carry=0,borrow=0;
int temp,temp1,temp2;
//U[]-временный мас. равный A с длинной на 1-цу больше
for(i=0;i<=a-1;i++)
{
U[i]=A[i];
}
scale=BASE/(B[b-1]+1);
if(scale>1)
{
SMul(U,a+1,scale,U);
SMul(B,b-1,scale,B);
}
for(vJ=b-1,uJ=a+vJ-1;vJ>=0;--vJ,--uJ)
{
qGuess=(U[uJ]*base+U[uJ-1])/B[b-1];
r=(U[uJ]*base+U[uJ-1])%B[b-1];
while(r<base){
temp2=B[b-2]*qGuess;
temp1=r*base+U[uJ-2];
if((temp2>temp1)||(qGuess==base)) {
--qGuess;
r+=B[b-1];
}
else break;
}
int *uShift=U+vJ;
for(i=0;i<b;i++) {
temp1=B[i]*qGuess+carry;
carry=temp1/base;
temp1-=carry/base;
temp2=uShift[i]-temp1+borrow;
if(temp2<0){
uShift[i]=temp2;
borrow=0;
}
}
temp2=uShift[i]-carry+borrow;
if(temp2<0) {
uShift[i]=temp2+base;
borrow=-1;
}else{
uShift[i]=temp2+base;
borrow=0;
}
if(borrow==0) {
Q[vJ]=qGuess-1;
carry=0;
for(i=0;i<b;i++) {
temp=uShift[i]+B[i]+carry;
if(temp>=base) {
uShift[i]=temp-base;
carry=1;
}else{
uShift[i]=temp;
carry=0;
}
}
uShift[i]=uShift[i]+carry-base;
i=u_size-1;
while((i>0)&&(U[i]==0)) i--;
u_size=i+1;
}
}
}
*/
void main()
{
int a= 0 ,b= 0 ,h= 0 ;
int i= 0 ,j= 0 ,k= 0 ;
int k1= 0 ,k2= 0 ;
int num_1[maxlen] = { 0 };
int num_2[maxlen] = { 0 };
int res[result] = { 0 };
int div[result] = { 0 };
int size= 0 ,size_res= 0 ;
int tmp= 0 ;
char sig;
int carry= 0 ;
//---------------------------------------------
//ввод операндов
menu_action();//операции программы для больших чисел
a=read_num(num_1);
write_num(num_1,a);
//-------------------------
printf("\n");
b=read_num(num_2);
write_num(num_2,b);
//-------------------------
size=size_num(a,b);
//_______________________________________
printf("\nEnter mathematical action:");
scanf("%c",&sig);
switch(sig)
{
//----------------------------------------------------
case '+':
k1=null(num_1,a);
k2=null(num_2,b);
if(k1== 1 ||k2== 1 )
{
i=add(num_1,num_2,size,res);;
while(res[i]== 0 ) i--;
size_res=i;
printf("\n\n\nresultat:");
write_res(res,size_res);
}
else
printf("resultat:0");
break;
//----------------------------------------------------
case '-':
compare_bignum(num_1,a,num_2,b);
if(k== 1 )
{
printf("error!!!\n");
getch();
exit( 1 );
}
i=sub(num_1,num_2,size,res);
if((k=null(res,i))== 0 )
{
printf("resultat:0");
break;
}
while(res[i]== 0 ) i--;
size_res=i;
printf("resultat:");
write_res(res,size_res);
break;
//----------------------------------------------------
case '*':
k1=null(num_1,a);
k2=null(num_2,b);
if(k1== 0 ||k2== 0 )
{
printf("resultat:0");
break;
}
i=Mul(num_1,num_2,a,b,res);
while(res[i]== 0 ) i--;
size_res=i;
write_res(res,size_res);
break;
//----------------------------------------------------------
// case '/':
/*scanf("%d",&d);
SMul(num_1,a,d,res);
i=a+1;
while(res[i]==0) i--;
size_res=i;
printf("resultat:");
write_res(res,size_res);
break;*/
default:
printf("ERROR");
break;
}
printf("\n");
}