Tìm số nguyên nhỏ nhất để tích chữ số bằng số nhập vào

Mọi người cho em xin ý tưởng để giải bài này với ạ, em cảm ơn nhiều ạ!

Duyệt từ 9 ==> 2 để phân tích thừa số của nó là được :slight_smile:

Gợi ý cho bạn :)
    String out;
    for(int i = 9; i >= 2; i--)
    {        
        while(product % i == 0)
        {
            product /= i;
            out += i;
        }        
    }
9 Likes

Cái này đâu liên quan đến thừa số nguyên tố đâu ạ?

Đúng là ko cần nguyên tố, mà phân tích như bạn trên ấy.

3 Likes

Các bác cho em hỏi chút nữa với, e cũng đã code theo ý tưởng bác NDA từ trước rồi, cơ mà những số như 25 hay 16 sẽ không tính được, bởi nó không nhận ra 2 số ^2 hay ^3, cho em solution với ạ!

  1. Bạn chia tới 9 mà ko về 1 tức là false được rồi :slight_smile: ko cần prime.
  2. Rõ ràng thì tích 16 ta lấy 2*8 tốt hơn 4*4
3 Likes

vâng 16 e nghĩ sai, còn 25 thì sao ạ?

Đáp án là 55 đó bạn :slight_smile:

2 Likes

Em biết là 55, nhưng code của em nó không in ra được những cái có 2 số giống nhau thì làm thế nào ạ?
Code của em đây ạ:

#include<stdio.h>
#include<math.h>
int digitsProduct(int product);
int is_prime(int n);
int main()
{
    printf("Nhap n: ");
    int n;
    scanf("%d",&n);
    printf("%d",digitsProduct(n));
}
int is_prime(int n)
{
    for (int i=2;i<=sqrt(n);++i)
    {
        if (n%i == 0)
        return 0;
    }
    return 1;
}
int digitsProduct(int product)
{
    if (product==0)
    return 10;
    if (product<=10)
    return product;
    if (is_prime(product))
    return -1;
    int i=9, j=-1, res=0;
    int a[j];
    while (i>=2)
    {
        if (product%i == 0)
        {
            j++;
            a[j] = i;
            product /= i;
        }
        --i;
    }
    if (j==-1)
    return -1;
    for (int k=j; k>=0;--k)
    {
        res = res*10 + a[k];
    }
    return res;
}

Nó có liên quan gì đến thừa số nguyên tố đâu nhỉ ?? Chỉ cần duyệt từ 9 ==> 2 rồi cộng chuỗi thôi mà @@ Xem đoạn bên trên mình viết ý

    String out;
    for(int i = 9; i >= 2; i--)
    {        
        while(product % i == 0)
        {
            product /= i;
            out += i;
        }        
    }
2 Likes

Ý của em là khi số đấy là số nguyên tố thì return luôn cái số đó, để chạy những số lớn mà không cần phân tích ấy @@

Cộng chuỗi xong parse từ chuỗi sang int thử xem bạn. Code bạn hơi rối @@

1 Like

Lúc đó bạn vẫn đang phân tích đấy :smiley:
Những cách không qua phân tích không dễ như vậy (nhất là cách chính xác - gần đúng 99.99% dễ hơn).

2 Likes

Thank các bác, em tìm ra lỗi của em rồi, ở vòng while (i>=2) em phải làm tiếp vòng lặp mới đúng lại đi để if. Code hoàn chỉnh của em đây ạ, mọi người tham khảo ^^!

#include<stdio.h>
#include<math.h>
int digitsProduct(int product);
int is_prime(int n);
int main()
{
    printf("Nhap n: ");
    int n;
    scanf("%d",&n);
    printf("%d",digitsProduct(n));
}
int digitsProduct(int product)
{
    if (product==0)
    return 10;
    if (product<=10)
    return product;
    int i=9, j=-1, res=0;
    int a[50];
    while (i>1)
    {
        while (product%i == 0)
        {
            j++;
            a[j] = i;
            product /= i;
        }
        --i;
    }
    if ((j==-1)||(product>=10))
    return -1;
    for (int k=j; k>=0;--k)
    {
        res = res*10 + a[k];
    }
    return res;
}

Bạn vui lòng đọc nhé :smiley:

1 Like

Em cảm ơn ạ, do em mới tham gia cộng đồng này nên không biết cách ạ !

nhưng phân tích thành thừa số nguyên tố vẫn giải ra đúng ko a?

Theo em là không bác ạ!

Bài này thì không tới đâu cả :slight_smile:

Để thừa số còn lại nhỏ nhất thì ta sẽ chia cho số lớn nhất có thể được. Như vậy khi có phân tích thành thừa số thì ta tách từng bộ 3 thừa số 2 và 2 thừa số 3, sau đó chia trường hợp còn lại hơi phức tạp.

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?