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?
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();
}
}
}
Vet du hur man räknar ut modulo i C#?
Laguna skrev:Vet du hur man räknar ut modulo i C#?
Ja, man använder %.
Hur skulle du lösa uppgiften för hand med exempelinput 3?
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...
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();
}
}
}
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.
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);
}
}