powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / длинная арифметика-деление дллинных чисел
1 сообщений из 1, страница 1 из 1
длинная арифметика-деление дллинных чисел
    #34241373
pharrell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток всем.У меня такая вот просьба,помогите дописать пожалуйста деление дллинных чисел.С другими действиями я более менее справился,а вот деление никак.Всем заранее большое спасибо!


Код: plaintext
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");
}
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / длинная арифметика-деление дллинных чисел
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]