Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Trang 2 của 2 Đầu tiênĐầu tiên 12
Kết quả 11 đến 20 của 20
  1. #11
    Ngày tham gia
    Feb 2014
    Bài viết
    0
    Hàm sqrt bắt buộc phải hoạt động trên số float/double, còn long sqrt(long) và họ hàng của chúng (Chỉ có từ C++11) cuối cùng cũng quy đổi về kiểu float hay double để tính sqrt.

    for trong sửa lại thành:

    Mã:
          for(j=i*i; j <= b; ++j) check[j]=0;

  2. #12
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi prog10
    Hàm sqrt bắt buộc phải hoạt động trên số float/double, còn long sqrt(long) và họ hàng của chúng (Chỉ có từ C++11) cuối cùng cũng quy đổi về kiểu float hay double để tính sqrt.

    for trong sửa lại thành:

    Mã:
          for(j=i*i; j <= b; ++j) check[j]=0;
    oh thanks
    Bạn có thể giải thích hộ minh là tại sao lại phải chạy từ i^2 không ?, với cả mình sửa như vậy nó không ra nhỉ ?, bạn xem mình sửa đúng chỗ chưa ?

    Mã:
    #include <iostream>#include <math.h>#include <memory.h>#define MAX 200000 using namespace std; main(){  short int check[MAX];  long a=1,b=MAX,i,j;  memset(check,1,sizeof(check));  check[1]=0;  //cin>>a>>b;  for (i=2; i<=sqrt(double(b)); i++)    if (check[i])      for (j=i*i; j<=b; ++j) check[j]=0; // chỗ này là check[i*j]=0 hay check[j]=0 hả bạn ?  for (i=a; i<=b; i++)    if (check[i]) cout<<i<<endl;}

  3. #13
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    đánh dấu check[k] = 0 với k = i.i, i(i+1), i(i+2), i(i+3), ..., i(b/i)
    gán thừa số phía sau i là j, k = i*j, thì j chạy từ i tới b/i, mỗi lần tăng 1 đơn vị (j là dãy {i, i+1, i+2, ..., b/i})



    hoặc viết k = i<sup>2</sup>, i<sup>2</sup> + i, i<sup>2</sup> + 2i, i<sup>2</sup> + 3i, ... k <= b để tránh phép nhân
    nhận thấy k là dãy {a<sub>0</sub>, a<sub>0</sub>+i, a<sub>1</sub>+i, a<sub>2</sub>+i, ..., a<sub>n-1</sub>+i}
    => k bắt đầu từ i<sup>2</sup>, mỗi lần k += i, chạy tới khi k <= b

  4. #14
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    ví dụ n = 1937:
    từ 1-9 có 9 số, mỗi số có 1 chữ số
    từ 10-99 có 90 số, mỗi số có 2 chữ số
    từ 100-999 có 900 số, mỗi số có 3 chữ số
    từ 1000-1937 có 938 số, mỗi số có 4 chữ số
    như vậy tổng cộng 1937 số từ 1 tới 1937 có ? chữ số
    lấy ? - 4 (+1) là ra kết quả...

  5. #15
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi INTP
    đánh dấu check[k] = 0 với k = i.i, i(i+1), i(i+2), i(i+3), ..., i(b/i)
    gán thừa số phía sau i là j, k = i*j, thì j chạy từ i tới b/i, mỗi lần tăng 1 đơn vị (j là dãy {i, i+1, i+2, ..., b/i})



    hoặc viết k = i<sup>2</sup>, i<sup>2</sup> + i, i<sup>2</sup> + 2i, i<sup>2</sup> + 3i, ... k <= b để tránh phép nhân
    nhận thấy k là dãy {a<sub>0</sub>, a<sub>0</sub>+i, a<sub>1</sub>+i, a<sub>2</sub>+i, ..., a<sub>n-1</sub>+i}
    => k bắt đầu từ i<sup>2</sup>, mỗi lần k += i, chạy tới khi k <= b
    Mình sửa là như thế này

    Mã:
    // Sang nguyen to dung C++#include <iostream>#include <memory.h>#define MAX 200000 using namespace std; main(){  //short int check[MAX];  // 1==true, 0==false  bool check[MAX];  long a=1,b=MAX,i,j;  memset(check,true,sizeof(check));  check[1]=false;  //cin>>a>>b;  for (i=2; i<=b; i++)    if (check[i])      for (j=i*i; j<=b; j+=i) check[j]=false;  for (i=a; i<=b; i++)    if (check[i]) cout<<i<<endl;}nó không chạy được là sao nhỉ ?

  6. #16
    Trích dẫn Gửi bởi INTP
    i ko cần chạy tới b. Nếu i chạy tới b thì j = i*i = 200k*200k = 4e10 thì quá lớn so với int. Thực ra là vào khoảng i = 2^16 thì j = i*i = 2^32 là check[j] nó trỏ tới hằng hà xa số nào rồi => lỗi

    i chạy tới sqrt(b) thôi. Thêm #include <cmath>
    oh thanks bác nhiều [IMG]images/smilies/smile.png[/IMG]
    mà cái cmath với math.h mìn nên dùng thằng nào nhỉ ?, 2 thư viện này có khác nhau nhiều gì không nhỉ ?

  7. #17
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    math.h là cho C, cmath là cho C++. 2 cái y hệt như nhau, chỉ khác chỗ cmath là thư viện math.h copy lại + cho thêm cái namespace std:: vô phía trước, gọi std::sqrt hoặc sqrt đều được. Trong math.h std::sqrt ko có thì phải :-?

  8. #18
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi INTP
    math.h là cho C, cmath là cho C++. 2 cái y hệt như nhau, chỉ khác chỗ cmath là thư viện math.h copy lại + cho thêm cái namespace std:: vô phía trước, gọi std::sqrt hoặc sqrt đều được. Trong math.h std::sqrt ko có thì phải :-?
    Cảm ơn các bác nhiều lắm, mình hiểu rồi [IMG]images/smilies/clap_grin.gif[/IMG]
    Ơ nhưng mà thế bên C,C++ không có cái hàm nào chuyển số sang kiểu string dễ hơn cái snprintf(s,79,"%ld",i); nữa hả các bác ?

  9. #19
    Ngày tham gia
    Dec 2015
    Bài viết
    0
    có cái sprintf(s,"%ld",i);

    =)

    s phải là mảng có chứa được tối thiểu 21 ký tự (+ký tự '\0') -> char s[24] là vừa.

  10. #20
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi INTP
    có cái sprintf(s,"%ld",i);

    =)

    s phải là mảng có chứa được tối thiểu 21 ký tự (+ký tự '\0') -> char s[24] là vừa.
    mình cóp trên mạng cái lệnh snprintf(s,79,"%ld",i); như thế thì cái 79 là cái gì đó bác ?, không cần cũng được hay phải có à bác ?, và tại sao phải là 79 ?

 

 
Trang 2 của 2 Đầu tiênĐầu tiên 12

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •