Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从用户输入中提取偶数,并在C程序中将它们合并为一个新的数_C - Fatal编程技术网

如何从用户输入中提取偶数,并在C程序中将它们合并为一个新的数

如何从用户输入中提取偶数,并在C程序中将它们合并为一个新的数,c,C,测试用例: 输入:1234 产出:24 输入:2468 产出:2468 输入:6 产出:6 我有以下代码: #include <stdio.h> #include <math.h> int main() { int num; printf("Enter a number: \n"); scanf("%d", &num); int numberLength = floor(log10(abs(num))) + 1; int

测试用例:

输入:1234 产出:24

输入:2468 产出:2468

输入:6 产出:6

我有以下代码:

#include <stdio.h>
#include <math.h>

int main() {
    int num;
    printf("Enter a number: \n");
    scanf("%d", &num);

    int numberLength = floor(log10(abs(num))) + 1;
    int inputNumberArray[numberLength];

    int evenNumberCount = 0;
    int even[10];//new even no. array

    int i = 0;
    do {
        inputNumberArray[i] = num % 10;
        num = num / 10;
        i++;
    } while (num != 0);

    i = 0;
    while (i < numberLength) {
        if (inputNumberArray[i] % 2 == 0) {
            evenNumberCount ++;
            even[i] = inputNumberArray[i];
        }
        i++;
    }
    printf("array count %d\n", evenNumberCount);

    i = 0;
    for (i = 0; i < 8; i++) {
        printf(" %d", even[i]);//print even array
    }

    i = 0;
    int result = 0;
    for (i = 0; i < 10; i++) {
        if (evenNumberCount == 1) {
            if (even[i] != 0) {
                result = even[i];
            } else {
                break;
            }
        } else {
            if (even[i] != 0) {
                result = result + even[i] * pow(10, i);
            } else
                 break;
        }
    }
    printf("\nresult is %d", result);
    /*
    int a = 0;
    a = pow(10, 2);
    printf("\na is %d", a);
    */
}
当我输入数字1234时,结果/结果是4,而不是24

但是,当我测试测试用例的其余部分时,一切正常

我认为错误的代码是:result=result+偶数[I]*pow10,I

你能帮忙吗?
提前谢谢。

你为什么要读数字? 最简单的算法是

作为文本阅读 验证 循环并确认是否可被2整除,然后实时打印 接下来,你试过调试吗? 调试会让您知道什么地方出错。最后一个问题是索引

evenNumberCount ++; /// this is technically in the wrong place. 
even[i]=inputNumberArray[i];  /// This is incorrect. 

正如用户Popeye所建议的,实现这一点的一种更简单的方法是将用户输入的全部内容作为字符串读入。通过这种方法,您可以遍历char数组中的每个字母,并使用isdigit方法查看字符是否为数字。然后,您可以轻松检查该数字是否为偶数

下面是我编写的一个快速源代码,用于展示这种方法的实际效果:

#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main()
{
    char input[100] = { '\0' };
    char outputNum[100] = { '\0' };

    // Get input from user
    printf("Enter a number: ");
    scanf_s("%s", input, sizeof(input));

    // Find the prime numbers
    int outputNumIndex = 0;
    for (int i = 0; i < strlen(input); i++)
    {
        if (isdigit(input[i]))
        {
            if (input[i] % 2 == 0)
            {
                outputNum[outputNumIndex++] = input[i];
            }
        }
    }

    if (outputNum[0] == '\0')
    {
        outputNum[0] = '0';
    }

    // Print the result
    printf("Result is %s", outputNum);

    return 0;
}

我想出了更容易理解的解决办法

#include <stdio.h>
#include <math.h>
#define INIT_VALUE 999
int extEvenDigits1(int num);
void extEvenDigits2(int num, int *result);
int main()
{
 int number, result = INIT_VALUE;

 printf("Enter a number: \n");
 scanf("%d", &number);
 printf("extEvenDigits1(): %d\n", extEvenDigits1(number));
 extEvenDigits2(number, &result);
 printf("extEvenDigits2(): %d\n", result);
 return 0;
}
int extEvenDigits1(int num)
{

    int result = -1;
    int count = 0; 
    while (num > 1) {
        int digit = num % 10;
        if (digit % 2 == 0) {
            result = result == -1 ? digit : result + digit * pow(10, count);
            count++;
        }
        num = num / 10;
    }

    return result;
}    
}

恐怕你把事情搞得太复杂了

您可以将数字作为字符串读取,并轻松地处理每个字符,从而生成另一个要打印的字符串

如果需要处理数字类型,有一个更简单的解决方案:

#include <stdio.h>

int main(void)
{
    // Keep asking for numbers until scanf fails.
    for (;;)
    {
        printf("Enter a number:\n");

        // Using a bigger type, we can store numbers with more digits.
        long long int number;

        // Always check the value returned by scanf.
        int ret = scanf("%lld", &number);
        if (ret != 1)
            break;

        long long int result = 0;

        // Use a multiple of ten as the "position" of the resulting digit. 
        long long int power = 1;

        // The number is "consumed" while the result is formed.
        while (number)
        {
            // Check the last digit of what remains of the original number
            if (number % 2 == 0)
            {
                // Put that digit in the correct position of the result
                result += (number % 10) * power;

                // No need to call pow()
                power *= 10;
            }

            // Remove the last digit.
            number /= 10;
        }

        printf("result is %lld\n\n", result);
    }
}

即使数字是偶数,数字的字符代码也不一定是偶数。这只是碰巧ASCII或UTF-8的情况。@busybee。。。如果偶数值数字没有偶数值代码点,您能否引用任何当前或历史上使用的字符编码?为了省去您的检查,EBCDIC遵循ASCII,因此Unicode具有此属性。@例如,KrisW是第一个以使用5位值开始的CCITT标准,目前仍在使用中。然而,有一个C编译器使用这种编码作为源字符集是值得怀疑的。@KrisW,但实际上这并不重要。因为字符代码数字不是数字,所以我认为通过字符代码计算数字属性来检查数字属性是错误的。@据我所知,这个好管闲事的人在文本处理和早期计算方面非常详细,没有销售过的计算机曾经使用过ITA-2作为内部存储格式——有很多原因,但是你可以考虑BCD对早期数据处理的重要性,看看为什么。当然,到1971年编写C时,一切都运行ASCII、EBCDIC或FIELDATA,所有这些都在一个连续的块中对其数字进行编码,其中偶数数字具有偶数代码值。