c - 如何解决这个意外的输出?

标签 c xcode algorithm

我一直在将整数分解为素数,但我被卡住了,它适用于一个素数,但当迭代继续时,它就无法正常工作,我无法想出任何解决方案。

例如,对于数字 12,我期望输出 2^2 x 3 但程序在 2^2 x 处停止,并且需要新的输入。

int main(int argc, char *argv[])
{

    int number;
    int stop = 1;
    int prime = 0;
    int sqr = 0;

    while (stop == 1) {
        /**------ERROR------ **/
        if(scanf("%d",&number) != 1 || number < 0 ){
            fprintf(stderr,"%s","Error: Chybny vstup!\n");
            return 100;}
        if(number == 0){
            stop = 0;
            break;}
        /**------DECOMPOSITION------ **/
        for (int index = 1;index <=number;){
            if(number == 1){
                //Ak sa input cislo rovna 1 tak vypise nasledovne riadky
                printf("Prvociselny rozklad cisla 1 je:\n");
                printf("1\n");
                break;}
            if(number % (index + 1) == 0){
                // ak je cislo % index +1 (pociatocna hodnota je 2) tak sa vydeli cislom index + 1
                // do prime sa ulozi dane prvocislo
                // ak je delitelne prvocislom pripocitame sqr +1
                // cyklus pokracuje s rovnakym indexom
                number = number / (index + 1);
                prime  = index + 1;
                sqr = sqr + 1;
                continue;}
            else{
                if(sqr == 1){
                    // vypise len prvocislo
                    printf("%d",prime);}
                if(sqr != 1){
                    //vypise prvocislo aj mocninu
                    printf("%d^%d", prime,sqr);}
                if(number != 1){
                    printf(" x ");}
                else{
                    printf("\n");
                    break;}
            }
            index = index + 1;
            sqr = 0;
        }
    }

  return 0;
}

最佳答案

我在代码中发现两个问题:

  • number == 1 的特殊情况正在循环内处理。这种特殊情况在循环之前更容易处理。
  • 计算指数混合到更新因子的循环中。使用第二个循环来计算指数要容易得多。
<小时/>
#include <stdio.h>

int main(void)
{
    while (1){
        /**------GET USER INPUT------ **/
        int number;
        if(scanf("%d",&number) != 1 || number < 0 ){
            fprintf(stderr,"%s","Error: Chybny vstup!\n");
            return 100;
        }

        /**------HANDLE SPECIAL CASES------ **/
        if(number == 0){
            break;
        }
        if(number == 1){
            printf("Prvociselny rozklad cisla 1 je:1\n");
            continue;
        }

        /**------DECOMPOSITION------ **/
        for (int factor = 2; factor <= number; factor++){
            int exponent = 0;
            while(number % factor == 0){
                number /= factor;
                exponent++;
            }

            if (exponent == 1){
                printf("%d", factor);}
            else if (exponent > 1){
                printf("%d^%d", factor, exponent);}

            if(exponent != 0 && number != 1){
                printf(" x ");}
        }
        printf("\n");
    }
}

关于c - 如何解决这个意外的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53213622/

相关文章:

c++ - 在iOS上运行没有GUI的应用程序?

ios - 细胞图像显示乱序,为什么会发生这种情况?

algorithm - 根据关键字组对文本进行分类?

algorithm - 寻找 Big-O、Omega 和 theta

xcode - 从 OSX 上的沙箱中访问温度和风扇数据?

java - 采用整数并返回所有可能的加法格式的算法

c - 将 char 存储在整数数组中

c - 如何对预处理器(宏)进行类型转换以输出 int

C编程: Generating a random number (x) that is between -2, 2然后更新x

swift - Xcode Commoncrypto 生成 key 对(私钥和公钥)