# GÓC SÁNG TẠO > Khu vực lập trình > Pascal/Delphi/Kylix >  [Help] Tìm số nguyên dương a nhỏ nhất thỏa mãn: a^a chia hết N. (Số lớn)

## thuytrang128

Cho số nguyên N(2<N<1000.000.000).Tìm số nguyên dương nhỏ nhất sao cho a^a chia hết 
cho N,
VD:N=9 => Kết quả a=3.
MỌI NGƯỜI GIẢI GIÚP EM NHÉ!EM ĐANG CẦN GẤP!

----------


## akakavn

Ý tưởng thế này nhé. Bạn coi được không:
+ Viết 1 hàm tính số mũ: Somu(a) = a^a (cái này tự viết)
+ Dùng vòng lặp While ... Do để làm:
i:=2;
While Somu(i) mod n <> 0 Do
i:=i+1;
Write(i);

----------


## rubiethuy

Bạn ơi,bươc đầu tiên tớ chưa hiểu lắm,bạn có thể viết CT phần đó ra đc ko.

----------


## khanhhoangsg

Công thức tính số mũ:


```
kq := exp(so_mu * Ln(co_so));
```

Ví dụ: a^a


```
kq := exp(a*Ln(a));
```

Chúc bạn thành công!

----------


## hvcuong

Ý tưởng nè bạn: Tìm số nhỏ nhất chia hết cho N là số chính phương. Cái này bạn làm được chứ?? Tiếp: lấy căn bậc 2 của số chính phương đó => kết quả cần tìm.

----------


## huongcao

nhưng kẹt 1 chỗ:nếu làm như bạn thì phải khai báo cái số chính phương như thế nào đây:
Var a:integer;n:longint;b:???
Begin
Clrscr;
Repeat
Write('Nhap so nguyen n= ');readln(n);
Until (n>2) and (n<1000.000.000);
For b:=3 to n do
If (frac(sqrt(b))=0) then
If b mod n =0 then
a:=sqrt(b);
Write(a);
Readln
End.
Chú ý:bài theo ý tưởng này khó xđ 'b' quá.Vì nó có câu lệnh là thuộc 'integer' ,có câu lệnh thuộc 'real'.Tớ ko biết phải sửa ntn?Các bạn giúp tớ nhé!

----------


## Hai

> Ý tưởng thế này nhé. Bạn coi được không:
> + Viết 1 hàm tính số mũ: Somu(a) = a^a (cái này tự viết)
> + Dùng vòng lặp While ... Do để làm:
> i:=2;
> While Somu(i) mod n <> 0 Do
> i:=i+1;
> Write(i);


Thế này nhé:
+ Hàm tính số mũ:
For i:=1 to a do tg:=a*a;
Somu:=tg;

Còn mấy dòng lệnh dưới chắc bạn hiểu rùi.

----------


## thoitrangpk

Khai báo longint hay int64(free) là ok mà bạn. Kiểm tra chính phương dùng trunc và sqrt ấy.
Code của bạn sai rồi, tìm b min chia hết cho N rồi lấy sqrt(b) tức là b chạy từ N trở đi chứ không phải 3->n. 
Còn số chính phương không cần khai báo real đâu bạn. Để kiểm tra chính phương thì thế này: if sqrt(b)=trunc(sqrt(b)) then "là số chính phương".

----------


## trachanhvn

Hình như hôm nay bạn Quyên thi TIN HỌC TRẺ thì phải. 

Tính kết quả của 1 lũy thừa thì nên dùng công thức, đừng nên dùng vòng for. Bởi vì tốn thời gian. Một bài hoàn chính thì cần kết quả đúng và thời gian nằm trong quy định của đề mới ăn được điểm. [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------


## muabanxe

Bài này đơn giản thôi mà. Mình sẽ viết chương trình 
cho bạn

----------


## giangnt

Chương trình đây, rất đơn giản, các bạn cho ý kiến



```
[/FONT]
Var N,i:longint;
function mu(x:longint):longint;
Var i,tich:longint;
Begin
 Tich:=1;
 For i:=1 to x do Tich:=Tich*x;
 mu:=Tich;
End;
BEGIN
write('Nhap vao so nguyen duong N:');
Readln(N);
write('So nho nhat co binh phuong chia het cho N la:');
For i:=1 to N do if mu(i) mod N = 0 then
Begin
 write(i);
 break;
End;
Readln
End.
```

----------


## htkkplus

lehang xem lại code nhá. Vì hàm mũ của bạn là để tính N! chứ không phải N^N. Bạn đọc lại cho kĩ đề bài đã.

----------


## citybuilder1102

tieulong hay nhầm thế. Bạn xem lại đi, hàm mũ tớ xây dựng là tính x mu x đấy

----------


## skygame

> Chương trình đây, rất đơn giản, các bạn cho ý kiến
> 
> 
> ```
> Var N,i:longint;
> function mu(x:longint):longint;
> Var i,tich:longint;
> Begin
>  Tich:=1;
> ...


Ý tưởng giống hệt bạn *trungsyk10it* mà.
Với lại nếu chỉ code bình thường thế này thì liệu đc n bằng bao nhiêu hả *lehang_gb1*?

----------


## vietnhatglass

> tieulong hay nhầm thế. Bạn xem lại đi, hàm mũ tớ xây dựng là tính x mu x đấy


Ờ sr bạn nha vì mình đọc không kĩ lắm. [IMG]data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAA  l21bKAAAAA1BMVEXh5PJm+yKVAAAAAXRSTlMAQObYZgAAAApJR  EFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII=[/IMG]

----------

