C# :: Aufgabe #184

4 Lösungen Lösungen öffentlich

Wurzel ziehen mit Intervallschachtelung

Anfänger - C# von Felix - 11.07.2017 um 21:30 Uhr
Schreibe eine Methode die aus einer Zahl die Wurzel zieht, benutze dafür die Intervallschachtelung.

Lösungen:

vote_ok
von Serul (60 Punkte) - 13.07.2017 um 09:59 Uhr
Quellcode ausblenden C#-Code
using System;

public class Program
{
	public static void Main()
	{
		
		double number = 99;
		int intervalIterations = 100;
		
		
		double root = number/2;
		double lowerIntervalLimit = 0;
		double upperIntervalLimit = number;
		
		for (int i = 0; i <= intervalIterations; i++) {
		
			if (Math.Pow(root,2) < number) {
				
				lowerIntervalLimit = root;
				root = (root+upperIntervalLimit)/2;
			
			} else if (Math.Pow(root,2) > number) {
			
				upperIntervalLimit = root;
				root = (root+lowerIntervalLimit)/2;
			
			} else {
			
				break;
			
			}
				
		}
		
                Console.WriteLine("Die Wurzel aus {0} lautet {1}" , number, root);
		
	}

}
vote_ok
von hollst (6440 Punkte) - 14.07.2017 um 10:20 Uhr
Quellcode ausblenden C#-Code
using System;
using static System.Console;

namespace wurzel_184    {

    public static class Program    {

        static void Main()        {
          
            double zahl = 70.12345678;
            ("wurzel(" + zahl.ToString() + ") = " + zahl.wurzel(20).ToString()).EndMessage();

            zahl = 0.12345678;
            ("wurzel(" + zahl.ToString() + ") = " + zahl.wurzel(20).ToString()).EndMessage();

            zahl = 4.0;
            ("wurzel(" + zahl.ToString() + ") = " + zahl.wurzel(20).ToString()).EndMessage();

            zahl = -4.0;
            ("wurzel(" + zahl.ToString() + ") = " + zahl.wurzel(20).ToString()).EndMessage();

        }

        static double wurzel(this double zahl, int nachkommastellen)    {

            if (zahl < 0.0)
                return double.NaN;

            double 
                delta = 1.0, 
                start = 0.0, 
                merker = start, 
                grenze = 1.0 / Math.Pow(10.0, nachkommastellen);

            do            {

                while(start * start < zahl) {
                    merker = start;
                    start += delta;
                };

                start = merker;
                delta /= 10.0;

            } while ((grenze < delta) && (delta > 1.0E-15)); 
                       
            return start;
        }

        static void EndMessage(this string s)
        { WriteLine(s); ReadKey(true); }
    }    
}
vote_ok
von daniel59 (2700 Punkte) - 24.07.2017 um 12:02 Uhr
Quellcode ausblenden C#-Code
using System;

namespace ConsoleIntervallschachtelung
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("----- Wurzel ziehen mit Intervallschachtelung -----");
            Console.Write("Geben Sie eine positve Zahl ein: ");
            decimal d;
            if (decimal.TryParse(Console.ReadLine(), out d) && d >= 0)
            {
                Console.Write("Anzahl der Nachkommastellen (0-14): ");
                int decimals;
                if (int.TryParse(Console.ReadLine(), out decimals) && decimals >= 0 && decimals <= 14)
                {
                    decimal sqrt = Sqrt(d, decimals);
                    Console.WriteLine($"Die Wurzel von {d} ist ungefähr: {sqrt}");
                }
                else
                {
                    Console.WriteLine("Fehlerhafte Eingabe");
                }
            }
            else
            {
                Console.WriteLine("Fehlerhafte Eingabe");
            }
            Console.ReadLine();
        }

        static decimal Sqrt(decimal d, int decimals, int currentDecimals = 0, decimal start = 0)
        {
            if (d < 0)
            {
                return decimal.MinusOne;
            }

            decimal increment = (decimal)Math.Pow(10, -currentDecimals);
            for (decimal i = start; i < int.MaxValue; i += increment)
            {
                decimal a = Math.Round((decimal)Math.Pow((double)i, 2), currentDecimals * 2);
                decimal b = Math.Round((decimal)Math.Pow((double)(i + increment), 2), currentDecimals * 2);
                if (a == d)
                {
                    return i;
                }
                else if (b == d)
                {
                    return i + increment;
                }
                else if (a < d && d < b)
                {
                    if (currentDecimals >= decimals)
                    {
                        return Math.Round(i, decimals);
                    }
                    return Math.Round(Sqrt(d, decimals, currentDecimals + 1, i), decimals);
                }
            }

            return decimal.MinusOne;
        }
    }
}
1 Kommentar
vote_ok
von drumler (40 Punkte) - 27.07.2017 um 15:49 Uhr
Quellcode ausblenden C#-Code
Console.WriteLine("From which number you wanna extract the root?");
                double number = Convert.ToDouble(Console.ReadLine());
                Console.WriteLine("Which kind of root you wanna extract?");
                double root = Convert.ToDouble(Console.ReadLine());
                double exponent = 1 / root;
                double result;

                if (number >= 0)
                {
                    result = Math.Pow(number, exponent);
                    Console.WriteLine("Result:" + result.ToString());
                }
                else
                    Console.WriteLine("You can not extract a root with a negativ number ");