【发布时间】:2021-12-30 15:31:42
【问题描述】:
列表必须显示“1,2,3,4”,但在这段代码中显示为“1,,2,,,3,,,4” 这段代码有什么问题?
for (i = 1; i <= num1; ++i) {
if(num1 % i == 0)
printf("%d",i);
if(i<num1)
printf(",");
}
【问题讨论】:
列表必须显示“1,2,3,4”,但在这段代码中显示为“1,,2,,,3,,,4” 这段代码有什么问题?
for (i = 1; i <= num1; ++i) {
if(num1 % i == 0)
printf("%d",i);
if(i<num1)
printf(",");
}
【问题讨论】:
只有在打印数字时才需要打印逗号,所以把它放在同一个if中。
for(i = 1; i <= num1; ++i) {
if(num1 % i == 0){
printf("%d",i);
if(i<num1)
printf(",");
}
}
【讨论】:
问题是您正在打印,,即使是未通过检查的数字
固定:
for (i = 1; i <= num1; ++i) {
if (num1 % i == 0) {
printf("%d", i);
if (i < num1)
printf(",");
}
}
printf("\n");
以上依赖于通过检查的最后一个元素。因为是这样,所以可以简化为:
for (i = 1; i < num1; ++i) {
if (num1 % i == 0) {
printf("%d,", i);
}
}
printf("%d\n", num1);
但是,一般来说,您不能依赖最后一个通过检查的数字。以下是一种更通用的方法,不依赖于通过检查的最后一个数字:
const char *prefix = "";
for (i = 1; i <= num1; ++i) {
if (num1 % i == 0) {
printf("%s%d", prefix, i);
prefix = ",";
}
}
printf("\n");
【讨论】:
或者比上面更有效:
for (i = 1; i < num1; ++i) {
if (num1 % i == 0) {
printf("%d,",i);
}
}
printf("%d",num1);
换句话说:
i < num1
num1 % i == 0
【讨论】:
为了避免 if 或条件运算符 (?:),我通常只打印循环外的第一项
printf("1"); // 1
for (i = 2; i <= num1; ++i) { // note: start at 2
if (num1 % i == 0) {
printf(", %d", i); // , 2, 3, 4, ..., n
}
}
printf("\n"); // newline
【讨论】:
这是一个非常简短的版本,使用三元运算符:
#include <stdio.h>
int main(void) {
int num1=24;
for (int i = 1; i <= num1; ++i)
printf((num1%i)? "": "%d%s", i, (i<num1)? "," : "");
return 0;
}
输出:
Success #stdin #stdout 0s 5660KB
1,2,3,4,6,8,12,24
【讨论】: