25/11/2010, 2:09 pm
Cái bài nhập vào 3 số a,b,c . Kiểm tra xem nó có phải là 3 cạnh của một tam giác hay không? :
Thuật toán tìm số các số hoàn chỉnh < 1000:
“Nếu một hàm f(x) đơn điệu (tăng hoặc giảm) trên một đoạn [a, b] nào đó và f(x) có đạo hàm không đổi dấu trên đoạn đó, thì chắc chắn phương trình f(x) = 0 có một nghiệm duy nhất c nào đó trong đoạn [a, b]” (ở đây [a,b] được chọn là “khoảng phân ly nghiệm”)
Để tìm nghiệm gần đúng c, ta thực hiện một số hữu hạn lần quá trình lặp các bước sau đây:
Bước 1: Ta chọn c là điểm chính giữa của đoạn [a, b]
c = (a + b) / 2
Bước 2: Nếu f(c) = 0 thì ta khẳng định ngay c là nghiệm cần tìm và chuyển sang bước 4, ngược lại chuyển sang bước 3.
Bước 3: Nếu f(a)f(c) < 0 thì ta đặt lại b = c và quay về bước 1. Còn nếu f(a)f(c) > 0 thì đặt lại a=c rồi cũng quay về bước 1.
Bước 4: Thông báo nghiệm c tìm được và kết thúc công việc tìm nghiệm của phương trình f(x) = 0.
Quá trình trên gọi là phương pháp chia đôi bởi vì cứ mỗi một lần lặp lại từ đầu thì khoảng [a, b] cần xem xét được thu gọn lại chỉ còn một nửa so với lần trước bởi điểm chính giữa c. Quá trình lặp trên cũng dừng lại khi đoạn [a,b] quá ngắn (nhỏ hơn một số dương rất nhỏ nào đó, gọi là sai số).
Ví dụ phương trình f(x) = 0 với f(x) = x ^ 3 - 4, thì nghiệm gần đúng với sai số 0.001 sẽ được tìm như sau:
Lần lặp ---- a ---- b ---------x
1 1.0000 2.0000 1.5000
2 1.0000 1.5000 1.2500
3 1.2500 1.5000 1.3750
4 1.3750 1.5000 1.4375
5 1.4375 1.5000 1.4688
6 1.4688 1.5000 1.4844
7 1.4844 1.5000 1.4922
8 1.4922 1.5000 1.4961
9 1.4961 1.5000 1.4980
10 1.4980 1.5000 1.4990
Vậy nghiệm gần đúng của phương trình trên là 1.499
Bài tập : Tìm nghiệm gần đúng của pt : exp(x) - 1.5 = 0 , sai số là pow(10,-6):
Code khác đây :) :
Các số sinh đôi là các số nguyên tố mà khoảng cách giữa chúng là 2. Hãy in tất cả cặp số sinh đôi < 1000.
Nhập vào tuổi cha và tuổi con. Cho biết sau bao nhiêu năm tuổi cha bằng đúng 2 lần tuổi con.
Ngoài ra các bạn có thể làm ngắn hơn:
Thuật toán :
Tuổi cha : a; tuổi con : b; số năm : n
Sau n năm tuổi cha = 2 lần tuổi con: a+n= 2*(b+n)
=>a+n = 2*b+2*n
=>n = a-2*b
Tìm số có 2 chữ số sao cho tích 2 chữ số của nó gấp 2 lần tổng 2 chữ số của nó:
Tính e^x bằng công thức Taylor
Tinh Sinx = CT Taylor :
Thuật toán :
Cho x, ta cần tìm sqrt(x).
a(0)=m
a(i+1)=(a(i)*a(i)+x)/(2*a(i))
Chuyển đổi cơ số :
exp(n)-1999*log10(n)<2000 :
- Code:
#include<iostream.h>
#include<math.h>
#include<iomanip.h>
void main()
{
float a,b,c;
cin>>a>>b>>c;
if (((a+b)>c)&&((b+c)>a)&&((a+c)>b))
{
if (((a*a+b*b)==c*c)||((a*a+c*c)==b*b)||((b*b+c*c)==a*a))
{
if ((a==b)||(b==c)||(c==a))
cout<<"La do dai 3 canh tam giac vuong can\n";
else
cout<<"La do dai 3 canh tam giac vuong\n";
}
else
{
if ((a==b)&&(b==c))
cout<<"La do dai 3 canh tam giac deu\n";
else
{
if ((a==b)||(b==c)||(c==a))
cout<<"La do dai 3 canh tam giac can\n";
else
cout<<"La do dai 3 canh cua tam giac thuong\n";
}
}
}
else
cout<<"Khong la do dai 3 canh cua 1 tam giac\n";
return;
}
Thuật toán tìm số các số hoàn chỉnh < 1000:
- Code:
#include<iostream.h>
#include<math.h>
#include<iomanip.h>
#include<conio.h>
void main()
{
int n,s,i;
cout<<"Cac so hoan chinh nho hon 1000 : \n";
for (n=1;n<=1000;n++)
{
s=0;
for (i=1;i<=(n/2);i++)
{
if ((n%i)==0)
s=s+i;
}
if (n==s)
cout<<n<<"\n";
}
getch();
}
“Nếu một hàm f(x) đơn điệu (tăng hoặc giảm) trên một đoạn [a, b] nào đó và f(x) có đạo hàm không đổi dấu trên đoạn đó, thì chắc chắn phương trình f(x) = 0 có một nghiệm duy nhất c nào đó trong đoạn [a, b]” (ở đây [a,b] được chọn là “khoảng phân ly nghiệm”)
Để tìm nghiệm gần đúng c, ta thực hiện một số hữu hạn lần quá trình lặp các bước sau đây:
Bước 1: Ta chọn c là điểm chính giữa của đoạn [a, b]
c = (a + b) / 2
Bước 2: Nếu f(c) = 0 thì ta khẳng định ngay c là nghiệm cần tìm và chuyển sang bước 4, ngược lại chuyển sang bước 3.
Bước 3: Nếu f(a)f(c) < 0 thì ta đặt lại b = c và quay về bước 1. Còn nếu f(a)f(c) > 0 thì đặt lại a=c rồi cũng quay về bước 1.
Bước 4: Thông báo nghiệm c tìm được và kết thúc công việc tìm nghiệm của phương trình f(x) = 0.
Quá trình trên gọi là phương pháp chia đôi bởi vì cứ mỗi một lần lặp lại từ đầu thì khoảng [a, b] cần xem xét được thu gọn lại chỉ còn một nửa so với lần trước bởi điểm chính giữa c. Quá trình lặp trên cũng dừng lại khi đoạn [a,b] quá ngắn (nhỏ hơn một số dương rất nhỏ nào đó, gọi là sai số).
Ví dụ phương trình f(x) = 0 với f(x) = x ^ 3 - 4, thì nghiệm gần đúng với sai số 0.001 sẽ được tìm như sau:
Lần lặp ---- a ---- b ---------x
1 1.0000 2.0000 1.5000
2 1.0000 1.5000 1.2500
3 1.2500 1.5000 1.3750
4 1.3750 1.5000 1.4375
5 1.4375 1.5000 1.4688
6 1.4688 1.5000 1.4844
7 1.4844 1.5000 1.4922
8 1.4922 1.5000 1.4961
9 1.4961 1.5000 1.4980
10 1.4980 1.5000 1.4990
Vậy nghiệm gần đúng của phương trình trên là 1.499
Bài tập : Tìm nghiệm gần đúng của pt : exp(x) - 1.5 = 0 , sai số là pow(10,-6):
- Code:
#include<iostream.h>
#include<math.h>
#include<iomanip.h>
#include<conio.h>
void main()
{
float a=0,b=1;
float f,fa,fb;
fa = exp(0)-1.5;
fb = exp(1)-1.5;
do
{
f = exp((a+b)/2)-1.5;
//if (f==0)
//cout<<"phuong trinh co nghiem la : "<<(a+b)/2<<"\n";break;
if (f*fa<0)
b = (a+b)/2;
if (f*fb<0)
a = (a+b)/2;
}
while ((b-a)>=pow(10,-6));
cout<<"Nghiem cua pt la : "<<(a+b)/2<<"\n";
getch();
return;
}
Code khác đây :) :
- Code:
#include<math.h>
#include<iomanip.h>
#include<conio.h>
void main()
{
float a=0,b=1,c;
float fa,fc;
while ((b-a)>pow(10,-6))
{
c=(a+b)/2;
fa = exp(a)-1.5;
fc = exp(c)-1.5;
if ((fa*fc)==0)
break;
if (fa*fc>0)
a=c;
else
b=c;
}
cout<<"Nghiem xap xi cua phuong trinh = "<<c;
getch();
return;
}
Các số sinh đôi là các số nguyên tố mà khoảng cách giữa chúng là 2. Hãy in tất cả cặp số sinh đôi < 1000.
- Code:
#include<iostream.h>
#include<math.h>
#include<iomanip.h>
#include<conio.h>
int nguyento(int n)
{
if(n == 2 || n == 3)
{
return 1;
}
if( n == 0 || n == 1 || n % 2 == 0 || n % 3 == 0)
{
return 0;
}
if( n < 25 )
{
return 1;
}
int i = 5 ;
int j = 2 ;
while(i <= floor(sqrt(n)))
{
if(n % i == 0 )
{
return 0;
}
else
{
i = i + j ;
j = 6 - j ;
}
}
return 1;
}
void main()
{
int i;
cout<<"cac so nguyen to sinh doi nho hon 1000 la \n";
for(i=3;i<1000;i++)
{
if ((nguyento(i)==1)&&(nguyento(i-2)==1))
cout<<i<<" va "<<i-2<<"\n";
}
getch();
}
Nhập vào tuổi cha và tuổi con. Cho biết sau bao nhiêu năm tuổi cha bằng đúng 2 lần tuổi con.
- Code:
#include<iostream.h>
#include<conio.h>
void main()
{
clrscr;
int cha,con,nam;
lap:
cout<<"Nhap vao tuoi cua cha ; ";cin>>cha;
cout<<"Nhap vao tuoi cua con : ";cin>>con;
if (cha<2*con)
{
cout<<"Ban can phai nhap lai !!!\n";
goto lap;
}
nam = 0;
while (cha>2*con)
{
cha++;
con++;
nam++;
}
cout<<"Sau "<<nam<<" nam tuoi cha bang dung 2 lan tuoi con \n";
getch();
return;
}
Ngoài ra các bạn có thể làm ngắn hơn:
Thuật toán :
Tuổi cha : a; tuổi con : b; số năm : n
Sau n năm tuổi cha = 2 lần tuổi con: a+n= 2*(b+n)
=>a+n = 2*b+2*n
=>n = a-2*b
Tìm số có 2 chữ số sao cho tích 2 chữ số của nó gấp 2 lần tổng 2 chữ số của nó:
- Code:
#include<iostream.h>
#include<iomanip.h>
#include<math.h>
#include<conio.h>
void main()
{
int n,a,b;
for (n=10;n<100;n++)
{
a=(n%10);
b=(n/10);
if ((a*b)==(2*(a+b)))
cout<<n<<endl;
}
getch();
return;
}
Tính e^x bằng công thức Taylor
- Code:
#include<iostream.h>
#include<iomanip.h>
#include<math.h>
#include<conio.h>
long giaithua(int n)
{
if(n==1||n==0) return 1;
else
return n*giaithua(n-1);
}
void main()
{
long x,i;
float s;
cout<<"nhap x = ";cin>>x;
i=0;s=0;
while (float((pow(x,i)/giaithua(i)))>(pow(10,-6)))
{
s = s+ float(pow(x,i)/giaithua(i));
i++;
}
cout<<"e^"<<x<<" = "<<s<<endl;
cout<<exp(x);
getch();
return;
}
Tinh Sinx = CT Taylor :
- Code:
#include<iostream.h>
#include<iomanip.h>
#include<math.h>
#include<conio.h>
long giaithua(int n)
{
if(n==1||n==0) return 1;
else
return n*giaithua(n-1);
}
void main()
{
float x,s;
int i=0;
cout<<"Nhap x = ";cin>>x;
s=0;
do
{
s = s + (pow(-1,i+1))*(float(pow(x,2*i+1))/giaithua(2*i+1));
i++;
}
while ((float(pow(x,2*i+1))/giaithua(2*i+1))>pow(10,-6));
cout<<"sin("<<x<<") = "<<s<<endl;
getch();
return;
}
Thuật toán :
Cho x, ta cần tìm sqrt(x).
a(0)=m
a(i+1)=(a(i)*a(i)+x)/(2*a(i))
- Code:
#include<iostream.h>
#include<iomanip.h>
#include<math.h>
#include<conio.h>
void main()
{
long a,i;
float s;
lap:
cout<<"Nhap a = ";cin>>a;
if (a<0)
{
cout<<"Ban can nhap lai !!!\n" ;
goto lap;
}
s=a;
do
s=float((s*s+a)/(2*s));
while (fabs(float((a-s*s)/(2*s)))>pow(10,-6));
cout<<"can bac 2 cua a la : "<<s<<endl;
getch();
return;
}
Chuyển đổi cơ số :
- Code:
#include<iostream.h>
#include<iomanip.h>
#include<math.h>
#include<conio.h>
void main()
{
int n;
lap:
cout<<"Nhap n = ";cin>>n;
if (n<0)
goto lap;
int i,k;
int a[21];
for (k=0;k<=20;k++)
{
a[k]=0;
}
k=0;
while (n!=0)
{
a[k]=n%2;
k++;
n=n/2;
//cout<<a[k];
}
for (i=k;i>=0;i--)
cout<<a[i];
getch();
}
exp(n)-1999*log10(n)<2000 :
- Code:
#include<iostream.h>
#include<iomanip.h>
#include<math.h>
#include<conio.h>
void main()
{
int n=1;
float s=0;
do
{
s=s+float(exp(n)-1999*log10(n));
n++;
}
while (s<2000);
cout<<"n = "<<n<<endl;
getch();
return;
}