簡體   English   中英

我們是否必須創建一個偶數和一個奇數數組?

[英]Do we have to create an even and an odd array?

我們如何修改以下代碼(最初要求用戶輸入 10 個數字,將其存儲在數組中,然后打印在屏幕上),以便在第一行打印偶數,在第二行打印奇數:

#include <stdlib.h>
#include <stdio.h>
int i,j;
int array_1[10];
int main() {
    for(i=0;i<10;i++) {
    printf("Enter a number: ");
        scanf("%d", &array_1[i]);
    }
    printf("The elements of the array are: ");
    for (j=0;j<10;j++) {
        printf("%d ", array_1[j]);
    }
    printf("\n");
    return 0;
}

無需創建新數組。 您可以通過它首先檢查偶數,然后再檢查奇數,只需 go。 此外,在使用 i 和 j 之前無需聲明它們。 您可以聲明它們並在 for 循環中初始化它們:

#include <stdlib.h>
#include <stdio.h>
int array_1[10];
int main() {
    for(int i=0;i<10;i++) {
    printf("Enter a number: ");
        scanf("%d", &array_1[i]);
    }
    printf("The elements of the array are: ");
    
    // Print even numbers
    for (int j=0;j<10;j++) {
        if(array_1[j] % 2 == 0)
            printf("%d ", array_1[j]);
    }
    printf("\n");

    // Print odd numbers
    for (int j=0;j<10;j++) {
        if(array_1[j] % 2 != 0)
            printf("%d ", array_1[j]);
    }
    printf("\n");
    return 0;
}

編輯:正如 tadman 在下面的評論中建議的那樣,有一種更好、更清潔的方法來完成這種任務。 正如您在上面的示例中所看到的,我重復了 4 行代碼,其中只有一個字符發生了變化。 可以將此任務抽象為 function 以減少代碼重復:

void printIfMod(int* arr, size_t array_size, int mod){
    for (int j=0;j<array_size;j++) {
        if(arr[j] % 2 != mod)
            continue;
        printf("%d ", arr[j]);
    }
    printf("\n");

如果將 function 放在 main 之后,請記住在 main 之前添加 function 原型:

void printIfMod(int* arr, size_t array_size, int mod);
int main(){...}

現在,要打印數字,調用模 0 得到偶數和 1 得到奇數的方法:

// Print even numbers
void printIfMod(&array_1, 10, 0);

// Print odd numbers
void printIfMod(&array_1, 10, 1);

最后一點,硬編碼array_size是不明智的,這適用於所有 arrays。 我建議使用sizeof()動態計算數組的大小:

size_t size = sizeof(array_1) / sizeof(int);
// Print even numbers
void printIfMod(&array_1, size, 0);

// Print odd numbers
void printIfMod(&array_1, size, 1);

O(n) 解決方案:

您必須在數組的后面添加奇數並在數組的前面添加偶數並跟蹤索引。


int array_1[10];

int main() {

    int even = 0, odd = 10;

    for (int i = 0; i < 10; i++) {
        printf("Enter a number: ");
        int inp;
        scanf("%d", &inp);
        if (inp % 2 == 0) {
            array_1[even++] = inp;
        } else {
            array_1[--odd] = inp;
        }
    }

    // even numbers
    for (int i = 0; i < even; i++) {
        printf("%i ", array_1[i]);
    }
    printf("\n");

    // odd numbers
    for (int i = 9; i >= odd; i--) {
        printf("%i ", array_1[i]);
    }
    printf("\n");

    return 0;
}

既然你問了,這就是我的做法。 我懷疑這可能會給您留下比答案更多的問題。

#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>

#define NUMBERS_SIZE 10

typedef bool (*number_validator)(int num);

bool isEven(int num)
{
    return (num & 1) == 0;
}

bool isOdd(int num)
{
    return (num & 1) != 0;
}

void print(const char *title, int *array, int array_size, number_validator isValid)
{
    printf("%s", title);
    bool first = true;
    for (int i = 0; i < array_size; ++i)
    {
        if (isValid(array[i]))
        {
            if (!first)
            {
                printf(", ");
            }
            printf("%d", array[i]);
            first = false;
        }
    }
    printf("\n");
}

int main()
{
    int numbers[NUMBERS_SIZE] = { 0 };

    for (int i = 0; i < NUMBERS_SIZE; i++)
    {
        printf("Enter a number: ");
        scanf("%d", &numbers[i]);
    }

    printf("\n");
    print("Even: ", numbers, NUMBERS_SIZE, isEven);
    print(" Odd: ", numbers, NUMBERS_SIZE, isOdd);

    return 0;
}

ideone 上的演示

您可以嘗試這種方式。我使用二進制 AND(&) 而不是 MOD(%) 因為它更快:

#include <stdlib.h>
#include <stdio.h>
int i,j;
int array_1[10];

int main()
{
for(i=0; i<10; i++)
{
  printf("Enter a number: ");
  scanf("%d", &array_1[i]);
}

printf("The Even elements of the array are: ");

for (j=0; j<10; j++)
{
    if((array_1[j]&1) == 0)
        printf("%d ", array_1[j]);
}

printf("\nThe Odd elements of the array are: ");

for (j=0; j<10; j++)
{
    if((array_1[j]&1) != 0)
        printf("%d ", array_1[j]);
}

printf("\n");
return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM