我正在尝试编写一个程序(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;
}
答案 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...
是的,如果您在构建和测试代码后对代码进行了一些更改,则必须在运行之前再次构建它。检查一下。