如果我可以提出一个稍微不同的方法:
#include <stdio.h>
int main( void )
{
int num;
int divisors[] = {2, 3, 4, 5};
size_t numDivisors = sizeof divisors / sizeof divisors[0];
int isDivisible = 0;
printf( "Gimme a number: " );
fflush( stdout );
if ( scanf( "%d", &num ) == 1 )
{
size_t i;
for ( i = 0; i < numDivisors; i++ )
{
if ( !(num % divisors[i]) )
{
printf( "%d is divisible by %d\n", num, divisors[i] );
isDivisible = 1;
}
}
}
else
{
fprintf( stderr, "Bad input, exiting\n" );
exit( 0 );
}
if ( !isDivisible )
{
char *sep = "";
size_t i;
printf( "%d is not divisible by any of ", num );
for ( i = 0; i < numDivisors; i++ )
{
printf( "%s%d", sep, divisors[i] );
if ( i == numDivisors - 2 )
sep = ", or ";
else
sep = ", ";
}
putchar( '\n' );
}
return 0;
}
样本输出:
[fbgo448@n9dvap997]~/prototypes/div: ./div
Gimme a number: 19
19 is not divisible by any of 2, 3, 4, or 5
[fbgo448@n9dvap997]~/prototypes/div: ./div
Gimme a number: 18
18 is divisible by 2
18 is divisible by 3
我们没有为每个测试的结果创建单独的变量,而是简单地循环遍历除数列表,并在执行过程中打印结果。我们使用isDivisible 标志跟踪是否有任何除数起作用。
这种方法有两个优点。首先,它更紧凑,更易于维护。其次,您可以通过简单地向divisors 初始化程序添加更多项目来更改除数的数量及其值,而无需更改任何程序逻辑本身(无论如何)。例如,如果您想添加对 7 的检查,您只需更改
int divisors[] = {2, 3, 4, 5};
到
int divisors[] = {2, 3, 4, 5, 7};
并重新编译。
鉴于您使用的是conio.h,您显然是在使用 MSVC 或 Turbo C 或类似工具的 DOS/Windows 平台上。此代码应该在这些编译器下编译,尽管您可能需要包含 stdlib.h 或其他内容才能获得 size_t 的定义。
就本练习而言,您不需要来自conio 的任何内容。如果您在命令行窗口中启动程序(而不是从 IDE 启动它),则不需要 getch 语句来保持窗口打开。
编辑
这个版本更简洁一些 - 我将输入和处理与输出分开。它需要将isDivisible 变成一个数组并添加一个计数器,但我认为从风格的角度来看它会更好。
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
int num;
int divisors[] = {2, 3, 4, 5};
size_t numDivisors = sizeof divisors / sizeof divisors[0];
int isDivisible[sizeof divisors/sizeof divisors[0]] = {0};
size_t divCount = 0;
size_t i;
/**
* INPUT
*/
printf( "Gimme a number: " );
fflush( stdout );
if ( scanf( "%d", &num ) != 1 )
{
fprintf( stderr, "Bad input\n" );
exit( 0 );
}
/**
* PROCESSING
*/
for ( i = 0; i < numDivisors; i++ )
{
divCount += (isDivisible[i] = !(num % divisors[i]));
}
/**
* OUTPUT
*/
printf( "%d is ", num );
if ( !divCount )
{
char *sep = "";
printf( "not divisible by any of " );
for ( i = 0; i < numDivisors; i++ )
{
printf( "%s%d", sep, divisors[i] );
if ( i == numDivisors - 2 )
sep = ", or ";
else
sep = ", ";
}
}
else
{
printf( "divisible by " );
char *sep = "";
for ( i = 0; i < numDivisors; i++ )
{
if ( isDivisible[i] )
{
printf( "%s%d", sep, divisors[i] );
if ( --divCount > 1 )
sep = ", ";
else
sep = " and ";
}
}
}
putchar( '\n' );
return 0;
}
样本输出:
[fbgo448@n9dvap997]~/prototypes/div: ./div
Gimme a number: 20
20 is divisible by 2, 4 and 5
[fbgo448@n9dvap997]~/prototypes/div: ./div
Gimme a number: 19
19 is not divisible by any of 2, 3, 4, or 5