30/09/2018, 18:19

Tìm số đẹp thứ n, với định nghĩa số đẹp là số tổng các chữ số của nó chia hết cho số chữ số

Đề là : Một số nguyên dương được gọi là số đẹp nếu tổng các chữ số của nó (trong hệ thập phân). chia hết cho số chữ số. Ví dụ, 15 là một số đẹp vì 1+5 chia hết cho 2.
Yêu cầu: Cho số nguyên dương n(n<=10^6). Hãy tìm số đẹp thứ n.
Dữ liệu: nhập từ bàn phím nguyên dương .
Kết quả: xuất ra màn hình số đẹp thứ n.

Code của mình:

int main()
{
    unsigned long long n, a[1000000], c=1, b[1000000], i=1;
    cin >> n;
    while (n+1==c)
    {
        unsigned long long m=i, s=0, q=1;
        while (m!=0)
        {
            b[q]=m%10;
            s+=b[q];
            m/=10;
            q++;
            i++;
        }
        if (s%(q-1)==0)
        {
            a[c]=i;
            c++;
        }
    }
    cout << a[c-1];
    return 0;
}

Mình cám ơn trước ạ <3

Gió viết 20:19 ngày 30/09/2018

unsigned long long n, a[1000000], c=1, b[1000000], i=1;

=> có thể bị lỗi bộ nhớ. Là bài toán đếm đến khi đạt y.c thì xuất đáp án, không cần lưu kq trước đó

unsigned long long m=i, s=0, q=1;
while (m!=0)
{
b[q]=m%10;
s+=b[q];
m/=10;
q++;
i++;
}
if (s%(q-1)==0)
{
a[c]=i;
c++;
}

viết 20:32 ngày 30/09/2018

Bạn đã học về hàm chưa, nếu rồi thì dùng hàm để code bài này, với lại tên biến của bạn tối nghĩa quá, thêm chút comment người khác đọc code sẽ dễ hơn.

unsigned long long n, a[1000000], c=1, b[1000000], i=1;

Bài này dùng cấp phát động nhé vì mảng trong C/C++ chỉ nên để kích thước tối đa là 10000 thôi, nếu k sẽ bị tràn bộ nhớ đệm (buffer overflow)

Nguyễn Cát Long Huy viết 20:29 ngày 30/09/2018

Mính sửa vầy đúng ko bạn?

int main()
{
    unsigned long long n, c=0, i=1;
    cin >> n;
    while (n+1==c)
    {
        unsigned long long m=i, s=0, q=1;
        while (m!=0)
        {
            s+=(m%10);
            m/=10;
            q++;
            i++;
        }
        if (s%(q-1)==0)
        {
            c++;
            if (n==c)
            {
                cout << i-1;
                break;
            }
        }
    }
    return 0;
}

Nhưng nó cứ lỗi ở đâu đó ý

Nguyễn Cát Long Huy viết 20:25 ngày 30/09/2018

Dùng hàm nào bạn? Cáo phát động thì mình chưa học

Hnib viết 20:32 ngày 30/09/2018

Mình ko biết về C++ nhưng mình đóng góp một tý về cách viết .

  1. Nên viết ra một hàm với input là một number và kiểm tra số này có phải là số đẹp ko, trả về true/false.
  2. Sau đó viết một hàm trả về số đẹp thứ n, chỗ này chắc mình nghĩ cứ phải chạy từ 1 đến n , có một biến là count, khi gặp số đẹp thì count = count +1, khi nào count = n thì result = count. (Mà cũng lưu ý là sô thứ n là tính từ 0 hay tính từ 1 nhé ^^).
Nguyễn Cát Long Huy viết 20:33 ngày 30/09/2018

Theo điều 1 bạn nói chắc là hàm bool nhưng phải cho nó kiểm tra từ đâu tới đâu?

Hnib viết 20:22 ngày 30/09/2018

Chắc phải cho chạy từ 1 đến 10^6 luôn

Nguyễn Cát Long Huy viết 20:27 ngày 30/09/2018

mình sợ nó cũng bị lỗi tại như bạn @vietha1996 nói mảng có kích thước tối đa 10000 thôi

viết 20:25 ngày 30/09/2018

Xin lỗi bạn, mình có đọc reply từ chiều xong đi học, tới lúc về thì quên mất.

Dùng hàm nào bạn? Cáo phát động thì mình chưa học

Ý mình là bạn dùng hàm để kiểm tra các điều kiện của đề bài ấy chứ bạn cho tất vào hàm main() cộng thêm các biến c, i, m, s … rất khó hiểu.
Cấp phát động thì bạn có thể tìm trên google, chỉ vài dòng thôi. Bài này bạn không cần dùng mảng để lưu cũng được.

Ý tưởng bác @Hnib nói hoàn toàn đúng ạ, mình xin phép triển khai.

viết 20:26 ngày 30/09/2018

Mình code lại toàn bộ, ý tưởng giống với bác @Hnib.
Bạn chịu khó đọc kĩ sẽ hiểu, mình test thử n = 10^6 vẫn ra kq nhé : 6806035, quá bé so với long long

#include <iostream>
using namespace std;

int soChuSo(long long n) {
	// hàm này dùng để tính số chữ số của n
	int t = 0;
	while (n > 0) {
		t++;
		n = n / 10;
	}
	return t;
}

int tongChuSo(long long n) {
	// hàm này dùng để tính tổng chữ số của n
	int s = 0;
	while (n > 0) {
		s = s + n % 10;
		n = n / 10;
	}
	return s;
}

bool kiemTra(long long n) {
	// hàm này để kiểm tra xem n có là số đẹp không, nếu có trả về true, sai trả về false
	if (tongChuSo(n) % soChuSo(n) == 0)
		return true;
	return false;
}

int main() {
	long long n;			// n là số đề bài nhập vào
	cin >> n;
	long long i = 1;		// biến i để đếm xem đã tới số thứ n chưa
	long long soDep = 1;	        // gán soDep ban đầu = 1
	
	while (i < n) {
		if (kiemTra(soDep+1) == true) {
			i++;
			// nếu soDep đúng là số đẹp thì tăng i lên 1
		}
		soDep++;
	}
	cout << "So dep thu " << n << " la : " << soDep << endl;
	return 0;
}
Nguyễn Cát Long Huy viết 20:25 ngày 30/09/2018

hehe bạn bài thì mình hiểu rồi và đã test, rất chính xác. Nhưng bạn xem dùm mình bài này mình lỗi đâu ý mà ra sai kết quả

unsigned long long n, vt=0, so=1, dem=0;
bool sodep(int n)
{
    unsigned long long m=so, s=0, sophantu=1;
    while (m!=0)
    {
        s+=(m%10);
        m/=10;
        sophantu++;
        so++;
    }
    if (s%(sophantu-1)==0) return true;
}
int main()
{
    cin >> n;
    for (unsigned long long i=1; i<=1000000; i++)
    {
        if (sodep(i)==true) dem++;
        if (dem==n)
        {
            cout <<i;
            break;
        }
    }
    return 0;
}
viết 20:19 ngày 30/09/2018

bool sodep(int n)
{
unsigned long long m=so, s=0, sophantu=1;
while (m!=0)
{
s+=(m%10);
m/=10;
sophantu++;
so++;
}
if (s%(sophantu-1)==0) return true;
}

Bạn truyền tham số n vào trong hàm sodep() mà trong hàm không đụng gì tới nó cả.
Cũng trong hàm này, bạn gán m = soso = 1 -> m = 1, như thế những gì trong while chỉ thực hiện đúng 1 lần, dẫn tới sophantu = 2, so = 2. Kiểm tra tới if thấy s % (sophantu - 1) luôn = 0.
Hàm sodep() của bạn luôn True, vào main bạn gọi sodep(i) nó sẽ ra luôn i cho bạn.

Nguyễn Cát Long Huy viết 20:33 ngày 30/09/2018

Mình cop nguyên đống trên mà quên sửa :)) Sửa vầy nó vẫn sao sao hỷ?

unsigned long long n, so=1, dem=0;
bool sodep(int n)
{
    unsigned long long s=0, sophantu=1;
    while (n!=0)
    {
        s+=(n%10);
        n/=10;
        sophantu++;
    }
    if (s%(sophantu-1)==0) return true;
}
int main()
{
    cin >> n;
    for (unsigned long long i=1; i<=1000000; i++)
    {
        if (sodep(i)==true) dem++;
        if (dem==n)
        {
            cout <<i;
            break;
        }
    }
    return 0;
}
Bài liên quan
0