【问题标题】:What is the problem with this code of this C to multiply digits and finding out how many times it repeats until the final number is a single digit这个C的代码乘以数字并找出它重复多少次直到最终数字是一个数字有什么问题
【发布时间】:2020-07-18 06:45:56
【问题描述】:

我无法获得结果。我写的当前程序是将每个数字相乘以得到下一个数字和下一个数字,直到数字变成一个数字。

例如,

77 - 49 - 36 - 18 - 8 : repeats 4 times
679 - 378 - 168 - 48 - 32 - 6 : repeats 5 times

我的代码的问题是numbers that process %d times\n之后没有结果出来

我猜output() 是问题.. 但我真的一直在寻找错误。

#include <stdio.h>
#pragma warning (disable : 4996)

void inputUInt(int*, int*, int*);
void myFlush();
int transNumber(int);
void output(int, int, int);

int main()
{
    int start, end, gNum;   // start number, end number, how many times until the number becomes a single digit
    inputUInt(&start, &end, &gNum);
    output(start, end, gNum);

    return 0;
}

void inputUInt(int* startp, int* endp, int* gNump)
{
    while (1) {
        printf("#start number : ");
        scanf("%d", startp);
        if (*startp >= 100 && getchar() == '\n') {
            break;
        }
        else { ; }
        myFlush();
    }

    while (1) {
        printf("#last number : ");
        scanf("%d", endp);
        if (*endp <= 10000 && *endp > * startp && getchar() == '\n') {
            break;
        }
        else { ; }
        myFlush();
    }

    while (1) {
        printf("# gNum : ");
        scanf("%d", gNump);
        if (*gNump > 0 && *gNump <= 10 && getchar() == '\n') {
            break;
        }
        else { ; }
        myFlush();
    }

    return;
}

void myFlush()
{
    while (getchar() != '\n') {
        ;
    }
    return;
}

int transNumber(int num)
{
    if (num >= 1000) {
        num = (num / 1000) * ((num % 1000) / 100) * ((num % 100) / 10) * ((num % 10) / 1);
    }
    else if (num >= 100) {
        num = (num / 100) * ((num % 100) / 10) * ((num % 10) / 1);
    }
    else if (num >= 10) {
        num = (num / 10) * ((num % 10) / 1);
    }
    else { ; }
    return num;
}

void output(int start, int end, int gNum)
{
    int i, num, transN, count = 0, gNumTotal = 0;
    printf("numbers that process %d times\n", gNum);
    for (i = start; i <= end; i++) {
        num = i;
        transN = transNumber(num);
        while (transN > 10) {
            count++;
        }
    }
    if (count == gNum) {
        printf("%d\n", i);
        gNumTotal++;
    }
    else { ; }
    printf("total numbers : %d numbers", gNumTotal);
    return;
}

【问题讨论】:

  • 使用调试器。它会立即告诉你程序正在while (transN &gt; 10) { count++; } 中循环。这应该让你看到这显然是一个无限循环,因为transN 永远不会改变价值。这只是基本的调试 101。
  • 为什么你觉得有义务在所有if 语句中添加else { ; }?它给代码增加了不必要的混乱,但收益甚微。
  • 我被告知在编码中建议添加else{ ; },因为它告诉读者代码已经完成并且不会错误地错过 else 语句。猜猜我被教错了?还是老师的编码风格?
  • in function: myflush() about: while (getchar() != '\n') { 也应该检查 EOF
  • 关于; else { ; }这种说法无效。建议删除该语句的所有实例

标签: c digits multiplication


【解决方案1】:

你必须在循环中反复调用transNumber()。否则,transN 永远不会改变,因此循环永远不会结束。

打印i 的代码需要在for 循环内,并且您需要在每个while 循环之前将count 重置回0

for (i = start; i <= end; i++) {
    num = i;
    count = 0;
    while (num > 10) {
        num = transNumber(num);
        count++;
    }
    if (count == gNum) {
        printf("%d\n", i);
        gNumTotal++;
    }
}

你不需要:

else { ; }

在每个if 之后。如果条件为 false 时不需要执行任何操作,则将其省略即可。

【讨论】:

  • 很抱歉,关于这段代码,我能再问你一件事吗?我不太清楚为什么我不能使用transN 而必须使用num = transNumber(num)
  • 因为每次将数字相乘时,您都应该使用前一次相乘的结果。 transN = transNumber(num) 会重复乘以num 的数字,所以会一直得到相同的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-16
  • 1970-01-01
  • 2021-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多