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

时间:2018-11-08 18:01:57

标签: 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;
}

1 个答案:

答案 0 :(得分: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");
    }
}