<![CDATA[Latest posts for the topic "Vấn đề : Cộng hai số nguyên lớn !"]]> /hvaonline/posts/list/23.html JForum - http://www.jforum.net Vấn đề : Cộng hai số nguyên lớn ! /hvaonline/posts/list/6815.html#39528 /hvaonline/posts/list/6815.html#39528 GMT Re: Vấn đề : Cộng hai số nguyên lớn ! Code:
#include<stdio.h> 
#include<conio.h> 
#include<ctype.h> 
#include<string.h> 
int n1,n2,n; 
int s1[1000],s2[1000]; 
char s[1000]; 
void nhan(void); 
void main() 
{ 
  int i; 
 clrscr(); 
 printf("chuong trinh nhan so lon\n"); 
 printf("so thu nhat: "); 
 gets(s); 
 n1=strlen(s)-1; 
 for (i=0;i<=n1;i++) s1[n1-i]=s[i]-48; 
 printf("so thu hai: "); 
 gets(s); 
 n2=strlen(s)-1; 
 for (i=0;i<=n1;i++) s2[n2-i]=s[i]-48; 
 printf("\ntich la: "); 
 nhan(); 
 getch(); 
} 
void nhan(void) 
{ 
 int nho,i,bac,tich,j; 
 int tong[1000]={0},tg[1000]={0}; 
 int nmax,ntg; 
 n=0;bac=1;tich=1;nho=0;nmax=0; 
 for (j=0;j<=n2;j++) 
     { 
      bac=j; 
      for (i=0;i<=n1;i++) 
         { 
          tich=s1[i]*s2[j]+nho; 
          tg[i+bac]=tich%10; 
          nho=tich/10; 
         } 
      ntg=n1+bac; 
      while (nho) 
           { 
        ntg++; 
        tg[ntg]=nho%10; 
        nho/=10; 
           } 
      for (i=bac;i<=ntg;i++) 
         { 
          tong[i]+=tg[i]+nho; 
          nho=tong[i]/10; 
          tong[i]%=10; 
         } 
      while (nho) 
           { 
         ntg++; 
         tong[ntg]=tong[ntg]+nho%10; 
         nho=nho/10; 
           } 
      if (ntg>nmax) nmax=ntg; 
     } 
 for (i=nmax;i>=0;i--) printf("%d",tong[i]); 
}
Thân,]]>
/hvaonline/posts/list/6815.html#39569 /hvaonline/posts/list/6815.html#39569 GMT
Vấn đề : Cộng hai số nguyên lớn ! /hvaonline/posts/list/6815.html#39570 /hvaonline/posts/list/6815.html#39570 GMT Vấn đề : Cộng hai số nguyên lớn !

newbie_newbie wrote:
Các bạn ơi, cho mình hỏi cách làm bài này tí ! Mình muốn làm 1 bài cộng 2 số lớn thật là lớn ! Vậy, làm thế nào để lưu số lớn đó bây giờ ? Và khi nhập một số đầu vào rất lớn, làm thế nào để có thể nhận nó ? Nếu dùng kiểu chuỗi thì có thể ép sang kiểu int được ko ? Các bạn giúp mình với ! 
Về vấn đề cộng số lớn thì bạn phải nghĩ cách lưu được số lớn đó vào trong bộ nhớ. Vê lưu số lớn thì có 2 cách: bạn có thể dùng một mảng số nguyên hoặc dùng một xâu kí tự để lưu nó lại. ==> chính vì thế, khi nhập số lớn cái bạn nhập vào là một xâu kí tự (hoặc một mảng số nguyên). Ví dụ nhé: bạn định nhập vào số 1234 ==> bạn cần có một mảng ít nhất có 4 phần tử để lưu 1, 2, 3, 4 hoặc một string "1234"; Mỗi thằng có một lợi điểm riêng, như dùng mảng số nguyên thì không phải mất công chuyển đổi từ kiểu char sang int để tính toán, .. ==> cái này thì tùy vào khả năng của bạn. :mrgreen: Đó là việc lưu trữ. Còn về việc tính toán thì lúc này bạn có thể sử dụng cách nhân thủ công của ta: tức là cộng lần lượt từ phải sang trái, và có nhớ khi cộng. Ví dụ: 1234 + 3456 thì lấy 4 + 6 = 10, viết 0, nhớ 1, sau đó là 3 + 5 nhớ 1 là 9, viết 9 nhớ 0, cứ tương tự như vậy cho đến khi duyệt hết tất cả các phẩn tử của mảng (hoặc string). Sau đó in ra kết quả. Với các số lớn vượt quá kiểu của int (4 bytes) thì việc ép kiểu là không thể. (nguyên nhân rất đơn giản, nó sẽ làm tràn bộ nhớ của int). Thông thường với các bài toán số lớn, mình thường dùng một class số lớn, trong đó mình định nghĩa lại toàn bộ các toán tử +, -, *, / (giờ mới làm đến thế). Tốt nhất là khi dùng đến số lớn, thì bạn nên quên đi việc ép kiểu, bắt buộc xây dựng lại từ đầu. Đây mới chỉ là bài toán cộng 2 số dương. Bạn có thể mở rộng bài toán này cho các số nguyên và các phép tính khác. Thân]]>
/hvaonline/posts/list/6815.html#39617 /hvaonline/posts/list/6815.html#39617 GMT
Vấn đề : Cộng hai số nguyên lớn !

K4i wrote:
Về vấn đề cộng số lớn thì bạn phải nghĩ cách lưu được số lớn đó vào trong bộ nhớ. Vê lưu số lớn thì có 2 cách: bạn có thể dùng một mảng số nguyên hoặc dùng một xâu kí tự để lưu nó lại. ==> chính vì thế, khi nhập số lớn cái bạn nhập vào là một xâu kí tự (hoặc một mảng số nguyên). Ví dụ nhé: bạn định nhập vào số 1234 ==> bạn cần có một mảng ít nhất có 4 phần tử để lưu 1, 2, 3, 4 hoặc một string "1234"; Mỗi thằng có một lợi điểm riêng, như dùng mảng số nguyên thì không phải mất công chuyển đổi từ kiểu char sang int để tính toán, .. ==> cái này thì tùy vào khả năng của bạn. :mrgreen:  
Bạn có thể nói rõ hơn về cách xử lý dữ liệu đầu vào bằng cách dùng mảng không ? Ví dụ như mình nhập 1 số là 1234, vậy làm sao để có phần tử của mảng a như sau : a[0] là 4, a[1] là 3.... ? Vì nó là 1 số liền nhau mà ? VÀ theo cách thứ 2 mà bạn nói ! Làm thế nào để ép kiểu từ string sang int ?

K4i wrote:
Với các số lớn vượt quá kiểu của int (4 bytes) thì việc ép kiểu là không thể. (nguyên nhân rất đơn giản, nó sẽ làm tràn bộ nhớ của int). Thông thường với các bài toán số lớn, mình thường dùng một class số lớn, trong đó mình định nghĩa lại toàn bộ các toán tử +, -, *, / (giờ mới làm đến thế). Tốt nhất là khi dùng đến số lớn, thì bạn nên quên đi việc ép kiểu, bắt buộc xây dựng lại từ đầu. Thân 
Vì sao ko thể ép kiểu vậy bạn ? Vì ý tưởng của mình là nếu như nhập 1 số là 1234, thì mình sẽ dùng 1 mảng string để lưu trữ nó, như vậy, mình sẽ ép kiểu từng phần tử a[o] -> a[3] sang string ! như thế, sẽ ko làm trản bộ nhớ đúng ko bạn ? Không biết là ý tưởng của mình có thực hiện được không ? Mình chưa hiểu rõ ý bạn nói ? Cám ơn hai bạn nhiều lắm ! :) ]]>
/hvaonline/posts/list/6815.html#39647 /hvaonline/posts/list/6815.html#39647 GMT
Vấn đề : Cộng hai số nguyên lớn ! Bạn có thể nói rõ hơn về cách xử lý dữ liệu đầu vào bằng cách dùng mảng không ? Ví dụ như mình nhập 1 số là 1234, vậy làm sao để có phần tử của mảng a như sau : a[0] là 4, a[1] là 3.... ? Vì nó là 1 số liền nhau mà ? VÀ theo cách thứ 2 mà bạn nói ! Làm thế nào để ép kiểu từ string sang int ?   ==> đọc toàn bộ dữ liệu đầu vào là một string sau đó, convert từng thằng kí tự một sang kiểu int và gán vào mảng. :mrgreen: Còn cái ép kiểu. Mình không hiểu cái ép kiểu của bạn nghĩa là gì?
Vì sao ko thể ép kiểu vậy bạn ? Vì ý tưởng của mình là nếu như nhập 1 số là 1234, thì mình sẽ dùng 1 mảng string để lưu trữ nó, như vậy, mình sẽ ép kiểu từng phần tử a[o] -> a[3] sang string ! như thế, sẽ ko làm trản bộ nhớ đúng ko bạn ? Không biết là ý tưởng của mình có thực hiện được không ? Mình chưa hiểu rõ ý bạn nói ? Cám ơn hai bạn nhiều lắm ! :)  
Nhắc lại nhé: string là một mảng kí tự :mrgreen:, còn từng phần tử của nó vẫn là kiểu char và mình nghĩ bạn nên đọc lại cách biểu diễn số trong máy tính: tại sao nói kiểu int có 4 bytes, một số nguyên như int a = 3 được biểu diễn như thế nào trong máy tính (số nhị phân) và tại sao lại xuất hiện hiện tượng tràn bộ nhớ khi mà nhập một số quá lớn), bạn cũng nên đọc lại cách ép kiểu trong C/C++ nó là như thế nào. Bởi vì bạn chưa hiểu cách làm việc với số lớn: biểu diễn lại số đó theo cách mà mình hiểu và máy tính hiểu. Thân.]]>
/hvaonline/posts/list/6815.html#39690 /hvaonline/posts/list/6815.html#39690 GMT
Vấn đề : Cộng hai số nguyên lớn !

K4i wrote:
==> đọc toàn bộ dữ liệu đầu vào là một string sau đó, convert từng thằng kí tự một sang kiểu int và gán vào mảng. :mrgreen:  
Convert như thế nào bạn ? Hay bạn cho mình xin tài liệu nói về vấn đề này cũng được ! Sẵn tiện, bạn cho mình xin tài liệu về string, char với ! mình còn yếu về vấn đề này lắm ! Cám ơn bạn ! Chắc bài tập này lại để sang năm wá ! Hic hic ! Còn cái ép kiểu. Mình không hiểu cái ép kiểu của bạn nghĩa là gì? Còn nếu như với số nguyên quá lớn, làm thế nào để tạo một định nghĩa mới để lưu trữ số lớn hơn ? Cám ơn bạn nhiều ! :) ]]>
/hvaonline/posts/list/6815.html#39728 /hvaonline/posts/list/6815.html#39728 GMT
Vấn đề : Cộng hai số nguyên lớn ! http://www.swox.com/gmp/]]> /hvaonline/posts/list/6815.html#39921 /hvaonline/posts/list/6815.html#39921 GMT Vấn đề : Cộng hai số nguyên lớn ! /hvaonline/posts/list/6815.html#41950 /hvaonline/posts/list/6815.html#41950 GMT Vấn đề : Cộng hai số nguyên lớn !

newbie_newbie wrote:
Các bạn ơi, cho mình hỏi cách làm bài này tí ! Mình muốn làm 1 bài cộng 2 số lớn thật là lớn ! Vậy, làm thế nào để lưu số lớn đó bây giờ ? theo mình thì dùng chuỗi Và khi nhập một số đầu vào rất lớn, làm thế nào để có thể nhận nó ? Nếu dùng kiểu chuỗi thì có thể ép sang kiểu int được ko ?có thể ép chuỗi thành int dc, chỉ cần lấy mỗi ký tự trong chuỗi làm phép toán trừ cho số không là ok Các bạn giúp mình với ! 
đây là đoạn code mình viết cho bồ, có lẽ chưa gôd lắm nhưng cũng xài tạm dc :lol:) Code:
#include<string.h>
#include<stdio.h>
#include<conio.h>

#define  in "input_CONG.txt"
#define out "output.txt"
#define max 50

int n1,n2;//do dai cua 2 dai so nguyen
char s1[max],s2[max];//luu 2 dai so nguyen"output.txt"

void swap(char &a,char &b)
{
	char temp=a;
		a=b;
		b=temp;
}
void DaoChuoi()
{
	for(int i=0, j=n1-1; i<n1/2; i++,j--)
		swap(s1[i],s1[j]);
	for(i=0, j=n2-1; i<n2/2; i++,j--)
		swap(s2[i],s2[j]);

}
void nhap()
{
	FILE *f=fopen(in,"rt");
	fgets(s1,max,f); n1=strlen(s1);
		if(s1[n1-1]=='\n')	n1--;
	fgets(s2,max,f);  n2=strlen(s2);
		if(s2[n2-1]=='\n')	n2--;
	DaoChuoi();
	fclose(f);

}
void xuat()
{
	FILE *f=fopen(out,"wt");
	for(int i=n1-1; i>=0; i--)
		fprintf(f,"%c",s1[i]);
	fclose(f);
}
int max_so()
{
	if(n1>n2)
	{
		for(int k=n2; k<n1; k++)
			s2[k]='0';
		return n1;
	}
	else
		if(n1<n2)
		{
			for(int k=n1; k<n2; k++)
				s1[k]='0';
			return n2;
		}
		else
			return n1;

//	return n1>n2?n1:n2;
}
void cong()
{
	int nho=0;
	n1=max_so();
	for(int i=0; i<n1; i++)
	{
		int temp=(s1[i]-'0')+(s2[i]-'0')+nho;
		nho=temp/10;
		s1[i]=temp%10+'0';
	}
	if(nho==1)			s1[n1++]=nho+'0';
}
void main()
{
	nhap();
	cong();
	xuat();
}
]]>
/hvaonline/posts/list/6815.html#42206 /hvaonline/posts/list/6815.html#42206 GMT
Vấn đề : Cộng hai số nguyên lớn ! DaoChuoi()swap(). 2. Nên comment để cho mọi người dễ đọc và dễ hiểu bạn định làm cái gì :mrgreen:]]> /hvaonline/posts/list/6815.html#42264 /hvaonline/posts/list/6815.html#42264 GMT Vấn đề : Cộng hai số nguyên lớn ! /hvaonline/posts/list/6815.html#42425 /hvaonline/posts/list/6815.html#42425 GMT Vấn đề : Cộng hai số nguyên lớn !

hoangmac wrote:
cần thủ tục DaoChuoi() và thủ tục swap() chứ tớ đâu tạo thêm một chuỗi để lưu kq, tớ lưu thẳng lên s1. vì: n1<n2: (s1="6789" s2="56789")cậu ko thể cộng s1[n1]=s1[n1]+s2[n2] vì khi n1=0 thì n2=1 ko lẽ bỏ số đó. n1=n2: nho=1 thì lại chen nhó vào vtrí s1[0] phiền lắm tớ tiếc kiệm bộ nhớ nhưng làm cho ctrinh chạy ... chậm & rắc rối vô duyên :)) có lẽ tớ nên tạo thêm s3 để lưu kq thì code sẽ đơn giản hơn...thank vì đã góp ý vì đoạn code trên vô duyên wa nên khỏi comment 
Cậu thử nghĩ xem liệu có bỏ được không :?:) còn về lưu kết quả thì tốt nhất nên lưu ra một mảng mới là tốt nhất không nên để kết quả trùng lên biến cũ. Cậu sẽ hiểu tại sao lại thế khi cậu làm phép chia :). Còn việc xét số lớn nhỏ hơn thì không cần thiết nếu như cậu chỉ tập trung làm số dương, còn số âm thì cần đó. Điểm lưu ý khác, chương trình vô duyên hay không vô duyên thì chưa cần biết nhưng theo ý mình thì cậu nên tôn trọng người đọc bằng cách comment để cho người ta hiểu cậu đã làm cái gì thay vì đau đầu dịch lại code của cậu. Nó cũng chứng tỏ khả năng làm việc cẩn thận của cậu (tuy nhiên comment đừng quá dài dòng :)) :mrgreen: ]]>
/hvaonline/posts/list/6815.html#42788 /hvaonline/posts/list/6815.html#42788 GMT
Vấn đề : Cộng hai số nguyên lớn ! Cậu thử nghĩ xem liệu có bỏ được không còn về lưu kết quả thì tốt nhất nên lưu ra một mảng mới là tốt nhất không nên để kết quả trùng lên biến cũ. Cậu sẽ hiểu tại sao lại thế khi cậu làm phép chia :).   à, nếu có chuỗi s3 để lưu kq thì bỏ 2 thù tục kia dc
Còn việc xét số lớn nhỏ hơn thì không cần thiết nếu như cậu chỉ tập trung làm số dương, còn số âm thì cần đó. 
tớ chỉ xét chiều dài 2 số thôi
Điểm lưu ý khác, chương trình vô duyên hay không vô duyên thì chưa cần biết nhưng theo ý mình thì cậu nên tôn trọng người đọc bằng cách comment để cho người ta hiểu cậu đã làm cái gì thay vì đau đầu dịch lại code của cậu. Nó cũng chứng tỏ khả năng làm việc cẩn thận của cậu (tuy nhiên comment đừng quá dài dòng  
thừa nhận với bác là HOANGMAC rất cẩu thả, sẽ rút kinh nghiệm ]]>
/hvaonline/posts/list/6815.html#42897 /hvaonline/posts/list/6815.html#42897 GMT
Vấn đề : Cộng hai số nguyên lớn ! /hvaonline/posts/list/6815.html#43939 /hvaonline/posts/list/6815.html#43939 GMT Re: Vấn đề : Cộng hai số nguyên lớn ! /hvaonline/posts/list/6815.html#43976 /hvaonline/posts/list/6815.html#43976 GMT Re: Vấn đề : Cộng hai số nguyên lớn ! /hvaonline/posts/list/6815.html#47634 /hvaonline/posts/list/6815.html#47634 GMT Vấn đề : Cộng hai số nguyên lớn ! /hvaonline/posts/list/6815.html#49212 /hvaonline/posts/list/6815.html#49212 GMT Vấn đề : Cộng hai số nguyên lớn ! /hvaonline/posts/list/6815.html#223867 /hvaonline/posts/list/6815.html#223867 GMT Vấn đề : Cộng hai số nguyên lớn ! /hvaonline/posts/list/6815.html#280346 /hvaonline/posts/list/6815.html#280346 GMT