因此,对于下面的代码,我希望C程序在1到999之间显示奇数(不是3的倍数),一行中有9个。
1 5 7 11 13 17 19 23 25
29 31 .. and so on.
以下是我使用的代码。虽然我确实弄明白了如何使其工作 - if (i >=999) break;
行有帮助,但我不明白为什么i
超过999如果该断裂线不存在。换句话说,两个循环中的条件i < 999
都是无效的。
有人可以帮助我理解为什么会这样做吗?
我在课堂上使用Microsoft Visual Studio 2005。
#include <stdio.h>
void main(void)
{
int i, j;
for(i = 1; i < 999; i++)
{
for(j = 0; i < 999, j< 9; i++, j++)
{
if (i%2 == 0 || i%3 == 0) {
j = j-1;
if (i >=999) break;
continue;
}
printf("%-3d ", i);
if (j == 8) break;
}
printf("\n");
}
}
答案 0 :(得分:1)
因为原始代码有点复杂,我认为从头开始回答你的问题是最容易的。这是一个实现你想要的C代码,它比OP简单得多:
void main(void) {
int counter = 0;
for (int i=0; i < 1000; ++i) {
if (i % 2 != 0 && i % 3 != 0) { // if not even (i.e. odd) AND not divisible by 3
if (counter == 9) { // start a new line for each 9 numbers
printf("\n");
counter = 0; // reset the counter
}
printf("%-3d ", i);
++counter; // increment counter for each new number
}
}
}
我认为您不需要或应该在解决方案中使用双for
循环。您在for
循环中的条件也显得非常复杂。该解决方案对0到999之间的所有数字进行一次传递,并生成所需的输出。
答案 1 :(得分:1)
一种简单的方法是
int numbers_in_line=0;
for(int i=1;i<=999;i++)
{
if(i%2 && i%3) // not divisible by 2 as well as 3.
{
printf("%d ",i);
numbers_in_line++; // printed one number more
if(numbers_in_line==9)
{
printf("\n");
numbers_in_line=0; //reset for next line
}
}
}
在您的代码中,您可以轻松使用count
变量来记住您打印的数量。就是这样。
if(i%2==0 || i%3==0)
中的一件事现在,如果i = 6,它会打印出来但不应该打印出来。显然可以if(i%2!=0 && i%3!=0)
您的代码中的另一件事情很清楚,
答案 2 :(得分:0)
问题出在for循环的条件下。有两个条件i < 999, j < 9.
但它仅检查最后一个条件。
您想将其更改为for(j = 0; i < 999 && j< 9; i++, j++)
以检查两种情况
答案 3 :(得分:0)
仔细考虑表达。 i < 999 , j < 9
。在这里,首先i < 999
将被评估,之后j < 9
。但是,整个表达式的结果将仅由j < 9
的结果产生。请查看代码段,了解更多澄清:
#include <stdio.h>
int main()
{
int flag = (0,0);
printf("%i ",flag);
flag = (0,1);
printf("%i ",flag);
flag = (1,0);
printf("%i ",flag);
flag = (1,1);
printf("%i ",flag);
}
<强>输出:强> 0 1 0 1
正如您的代码中所提到的,如果 i 的值= 999,则 j 的值将显示为-1
,后者变为{{ 1}}在下一次迭代中,类似地, i 的值增加1。因此,0
的结果为i < 999
,0 or false
的结果为j < 9
。
因为,原始表达式为1 or true
,后者变为i < 999 , j < 9
,从上面的代码我们可以看到,它返回0,1
,这导致它进一步执行迭代。 / p>
答案 4 :(得分:0)
你内心循环中的条件:
for(j = 0; i < 999, j< 9; i++, j++) {
// ...
}
i < 999, j< 9
是否使用经常被误解的逗号运算符。表达式的计算方式是:
i < 999
,然后忽略结果(实际上,表达式的这一部分是一个nop,因为没有副作用)j < 9
被评估,这是表达式的结果如果要在表达式中使用这两个条件,则需要使用逻辑And运算符:
i < 999 && j < 9
但是,由于i
未在内循环中修改,因此没有理由在该循环的条件中检查它 - 外部循环将阻止在i < 999
失败时执行内循环。