Yêu cầu:
Kiểm tra số nguyên N 4 byte có dạng 2^k không?
Giải thuật:
– Dùng vòng lặp tăng dần biến k, thực hiện p = p*2
– So sánh số nguyên N với p
+ Nếu N == p -> N có dạng 2^k
+ Nếu N < p -> N không có dang 2^k
Code
/************************************************************ * Author: VNCODING * History * 2016/12/14 first create VNCODING *************************************************************/ #include <stdio.h> #include <conio.h> int main() { int n, k; unsigned int p = 1; do { printf("n = "); scanf("%d", &n); }while(n <= 0); for(k = 1; p < n; k++) { p *= 2; } if(p == n) { printf("%d is 2^%d format", n, k-1); } else { printf("%d is not 2^k format", n); } getch(); return 0; }
Kết quả:
Cho em hỏi:
Sao không viết là n>=0.mà lại viết n<=0.
Bạn xem lại behavior của vòng lặp do while nhé
lệnh do{x}while(f); có nghĩa là: thực hiện hành động x khi điều kiện vẫn là f!
e ko hiểu đề bài này lắm!!
Bài này mình dùng công thức hàm log được ko?
//Ktra 1 so co dang 2^k ?
#include
#include
void Nhapx(int );
void KT(int );
void Nhapx(int *x)
{
do {
printf(“Nhap x khong am”);
scanf_s(“%d”,&(*x));
} while (*x<0);
}
void KT(int a)
{
double b; int c;
b=(log(a*1.0))/(log(2.0));
c=floor(b);
if (b-c==0)
printf("%d co dang 2^k va k = %d",a,c);
else
printf("%d khong co dang 2^k",a);
}
void main ()
{
int x;
Nhapx(&x);
KT(x);
}
Bài này có thể làm theo đệ qui được đó bạn.
#include
using namespace std;
int k=0;
int logarit(long num)
{
if(num == 1) //nếu số N = 1 –> k=0
return k;
else
if(num % 2 != 0 || num <= 0) // nếu N ko chia hết cho 2 hoặc N nhỏ hơn 1. Dừng và đưa ra kết quả
return -1;
else
{
k += 1; // tăng k lên 1 đơn vị
return logarit(num / 2); // nếu N vẫn chia hết cho 2, tiếp tục với số n/2
}
}
int main()
{
long n, temp;
cout <> n;
temp = logarit(n);
if(temp == -1 )
cout << "Không phải ! ";
else
cout << "Ta có " << n << " = 2 ^ " << temp;
return 1;
}
Bài này có thể làm theo đệ qui được đó bạn.
#include
using namespace std;
int k=0;
int logarit(long num)
{
if(num == 1) //nếu số N = 1 –> k=0
return k;
else
if(num % 2 != 0 || num <= 0) // nếu N ko chia hết cho 2 hoặc N nhỏ hơn 1. Dừng và đưa ra kết quả
return -1;
else
{
k += 1; // tăng k lên 1 đơn vị
return logarit(num / 2); // nếu N vẫn chia hết cho 2, tiếp tục với số n/2
}
}
int main()
{
long n, temp;
cout <> n;
temp = logarit(n);
if(temp == -1 )
cout << "Không phải ! ";
else
cout << "Ta có " << n << " = 2 ^ " << k;
return 1;
}