PDA

View Full Version : Lập trình số học | Các thao tác trên số nguyên.


PoPoPoPo
09-10-2006, 10:46 AM
Đây là bài các thao tác trên số nguyên:

#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
//========================================
void Doicoso(int n,int b)
{
int s[10],o,j,i=0,k=0;
printf("\nNhap mot so he co so 10(Dec) n=");scanf("%d",&n);
printf("\nNhap co so can chuyen sang (b code): b=");scanf("%d",&b);
o=n;
while(n!=0)
{
k=n%b;n=n/b;
if(0<=k && k<=9) s[i++]= 48+k;
else
s[i++]=(65+k-10);

}//end while
printf("\n\nKet qua la:%d(dec) chuyen sang %d(code) la:",o,b);
for(j=i-1;j>=0;j--)
printf("%c",s[j]);
}//end function
//================================================== ============
//Kiem tra 1 so co phai la 1 so nguyen to hay khong?
int NguyenTo(long x)
{
long i,t=0;
for(i=2;i<=sqrt(x);i++)
{
if(x%i==0) { t=0;break;}
else t=1;
}//end for
return(t);
}//end function
//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
void DayNguyenTo(long n)
{
long i;
for(i=2;i<=n;i++)
{
if(NguyenTo(i)) printf("%5ld",i);
}//end for
}//end function
//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\
void Messon(long n)
{
long i;
for(i=2;i<=n;i++)
{
if(NguyenTo(pow(2,i)-1)) printf("%5ld",i);
}
}
//================================================== =======
void so_hoan_thien()
{
unsigned long s,n,i,j;
printf("\nNhap so N = ");
scanf("%ld",&n);
for(i=2;i<=n;i++)
{
s=0;
for(j=1;j<i;j++)
if(i%j==0) s=s+j;
if(s==i)printf("\n%ld",s);
}
//getch();
}
//================================================== ======
void cap_so_huu_nghi()
{
unsigned long s1,s2,n,m,k,i,j;
printf("\nNhap so N = ");
scanf("%ld",&n);
for(i=2;i<=n;i++)
{
s1=0;
for(k=1;k<=i/2+1;k++)
if(i%k==0) s1+=k;
for(j=2;j<=i;j++)
{
s2=0;
for(m=1;m<=j/2+1;m++)
if(j%m==0) s2+=m;
if(s1==j && s2==i) printf("\n (%ld,%ld)",i,j);

}
}
}
//================================================== =======
void paliom()
{

unsigned long n,i,j;
int dem;
char s[12];
dem=0;
printf("\nNhap N : ");
scanf("%ld",&n);
printf("Cac so palidrom nho hon %d la : ",n);
for(i=1;i<=n;i++)
{
ltoa(i,s,10);
strrev(s);
j=atol(s);
if(i==j)
{
printf("\n%d",i);
dem++;
if(dem%20==0)
getch();
}
}
}
//=================================================
void main()
{
long n;
int b;
clrscr();
textmode(C80);
textcolor(YELLOW);
textbackground(BLUE);
window(1,1,80,25);

while(1)
{clrscr();

printf("\n Tap thao t*c voi So Nguyˆn") ;
printf("\nÞÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜÜ ÜÜÜÝ");
printf("\n\n Menu\nÈÍÍÍͼ");
printf("\n1. Doi so N thanh so o he co so bat ki bó16");
printf("\n2. Liet ke ca so Nguyen To ó n");
printf("\n3. Liet ke cac so Messon ó n");
printf("\n4. Liet ke cac so hoan thien ó n");
printf("\n5. Liet ke cac cap so huu nghi ó n");
printf("\n6. Liet ke cac so Paliom ó n");
printf("\nz. Tro ve MENU ch¡nh");
printf("\n\nHay chon chuc nang 1 -> z: ");
char ch1=toupper(getchar());
if(ch1=='Z') break;
switch(ch1)
{
case '1':
printf("\n\n============================\n\n");
printf("DOI 1 SO N TU HE THAP PHAN SANG HE CO SO BAT KI b ó 16\n") ;
Doicoso(n,b);
getch();
break ;
case '2':
printf("\n\n=============================\n\n");
printf("LIET KE CAC SO NGUYEN TO ó N");
printf("\nHay nhap n:");scanf("%ld",&n);
if(n<2) printf("\nKhong the tim ra ket qua!");
else
{
if(n==2)printf("Cac so Nguyen To ó n: 2");
if(n==3||n==4) printf("Cac so nguyen to ó n la: 2 3");
if(n>=5){
printf("Cac so nguyen to ó %ld la:\n2 3",n);
DayNguyenTo(n); }

}
getch();
break;
case '3':
printf("\n\n==============================\n\n");
printf("LIET KE CAC SO MESSON ó N");
printf("\nNhap N=");scanf("%ld",&n);
if(n>30) printf("\n\nSo N qua lon, khong du bo nho de tinh toan!");
else {
printf("\nCac so Messon ó n la:\n2 ");
Messon(n); }
getch();
break;
case '4':
printf("\n\n===========================\n\n");
printf("LIET KE CAC SO HOAN THIEN ó N");
so_hoan_thien();
getch();
break;
case '5':
printf("\n\n==========================\n\n");
printf("LIET KE CAC CAP SO HUU NGHI ó N");
cap_so_huu_nghi();
getch();
break;
case '6':
printf("\n\n=========================\n\n");
printf("LIET KE CAC SO PALIOM ó N");
paliom();
getch();
break;
}
//getch();
}
//================================================== ==============================
}//end main

bete
09-10-2006, 11:26 AM
//Kiem tra 1 so co phai la 1 so nguyen to hay khong?
int NguyenTo(long x)
{
long i,t=0;
for(i=2;i<=sqrt(x);i++)
{
if(x%i==0) { t=0;break;}
else t=1;
}//end for
return(t);
}//end function


=> nếu x là số chẵn thì có thể kết luận ngay x không là số nguyên tố. Ngược lại nếu x là số lẻ thì chỉ cần thử i với i là số lẻ (không cần thử với i là số chẵn)

PoPoPoPo
09-10-2006, 11:31 AM
=> nếu x là số chẵn thì có thể kết luận ngay x không là số nguyên tố. Ngược lại nếu x là số lẻ thì chỉ cần thử i với i là số lẻ (không cần thử với i là số chẵn)
Rất cảm ơn đóng góp của bạn.

Vậy chúng ta chỉ cần thao tác kiểm tra: nếu x chẵn -> next
else thì kiểm tra như trên!

bete
09-10-2006, 12:00 PM
Thân gửi PoPoPOPO,

Vậy chúng ta chỉ cần thao tác kiểm tra: nếu x chẵn -> next
else thì kiểm tra như trên!

=> tui nghĩ nghĩ là nên thay "for(i=2;i<=sqrt(x);i++)" bằng "for(i=3;i<=sqrt(x);i+=2)"

-thân

Kevin Hoang
10-10-2006, 02:36 AM
nếu x là số chẵn thì có thể kết luận ngay x không là số nguyên tố.

Nếu x==2 thì sao đây? he he.

bete
10-10-2006, 05:57 AM
Nếu x==2 thì sao đây?

=> hỏi tức là đã trả lời rồi :):):) (cám ơn Dreminess đã chỉ ra chỗ sai :))

-thân

hailoc12
10-10-2006, 08:55 PM
Không rõ trước đây em có đọc trên báo Toán học nhà trường nói rằng các nhà Toán học Ấn Độ tìm ra được một thuật toán kiểm tra số nguyên lớn có phải là số nguyên tố hay không chỉ bằng 13 dòng lệnh ,không biết có ai có được thuật toán đó không

PoPoPoPo
11-10-2006, 01:42 PM
Thế cái thuật toán trên của em dài bao nhiêu dòng lệnh.
Rõ ràng là ít hơn 13 mà!