Giúp em làm bài này với, tưởng dễ nhưng đến lúc làm thì nó lu bu nhiều cái :shock::shock: .Thank !!
PS: ý của em thế này : n = 3 => 2 3 5
n = 5 => 2 3 5 7 11 . Làm trên C nha ( em mới học xong cái hàm thui
)
Giúp em làm bài này với, tưởng dễ nhưng đến lúc làm thì nó lu bu nhiều cái :shock::shock: .Thank !!
PS: ý của em thế này : n = 3 => 2 3 5
n = 5 => 2 3 5 7 11 . Làm trên C nha ( em mới học xong cái hàm thui
)
Cách 1: Em lập hàm bool isPrime(int x), nhận vào x, return true nếu x là ngtố, false nếu x ko là nguyên tố
xong
for (i = 2,soNguyenToDaXuat = 0;soNguyenToDaXuat < n;++i)
if (isPrime(x) == true)
{
++soNguyenToDaXuat; //nên đặt tên biến khác ngắn gọn hơn
//in i ra màn hình
}
Cách 2: Em lên mạng search wiki bài: sàng số nguyên tố, xong chuyển qua wiki tiếng anh, có tấm hình thuật toán mô phỏng
(cách này code nhiều hơn 1 chút, nhưng chạy nhanh hơn). Đây là gợi ý thôi, anh không tìm giúp cho đâu.
Cách của anh:
Dùng 1 mảng để chứa n số nguyên tố mà e nói:
1 số là số nguyên tố sẽ không chia hết cho các số nguyên tố bé hơn hoặc = căn bậc hai của nó.
Như vậy thì mảng đầu của ta là 2, số tiếp theo là 3 vì 3 ko chia hết cho 2, số tiếp là 5 vì không chia hết cho 2, số tiếp là 7 vì không chia hết cho 2, số tiếp là 11 vì không chia hết cho 2 và 3. Cứ z thôi ;))
Code C
Đây là code đầy đủ tự tối ưu code lại nhé…
#include <stdio.h>
#include <conio.h>
int Ngto(int n)
{
int i;
for(i=2;i<n;i++)
{
if(n%i==0)
{
break;
}
}
if(i==n)
return 1;
return 0;
}
void main()
{
int n;
printf("
n = ");scanf("%d",&n);
int dem = n;
for(int i=2;i<100;i++)
{
if(Ngto(i))
{
printf("%4d",i);
dem--;
}
if(dem==0)
break;
}
getch();
}
[QUOTE=12520333;170949]Giúp em làm bài này với, tưởng dễ nhưng đến lúc làm thì nó lu bu nhiều cái :shock::shock: .Thank !!
PS: ý của em thế này : n = 3 => 2 3 5
n = 5 => 2 3 5 7 11 . Làm trên C nha ( em mới học xong cái hàm thui
)[/QUOTE]
Xem thử dc chưa nhé.
#include <stdio.h>
#include <math.h>
int ktSNT (int n)
{
if (n<2) return 0;
for (int i=2,temp=int(sqrt(double(n))); i<=temp; i++)
if (n%i==0) return 0;
return 1;
}
int main (int N)
{
printf("N= ");
scanf("%d", &N);
for(int i= 2, c = 0; c < N; i++)
{
if(ktSNT(i) == 1)
{
printf("N[%d]= %d ", c, i);
c++;
}
}
return 0;
}
[QUOTE=12520333;170949]Giúp em làm bài này với, tưởng dễ nhưng đến lúc làm thì nó lu bu nhiều cái :shock::shock: .Thank !!
PS: ý của em thế này : n = 3 => 2 3 5
n = 5 => 2 3 5 7 11 . Làm trên C nha ( em mới học xong cái hàm thui
)[/QUOTE]
Em có thể tham khảo bài này nhé. Trước tiên muốn in ra n số nguyên tố đầu tiên thì em cần có hàm kiểm tra số i có phải là 1 số NT hay không. Nếu là 1 số NT thì sẽ in ra và tăng giá trị biến đếm count_SNT lên 1 đơn vị. Nếu count_SNT bằng với số N thì nghĩa là đã in đủ N số NT đầu tiên, khi đó ta sẽ break ra khỏi vòng lặp và kết thúc chương trình.
#include "stdio.h"
bool SNT(int x)
{
int i;
if (x <= 1)
return false;
for (i = 2; i <= x/2; ++i)
if (x % i == 0)
return false;
return true;
}
int main()
{
int n, count_SNT;
int i;
do
{
printf("
Nhap vao so N (N > 0): N = ");
scanf("%d", &n);
} while (n <= 0);
i = 2;
count_SNT = 0;
while (true)
{
if (SNT(i))
{
printf("%d ", i);
++count_SNT;
}
++i;
if (count_SNT == n)
break;
}
return 0;
}
t cũng làm y như Quý, khác 1 chỗ là while(count_SNT<n) :D, khỏi phải break, mệt ![]()
[QUOTE=10520303;170982]Đây là code đầy đủ tự tối ưu code lại nhé…
#include <stdio.h>
#include <conio.h>
int Ngto(int n)
{
int i;
for(i=2;i<n;i++)
{
if(n%i==0)
{
break;
}
}
if(i==n)
return 1;
return 0;
}
void main()
{
int n;
printf("
n = ");scanf("%d",&n);
int dem = n;
for(int i=2;i<100;i++)
{
if(Ngto(i))
{
printf("%4d",i);
dem--;
}
if(dem==0)
break;
}
getch();
}
[/QUOTE]
Cảm ơn mấy anh đã trợ giúp: bài này khá dễ hiểu dành cho gà như em đc và code của anh Thành Trung thì ngắn nhưng khó hỉu đoi chút (đang mò…)
[QUOTE=11520086;170995]t cũng làm y như Quý, khác 1 chỗ là while(count_SNT<n) :D, khỏi phải break, mệt :D[/QUOTE]
Mình làm cho người khác hiểu nữa mà, làm cho rõ nghĩa. Cách của Duyệt xa xỉ quá ![]()
[QUOTE=12520333;171015]…code của anh Thành Trung thì ngắn nhưng khó hỉu đoi chút (đang mò…)[/QUOTE] =)) gộp nên khó hiểu đó. code mấy sư huynh sử tỉ kia là ghi rời ra.:dreaming: code a.thành là i là số chạy kiểm tra số đó phải ko(SNT)! còn c là biến đếm
[QUOTE=10520303;170982]Đây là code đầy đủ tự tối ưu code lại nhé…
#include <stdio.h>
#include <conio.h>
int Ngto(int n)
{
int i;
for(i=2;i<n;i++)
{
if(n%i==0)
{
break;
}
}
if(i==n)
return 1;
return 0;
}
void main()
{
int n;
printf("
n = ");scanf("%d",&n);
int dem = n;
for(int i=2;i<100;i++)
{
if(Ngto(i))
{
printf("%4d",i);
dem--;
}
if(dem==0)
break;
}
getch();
}
[/QUOTE]
cho em hỏi cái chỗ return 1 và return 0 nó là như thế nào, em chưa hiểu rõ về return lắm… may anh giai thich dùm em với ( hình như return 1 là khi lệnh đúng phải ko ạ) Thank !!
:unhappy:
#include "iostream"
using namespace std;
int checknt(int x)
{
int k=0;
if(x<2) return 0;
else
for(int i=2;i<=sqrtf(x);i++)
if(x%i==0)
k++;
if(k==0)
return 1;
return 0;
}
void main()
{
int n,a=0;
cout<<"Nhap n: ";cin>>n;
for(int i=2;a<n;++i)
if(checknt(i)==1)
{
a++;//điều kiện dừng
cout<<i<<" ";
}
system("pause");
}
Trong 1 điều kiện if thì:
if(xzy)
return 1;
return 0;
đồng nghĩa vs
if(xyz)
return 1;
else
return 0;
viết như vậy khỏi phải viết lại else…
còn return là để trả về giá trị đúng kiểu trả về (int checknt() sẽ trả về kiểu int - bắt buộc phải return ).
có hàm ko có kiểu trả về, ngược lại sẽ bắt buộc trả về…
return 0; trả về giá trị false
return 1; trả về giá trị true…
#include "iostream"
using namespace std;
int checknt(int x)
{
int k=0;
if(x<2) return 0;
else
for(int i=2;i<=sqrtf(x);i++)
if(x%i==0)
k++;
if(k==0)
return 1;
return 0;
}
void main()
{
int n,a=0;
cout<<"Nhap n: ";cin>>n;
for(int i=2;a<n;++i)
if(checknt(i)==1)
{
a++;//điều kiện dừng
cout<<i<<" ";
}
system("pause");
}
[/QUOTE]
cái này C++ mà anh… đang học C nên nhìn hơi trừu tượng @@!
[QUOTE=11520009;171073]Trong 1 điều kiện if thì:
if(xzy)
return 1;
return 0;
đồng nghĩa vs
if(xyz)
return 1;
else
return 0;
viết như vậy khỏi phải viết lại else…
còn return là để trả về giá trị đúng kiểu trả về (int checknt() sẽ trả về kiểu int - bắt buộc phải return ).
có hàm ko có kiểu trả về, ngược lại sẽ bắt buộc trả về…
return 0; trả về giá trị false
return 1; trả về giá trị true…[/QUOTE]
vậy là cái return 0; là của if(i==n) chứ ko phải của int nguyento(int n) hả anh ???
Bài này bữa có trên vòng loại cuộc thi thuật toán.
#include <stdio.h>
int main()
{
long int n,i,j,k;
n=500;// số số nguyên tố cần in (max 5 600k gì đó )
long int m[n];
for (i=3,k=0,m[0]=2;k<n;++i)
for (j=0;;++j)
{
if (m[j]*m[j]>i)//số nguyên tố là số không chia hết cho snt < sqrt của nó.
{
m[++k]=i;
printf("%10d",i);
break;
}
if (i%m[j]==0) break;//số nguyên tố là số không chia hết cho snt < sqrt của nó.
}
}
tham khảo cái này xem ![]()
#include "conio.h"
#include "stdio.h"
int ktsnt(int n)
{
if(n<2) return 0;
for(int i=2; i<=n/2;i++)
{
if(n%i==0) return 0;
}
return 1;
}
void main()
{
int n,k=0;
printf("nhap n=");
scanf("%d",&n);
for (int i=2;k<n;i++)
{
if(ktsnt(i))
{
k++;
printf("%d ",i);
}
}
getch();
}
như nè dùng C free thì chạy OK nhưng dùng VS thì báo lỗi này
on6.cpp(14): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
#include<stdafx.h>
#include<stdio.h>
#include<conio.h>
int lsnt(int n)
{
int i=2;
if(n<2) return 0;
if(n==2) return 1;
for(;i*i<=n;i++)
if(n%i==0) return 0;
return 1;
}
main()
{
int i,k=2,dem=0,n;
printf("nhap a ");scanf("%d",&n);
while(dem<n)
{
if(lsnt(k))
{
printf("%d
",k);
dem++;
}
k++;
}
}
[QUOTE=12520037;171540]
#include<stdio.h>
#include<conio.h>
int lsnt(int n)
{
;
if(n<2) return 0;
if(n==2) return 1;
for(int i=2;(i*i)<=n;i++)
if(n%i==0) return 0;
return 1;
}
}
[/QUOTE]
bạn thử cái này xem
dạ cho em hởi nếu bài này dùng đệ quy thì làm như thế nào ?