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


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