8 svar
384 visningar
Farbrorgul 408
Postad: 11 mar 2021 16:41

Modulo - Kattis C#

Hej! Skulle behöva hjälp med följande uppgift.

Har suttit i flera timmar men kommer ingenstans.

 

Kan någon hjälpa mig?

Farbrorgul 408
Postad: 11 mar 2021 16:46 Redigerad: 11 mar 2021 16:47

Gjort detta hittills. Vet dock att det är helt fel.

using System;

namespace Problemlösning
{
    class Program
    {
        static void Main(string[] args)
        {
            int räknare = 0;
            int[] tal = new int[10];

            int[] rest = new int[10];

            Console.WriteLine("Skriv tio positiva heltal under 1000: ");

            for (int i = 0; i < tal.Length; i++)
            {
                tal[i] = int.Parse(Console.ReadLine());

                rest[i] = tal[i] % 42;
            }

            Console.WriteLine(räknare);

            Console.ReadKey();
        }
    }
}
Laguna Online 30472
Postad: 11 mar 2021 17:06

Vet du hur man räknar ut modulo i C#? 

Farbrorgul 408
Postad: 11 mar 2021 17:24
Laguna skrev:

Vet du hur man räknar ut modulo i C#? 

Ja, man använder %.

Laguna Online 30472
Postad: 11 mar 2021 17:35

Hur skulle du lösa uppgiften för hand med exempelinput 3?

Farbrorgul 408
Postad: 11 mar 2021 17:41
Laguna skrev:

Hur skulle du lösa uppgiften för hand med exempelinput 3?

Skulle ta talen%42 och se om deras rest är unik eller inte. Om den är unik så adderar jag 1 till räknaren. Om den inte är unik så gör jag det inte. Vet dock inte hur jag ska implementera detta i kod...

Farbrorgul 408
Postad: 11 mar 2021 17:46

Lyckades lösa den med HashSet (har aldrig hört talas om det innan men Googlade). Skulle dock vilja kunna lösa den med två for-loopar också.

using System;
using System.Collections.Generic;

namespace Problemlösning
{
    class Program
    {
        static void Main(string[] args)
        {
            int räknare = 0;
            int[] tal = new int[10];

            HashSet<int> modulus = new HashSet<int>();

            Console.WriteLine("Skriv tio positiva heltal under 1000: ");

            for (int i = 0; i < tal.Length; i++)
            {
                tal[i] = int.Parse(Console.ReadLine());

                modulus.Add(tal[i] % 42);
            }

            foreach (int uniktTal in modulus)
            {
                räknare++;
            }

            Console.WriteLine(räknare);

            Console.ReadKey();
        }
    }
}
Laguna Online 30472
Postad: 12 mar 2021 00:39

Du måste i alla fall spara vad du har sett tidigare för att kunna avgöra om ett tal modulo 42 är nytt eller inte.

Ett sätt är att spara de tio talen (eller talen % 42) i en vektor och gå igenom den när du har alla tal.

Ett annat är att ha en vektor på 42 element och markera i den om ett tal har förekommit. Då behövs bara en for-loop efteråt. Det är likt det du gör nu, men med primitivare medel. 

dduni 7 – Fd. Medlem
Postad: 12 mar 2021 08:10 Redigerad: 12 mar 2021 08:29
Farbrorgul skrev:
Laguna skrev:

Hur skulle du lösa uppgiften för hand med exempelinput 3?

Skulle ta talen%42 och se om deras rest är unik eller inte. Om den är unik så adderar jag 1 till räknaren. Om den inte är unik så gör jag det inte. Vet dock inte hur jag ska implementera detta i kod...

Denna lösning implementerad i kod:

using System.IO;
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {

        List<int> rester = new List<int>();

        Console.WriteLine("Skriv tio positiva heltal under 1000: ");

        for (int i = 0; i < 10; i++)
        {
            int rest = int.Parse(Console.ReadLine()) % 42;
            
            bool restFinnsRedan = false;
            
            for (int j = 0; j < rester.Count; j++) 
            {
                if (rester[j] == rest) {
                    restFinnsRedan = true;
                }
            }
            
            if (restFinnsRedan == false) 
            {
                rester.Add(rest);    
            }
        }

        Console.WriteLine(rester.Count);
        
    }
}

.Count är en Listvariabel som returnerar listans längd. Problemet med att använda en vanlig array (int[] rest = new int[10];) är att den initieras med 10 nollor. Detta går att lösa ändå men är kräver lite jobb, att använda ett dynamiskt objekt som en List förenklar en hel del (finns många sådana, ArrayList, vektor, Hashmap bland annat).

 

En alternativ lösningsgång som redan har nämnts:

using System.IO;
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        int räknare = 0;

        int[] rest = new int[42];

        Console.WriteLine("Skriv tio positiva heltal under 1000: ");

        for (int i = 0; i < 10; i++)
        {
            int index = int.Parse(Console.ReadLine()) % 42;
            rest[index] = 1;
        }

        foreach (int tal in rest)
        {
            if (tal != 0) {
                räknare++;
            }
        }

        Console.WriteLine(räknare);
        
    }
}
Svara
Close