c - 以乘法格式显示素因数

标签 c function prime-factoring

这是一项作业,因此我将在问题详细信息的下方发布我的代码,这样你们就可以比我自己解释问题更容易理解。

Q) 任何大于 1 的整数要么是素数,要么可以通过素数相乘得到。例如: 16 = 2 x 2 x 2 x 2 = (2^4) 17 = (17^1) 18 = 2 x 3 x 3 = (2^1) x (3^2) 编写一个 C 程序,primeFactor .c,要求用户输入一个大于 1 的整数并显示其质因数的乘积。

交互示例如下:

输入有效数字 (>1):18

18 = 1 x (2^1) x (3^3)

输入有效数字 (>1):0

号码无效。

输入有效数字 (>1):19

19 = 1 x (19^1)

int readNum(int num)
{
    if (num <= 1)
    {
        return printf("Invalid Number.");
    }
    else
    {
        return printf("%i = ", num);
    }
}

int pcount = 0;
bool isPrime(int prime)
{
    bool p_flag = false;

    for(int i = 2; i < prime; i++)
    {
        if(prime % i == 0)
        {
            pcount += 1;
        }
    }
    if (pcount > 0)
    {
        p_flag = false;
    }
    else if (pcount == 0)
    {
        p_flag = true;
    }

    return p_flag;
}

int findPrimeCount(int num, int prime)
{
    int freq = 1;

    printf("1 ");
    for(prime = 2; prime < num; prime++)
    {
        freq = 1;
        while((num % prime) == 0)
        {
            printf(" * (%i ^ %i)", prime, freq);
            num = num / prime;
            freq++;
        }
    }

    if(num != 1)
    {
        printf(" * (%i ^ 1)", num);
    }

    return num;
}

int main(void)
{
    int number = 0;

    printf("Enter a valid number (>1): ");
    scanf("%i", &number);

    readNum(number);

    if(isPrime(number) == 1)
    {
        printf("1 * (%i ^ 1)", number);
    }
    else if (isPrime(number) == 0)
    {
        findPrimeCount(number, 2);
    }

    return 0;
}

现在我想我陷入了困境,如果我输入数字 64,输出将是:

64 = 1 * (2^1) * (2^2) * (2^3) * (2^4) * (2^5) * (2^6)

我希望输出如下:

64 = 1 * (2^6)

我不确定在此之前如何截断字符串输出,甚至可能避免完全打印整个内容。非常感谢任何帮助!

最佳答案

在您的 findPrimeCount 函数中,只需将 print 语句放在 while 循环之外,这样它就只打印 factor^highestFreq :

int findPrimeCount(int num, int prime)
{
    int freq = 1;

    printf("1 ");
    for(prime = 2; prime < num; prime++)
    {
        freq = 1;
        while((num % prime) == 0)
        {

            num = num / prime;
            freq++;
        }
        // only print the last iteration
        // subtract 1 to frequency to equalize
        // the last freq++.
        freq--;
        // filter out num^0
        if(freq > 0)
        {
            printf(" * (%i ^ %i)", prime, freq);
        }
    }

    if(num != 1)
    {
        printf(" * (%i ^ 1)", num);
    }

    return num;
}

对于输入 = 64 个输出:

64 = 1  * (2 ^ 6)

输入 = 46 个输出:

46 = 1  * (2 ^ 1) * (23 ^ 1)

关于c - 以乘法格式显示素因数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50848603/

相关文章:

c - 在postgresql中执行系统命令

c++ - 通过单个函数返回另一个函数的多个参数

java - 使用 BigInteger 查找 200 位素数

c - 如何将条件作为参数传递给 C 中的函数?

algorithm - Eratosthenes 的分段筛?

c++ - 最大质因数 - C++

c++ - Arduino LED 温度传感器

c - 是否可以在 Eclipse 中导入/运行目标文件?

c - 我不了解C字符串

c++ - 如何将方法指针传递给结构(在 C/C++ 中)?