Lập trình, thuật toán
Bạn có muốn phản ứng với tin nhắn này? Vui lòng đăng ký diễn đàn trong một vài cú nhấp chuột hoặc đăng nhập để tiếp tục.


Lập trình C/C++, java. Thuật toán
 
Trang ChínhLatest imagesTìm kiếmĐăng kýĐăng Nhập
Đăng Nhập
Tên truy cập:
Mật khẩu:
Đăng nhập tự động mỗi khi truy cập: 
:: Quên mật khẩu
Tìm kiếm
 
 

Display results as :
 
Rechercher Advanced Search
Latest topics
» Thông báo offline lần 1
Bài tập tuần 1 của Hưng cùi bắp I_icon_minitimeWed Dec 07, 2011 12:16 pm by dinhha

» Chưa hiểu rõ đề CONANSP và FSOFT
Bài tập tuần 1 của Hưng cùi bắp I_icon_minitimeMon Dec 05, 2011 1:53 pm by dinhha

» Thuật toán qui hoạch động (Dynamic programing)
Bài tập tuần 1 của Hưng cùi bắp I_icon_minitimeSun Dec 04, 2011 6:21 pm by letrongngoc

» Khởi động lại nào!
Bài tập tuần 1 của Hưng cùi bắp I_icon_minitimeThu Dec 01, 2011 11:54 am by TrungHieu11

» Bài tập tuần 1 của Hưng cùi bắp
Bài tập tuần 1 của Hưng cùi bắp I_icon_minitimeMon Nov 07, 2011 10:37 pm by TrungHieu11

» Codeforces Beta Round #93
Bài tập tuần 1 của Hưng cùi bắp I_icon_minitimeSat Nov 05, 2011 12:23 am by TrungHieu11

» Mở thêm thư mục "Các môn học ở trường"
Bài tập tuần 1 của Hưng cùi bắp I_icon_minitimeThu Nov 03, 2011 3:05 pm by TrungHieu11

» code bài 1
Bài tập tuần 1 của Hưng cùi bắp I_icon_minitimeMon Oct 31, 2011 7:42 pm by TrungHieu11

» Báo cáo lý lịch
Bài tập tuần 1 của Hưng cùi bắp I_icon_minitimeMon Oct 31, 2011 6:39 pm by fallinlove2011

Top posters
TrungHieu11
Bài tập tuần 1 của Hưng cùi bắp I_vote_lcapBài tập tuần 1 của Hưng cùi bắp I_voting_barBài tập tuần 1 của Hưng cùi bắp I_vote_rcap 
fallinlove2011
Bài tập tuần 1 của Hưng cùi bắp I_vote_lcapBài tập tuần 1 của Hưng cùi bắp I_voting_barBài tập tuần 1 của Hưng cùi bắp I_vote_rcap 
dinhha
Bài tập tuần 1 của Hưng cùi bắp I_vote_lcapBài tập tuần 1 của Hưng cùi bắp I_voting_barBài tập tuần 1 của Hưng cùi bắp I_vote_rcap 
thenguyen27192
Bài tập tuần 1 của Hưng cùi bắp I_vote_lcapBài tập tuần 1 của Hưng cùi bắp I_voting_barBài tập tuần 1 của Hưng cùi bắp I_vote_rcap 
liveislife
Bài tập tuần 1 của Hưng cùi bắp I_vote_lcapBài tập tuần 1 của Hưng cùi bắp I_voting_barBài tập tuần 1 của Hưng cùi bắp I_vote_rcap 
lovestorm_6390
Bài tập tuần 1 của Hưng cùi bắp I_vote_lcapBài tập tuần 1 của Hưng cùi bắp I_voting_barBài tập tuần 1 của Hưng cùi bắp I_vote_rcap 
lehonghoa
Bài tập tuần 1 của Hưng cùi bắp I_vote_lcapBài tập tuần 1 của Hưng cùi bắp I_voting_barBài tập tuần 1 của Hưng cùi bắp I_vote_rcap 
letrongngoc
Bài tập tuần 1 của Hưng cùi bắp I_vote_lcapBài tập tuần 1 của Hưng cùi bắp I_voting_barBài tập tuần 1 của Hưng cùi bắp I_vote_rcap 

 

 Bài tập tuần 1 của Hưng cùi bắp

Go down 
Tác giảThông điệp
TrungHieu11
Admin
Admin
TrungHieu11


Tổng số bài gửi : 52
Points : 102
Danh tiếng : 6
Join date : 15/10/2011
Đến từ : Đại học Công Nghiệp Tp.HCM

Bài tập tuần 1 của Hưng cùi bắp Empty
Bài gửiTiêu đề: Bài tập tuần 1 của Hưng cùi bắp   Bài tập tuần 1 của Hưng cùi bắp I_icon_minitimeMon Nov 07, 2011 10:37 pm

Tình hình là Hưng có gửi các bạn 3 bài tập (download tại đây: [You must be registered and logged in to see this link.] ). Hôm nay mình sẽ giải 3 bài này (theo yêu cầu của bạn Hồng Hoa Razz )

Bài 1:
Thuật toán: Bài này các bạn không thể viết xâu ra vì làm vậy sẽ ko thể chứa hết các số với trường hợp n = 2^32 - 1. Ta sẽ có 1 nhận xét đơn giản như sau, ta có xâu s:
s = 110100100010000100000 với các vị trí có giá trị bằng 1 lần lượt là:
0 1 3 6 10 15 21
tương ứng với:
0 = 0
1 = 0 + 1
3 = 0 + 1 + 2
6 = 0 + 1 + 2 + 3
v.v...
Tới đây mình nghĩ các bạn cũng đã nghĩ ra thuật toán rùi @

Source:
Code:
int main(){
   //freopen ("INP.txt", "r", stdin);
   int n;
   SC(n);
   for (int i = 1; n >= i; i++) n -= i;
   if (n == 0) PRS("1");
   else PRS("0");
}

Bài 2: bài này bạn thenguyen27192 đã code bằng java tại [You must be registered and logged in to see this link.] các bạn có thể tham khảo.

Bài 3: Đây là bài xử lí số lớn có rất nhiều ứng dụng sau này.

Thuật toán:
Cộng 2 số lớn: tất nhiên là chúng ta không thể cộng thông thường được rùi vì số A và B có đến 10000 chữ số trong khi long long trong C/C++ chỉ hổ trợ đến 18 chữ số nên chúng ta sẽ có 1 thuật toán như sau:

VD ta muốn cộng 2 số sau đây:
9283475923845
192834921348

ta sẽ chia 2 số trên ra thành các nhóm 3 số:
9 283 475 923 845
192 834 921 348

sau đó sẽ cộng lần lượt các nhóm 3 số đó lại kết quả sẽ là:
9 476 310 845 193

Source: (đây là bài cải tiến mới nhất của mình, có lẽ các bạn đọc ko hiểu vì mình dùng các kĩ thuật lập trình mới nhất ở trong code này, nhưng ý tưởng vẫn không có gì thay đổi)
Code:
#define e 1000

vi a, b, cong, tru, nhan;
string s1, s2;

void Xuli(string s, vi &A){
   string m;
   while (s.size() % 3) s = "0" + s;
   int j = s.size() - 1;
   while (j >= 0){
      m = "";
      m = m + s[j - 2] + s[j - 1] + s[j];
      j -= 3;
      A.PB(toInt(m));
   }
}

string Exchange(vi C){
   string ds, s;
   ds = "";
   FORN (i, 0, C.size()){
      s = toString(C[i]);
      while (s.size() % 3) s = "0" + s;
      ds = s + ds;
   }
   while (ds.size() > 1 && ds[0] == '0') ds.erase(0, 1);
   return ds;
}

string Plus(vi A, vi B){
   int du = 0;
   FORN (i, 0, A.size()){
      du += A[i] + B[i];
      cong.PB(du % e);
      du /= e;
   }
   if (du > 0) cong.PB(du);
   return Exchange(cong);
}

string Subtract(vi A, vi B){
   int du = 0;
   bool smaller = false;
   if (s1.size() < s2.size() || (s1.size() == s2.size() && s1 < s2)){
      smaller = true;
      swap(A, B);
   }
   FORN (i, 0, A.size()){
      A[i] -= du;
      if (A[i] < B[i]) A[i] += e, du = 1;
      else du = 0;
      tru.PB(A[i] - B[i]);
   }
   string kq = Exchange(tru);
   if (smaller) kq = "-" + kq;
   return kq;
}

string Multi(vi A, vi B){
   int du = 0;
   int T[2005];
   RESET(T, 0);
   FORN (i, 0, A.size())
      FORN (j, 0, B.size())
         T[i + j] += A[i] * B[j];
   FORN (i, 0, A.size() + B.size()){
      du = T[i] + du;
      nhan.PB(du % e);
      du /= e;
   }
   if (du) nhan.PB(du);
   return Exchange(nhan);
}

int main(){
   //freopen ("INP.txt", "r", stdin);
   cin >> s1 >> s2;
   Xuli(s1, a);
   Xuli(s2, b);
   while (a.size() < b.size()) a.PB(0);
   while (a.size() > b.size()) b.PB(0);
   cout << Plus(a, b) << endl;
   cout << Subtract(a, b) << endl;
   cout << Multi(a, b) << endl;
}
Về Đầu Trang Go down
https://olphui.forumvi.com
 
Bài tập tuần 1 của Hưng cùi bắp
Về Đầu Trang 
Trang 1 trong tổng số 1 trang

Permissions in this forum:Bạn không có quyền trả lời bài viết
Lập trình, thuật toán :: Problems :: Other problems-
Chuyển đến