不明白为什么我的循环不会超过2

时间:2013-12-06 11:00:11

标签: c loops

我正在尝试编写一个程序(c),输入是2到20之间的整数。 并且输出将是0到1之间的所有不可约分数,它们的分母< =(输入数字)。

例如:

input num=7 输出将是:

分母2

1/2

分母3

1/3
2/3

分母4

1/4
3/4

分母5

1/5
2/5
3/5
4/5

分母6

1/6
5/6

分母7

1/7
2/7
3/7
4/7
5/7
6/7

我的问题是第一个循环的计数器i不会超过2,并且j循环中的printf行不会发生 不能理解我做错了什么。 谢谢你的帮助。

int main()
{
    int num, i, k, j, a, b;
    printf("Please enter natural denominator < 20\n");
    scanf("%d", &num);

    for (i = 2; i < num ; i++) { /* loop for denomiator */
        printf("For denominator %d\n", i);

        for (k = 1; k < i; k++) { /* loop for numerator */
            for (j = k; j > 0; j--) {
                a = k % j;
                b = i % j;
                if (a == 0 && b == 0) {
                    printf("%d/%d", k, i); /* this line doesn't print for any input */
                }
            }
        }
    }
    return 0;
}

3 个答案:

答案 0 :(得分:0)

我想你应该通过包含标题来引入你的标准库函数原型:

#include <stdio.h>

我想,问题在于你使用的是64位系统(这在平台sizeof(int)!=sizeof(void*)上很重要),因为你没有包含函数{{1}的原型}和scanf,其所有参数(以及返回值)都被视为printf类型。

在包含标题的笔记本电脑上,您的代码没有问题。如果您有任何进一步的问题或只是包括标题不能解决您的问题,请让我知道,更好的方法让我重现您的问题。

此外,我猜您可能希望通过更改此行在输出中添加新行:

int

进入这个:

printf("%d/%d", k, i);

答案 1 :(得分:0)

除了你所描述的问题(starrify给出了解决方案)之外,你的逻辑还存在一个缺陷。

您可以多次打印它们,而不是跳过可以简化的条目。

这个问题可以通过像这样修改你最内层的循环来解决:

        int canBeSimplified = 0;
        for (j = k; j > 1; j--) {
            a = k % j;
            b = i % j;
            if (a == 0 && b == 0) {
                canBeSimlified = 1;
            }
        }
        if (!canBeSimplified) {
            printf("%d/%d\n", k, i); 
        }

答案 2 :(得分:0)

首先 - 将(i = 2; i < num ; i++)修复为(i = 2; i <= num ; i++),否则您的程序将无法处理最后一个号码。

其次 - "%d/%d\n"而不是"%d/%d"在不同的行上写数字。

第三,我修复了前两个,现在有了:

    Please enter natural denominator < 20
    3
    For denominator 2
    1/2
    For denominator 3
    1/3
    2/3
    Press any key to continue...

是的,如果您在构建和测试代码后对代码进行了一些更改,则必须在运行之前再次构建它。检查一下。