计算数字中的奇数和偶数

时间:2017-04-12 09:31:54

标签: c#

我尝试编写检查奇数和偶数之间比率的程序 给定数字中的数字。我在使用这段代码时遇到了一些问题:

static void Main(string[] args)
{
    int countEven = 0 ;
    int countOdd = 0 ;
    Console.WriteLine("insert a number");
    int num = int.Parse(Console.ReadLine());
    int length = num.GetLength;
    for (int i = 0;i<length ; i++)
    {
        if((num/10)%2) == 0)
        int countEven++;
    }
}

任何想法?

6 个答案:

答案 0 :(得分:3)

问题是procq: image: hub_ui:latest environment: ENV: qa1 RUNPROCQ: "false" # this is to stop the proc q from running straight away - the refresh_db.sh script will set this to true once it has finished loading the fixtures links: - db:local.database.hub - cache:local.cache.hub command: /var/www/hub/process-queue-runner.sh 没有长度,只有它的字符串表示有一个。作为m.rogalski答案的替代,您可以将输入视为字符串以获取所有数字一个人。一旦你有了一个数字,然后将其解析为int并检查它是偶数还是奇数。这将是这样的:

int

答案 1 :(得分:2)

Linq方法

Console.WriteLine("insert a number");
string num = Console.ReadLine(); // check for valid number here?
int countEven = num.Select(x => x - '0').Count(x => x % 2 == 0);
int countOdd = num.Select(x => x - '0').Count(x => x % 2 != 0);

答案 2 :(得分:1)

我们假设您的输入是:123456
现在你所要做的就是从除法中得到模数:int m = num % 10;
之后,只需检查是否bool isEven = m % 2 == 0;
最后,您必须将输入数字除以10,并重复整个过程直到数字结束。

int a = 123456, oddCounter = 0, evenCounter = 0;
do
{
    int m = a % 10;
    switch(m % 2)
    {
        case 0:
            evenCounter++;
            break;

        default: // case 1:
            oddCounter++;
            break;
    }
    //bool isEven = m % 2 == 0;
}while( ( a /= 10 ) != 0 );

Online example

答案 3 :(得分:1)

对您的代码进行了一些小改动,它完美无缺

int countEven = 0;
int countOdd = 0;
Console.WriteLine( "insert a number" );
char[] nums = Console.ReadLine().ToCharArray();
for ( int i = 0; i < nums.Length; i++ )
{
    if ( int.Parse( nums[i].ToString() ) % 2 == 0 )
    {
        countEven++;
    }
    else
    {
        countOdd++;
    }
}

Console.WriteLine($"{countEven} even numbers \n{countOdd} odd numbers");
Console.ReadKey();

我所做的是将每个数字作为数组char[]中的一个字符,然后循环遍历此数组并检查它是否为偶数。

答案 4 :(得分:0)

static void Main(string args[]) {
        WriteLine("Please enter a number...");
        var num = ReadLine();

        // Check if input is a number
        if (!long.TryParse(num, out _)) {
            WriteLine("NaN!");
            return;
        }

        var evenChars = 0;
        var oddChars = 0;

        // Convert string to char array, rid of any non-numeric characters (e.g.: -)
        num.ToCharArray().Where(c => char.IsDigit(c)).ToList().ForEach(c => {
            byte.TryParse(c.ToString(), out var b);
            if (b % 2 == 0)
                evenChars++;
            else
                oddChars++;
        });

        // Continue with code

    }

修改 您也可以使用方法体内的辅助(本地)函数来执行此操作:

static void Main(string args[]) {
        WriteLine("Please enter a number...");
        var num = ReadLine();

        // Check if input is a number
        if (!long.TryParse(num, out _)) {
            WriteLine("NaN!");
            return;
        }

        var evenChars = 0;
        var oddChars = 0;

        // Convert string to char array, rid of any non-numeric characters (e.g.: -)
        num.ToCharArray().Where(c => char.IsDigit(c)).ToList().ForEach(c => {
            byte.TryParse(c.ToString(), out var b);
            if (b % 2 == 0)
                evenChars++;
            else
                oddChars++;

            // Alternative method:
            IsEven(b) ? evenChars++ : oddChars++;
        });

        // Continue with code

        bool IsEven(byte b) => b % 2 == 0;
    }
  

为什么我要使用字节?

处理数字时,最好使用不占用RAM的数据类型。 当然,如今可能存在多个100千兆字节的问题,但这是一个不可忽视的问题。 整数占用32位(4字节)RAM,而字节占用一个字节(8位)。

想象一下你正在处理1 mio。一位数字,并将它们分配给整数。您正在使用4 MiB的RAM,而该字节仅消耗1 MiB用于1 mio。数字。

看起来像一位数的数字(在这种情况下使用)只能达到9(0-9),你会浪费28位内存的潜力(2 ^ 28) - 而一个字节最多只能达到255(0-255),你只会浪费一点四位(2 ^ 4)的内存。

答案 5 :(得分:0)

如果输入数字是32位整数(用户选择数字的长度) 如果询问:

  1. 输入数字中的偶数位数
  2. 输入数字中奇数位的乘积
  3. 输入数字的所有数字之和
private void button1_Click(object sender, EventArgs e) {

    int num = ConvertToInt32(textBox1.Text);
    int len_num = textBox1.Text.Length;
    int[] arn = new int[len_num];
    int cEv = 0; pOd = 0; s = 0;

    for (int i = len_num-1; i >= 0; i--) { // loop until integer length is got down to 1
        arn[i] = broj % 10; //using the mod we put the last digit into a declared array
        if (arn[i] % 2 == 0) { // then check, is current digit even or odd  
            cEv++; // count even digits
        } else { // or odd
            if (pOd == 0) pOd++; // avoid product with zero
            pOd *= arn [i]; // and multiply odd digits
        }
        num /= 10; // we divide by 10 until it's length is get to 1(len_num-1)
        s += arn [i]; // sum of all digits 
    }
    // and at last showing it in labels...
    label2.Text = "a) The even digits count is: " + Convert.ToString(cEv);
    label3.Text = "b) The product of odd digits is: " + Convert.ToString(pOd);
    label4.Text = "c) The sum of all digits in this number is: " + Convert.ToString(s);
}

我们在界面中需要的是用于输入数字的文本框,用于任务的按钮以及用于显示获得的结果的标签。当然,如果我们为for这样的for (int i = 0; and <= len_num-1; i++)循环使用经典形式,则会得到相同的结果-因为本质是计算偶数或奇数位,而不是数字输入到序列中的顺序数组