-
02-06-2014, 05:16 PM #11
Administrator
- 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;
-
02-06-2014, 05:26 PM #12
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi prog10
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;}
-
02-06-2014, 05:42 PM #13
Junior Member
- 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
-
02-06-2014, 06:00 PM #14
Silver member
- 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ả...
-
03-06-2014, 08:16 AM #15
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi INTP
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ỉ ?
-
03-06-2014, 04:05 PM #16
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi INTP
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ỉ ?
-
03-06-2014, 04:22 PM #17
Junior Member
- 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 :-?
-
03-06-2014, 04:36 PM #18
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi INTP
Ơ 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 ?
-
04-06-2014, 05:07 PM #19
Junior Member
- 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.
-
04-06-2014, 07:06 PM #20
Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Gửi bởi INTP
khi đề cập đến đội hình MU, không thể ko nói tới một trong các câu lạc bộ bóng đá huyền thoại và với tầm ảnh hưởng nhất trong lịch sử của môn thể thao vua. Với hơn 1 thế kỷ còn đó và phát triển,...
Đội hình MU - Manchester United:...