mọi người cho em hỏi ý tưởng (chi tiết) về phép cộng 2 số siêu lớn được không ạ (nếu được cho em xin code để nhập 2 số đó dùng kiểu struct)!! em cảm ơn!!
Cộng hai số siêu lớn
Bạn chuyển 2 số thành 2 chuỗi, lấy từng ký tự trong mỗi chuỗi từ phải sang trái, chuyển ký tự thành số rồi cộng lại, nếu có dư thì cộng vào số kế tiếp y như phép cộng.
4 Likes
biginteger and bigdecimal
2 Likes
klq, số lớn và số siêu lớn khác nhau chỗ nào nhỉ? 
3 Likes
Hi Văn Hiếu.
Nếu bạn làm nghiên cứu thì hãy tìm hiểu các bài báo hoặc các tài liệu được cấp trước. Có vấn đề về lập trình thuật toán thì mọi người có thể giúp chứ đừng lên hỏi như vậy. Còn nếu chỉ áp dụng thì có không ít thư viện mã nguồn mở cho cái này bạn có thể tự tìm.
3 Likes
#include <stdio.h>
#include <string.h>
#include <math.h>
struct bignum
{char num[100];
}
bignum[100];
void chuanA(char a[100], char b[100])
{ int k,i;
k=strlen(b)-strlen(a);
while(strlen(a)<strlen(b))
{for(i=strlen(a);i>=0;i--)
{a[i+1]=a[i];}}
for(i=0;i<=k-1;i++)
{a[i]='0';}
}
void chuanB(char a[100], char b[100])
{ int k,i;
k=strlen(a)-strlen(b);
while(strlen(b)<strlen(a))
{for(i=strlen(a);i>=0;i--)
{b[i+1]=b[i];}}
for(i=0;i<=k-1;i++)
{b[i]='0';}
}
void ketqua(char a[100], char b[100])
{int c[100];
int i,k,carry;
if(strlen(a)<strlen(b))
{chuanA(a,b);}
if(strlen(a)>strlen(b))
{chuanB(a,b);}
k= strlen(a)-1;
carry=0;
for(i=strlen(a)-1;i>=0;i--)
{a[i]=a[i]-'0';
b[i]=b[i]-'0';
c[i]=a[i]+b[i]+carry;
if(c[0]>=10)
{c[i]=c[0];
break;}
carry=c[i]/10;
c[i]=c[i]%10;
}
for(i=0;i<=k;i++)
{printf("%d",c[i]);}}
int main()
{ int n,i,c[100];
//printf("n=");
scanf("%d",&n);
for (i=1;i<=2*n;i=i+2)
{scanf("%s",&bignum[i].num);
scanf("%s",&bignum[i+1].num);
if(strlen(bignum[i].num)<strlen(bignum[i+1].num))
{chuanA(bignum[i].num,bignum[i+1].num);}
if(strlen(bignum[i].num)>strlen(bignum[i+1].num))
{chuanB(bignum[i].num,bignum[i+1].num);}}
//printf("KETQUA\n");
for (i=1;i<=2*n;i=i+2)
{ketqua(bignum[i].num , bignum[i+1].num);
printf("\n");}
getch();
return(0);}
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?