문제

나는 문제를 해결하려고 노력하고 있습니다 projecteuler.net 그러나 나는 계속 몇 가지 문제를 계속하고 있습니다.

첫 번째는 큰 요소를 List<t>. 목록에 대량을 저장할 때 계속 MemoryException이 계속되고 있습니다.

이제 나는 최선의 방법으로 이런 일을하지 않을 수도 있지만 앱이 소비 할 수있는 메모리를 정의하는 방법이 있습니까?

일반적으로 10 만,000,000 요소를 얻을 때 충돌합니다 : S

둘째, 일부 질문에는 엄청난 숫자가 추가되어야합니다. 나는 숫자가 매우 커질 것이라고 생각하는 Ulong 데이터 유형을 사용하지만, 여전히 가장 큰 지원되는 int를지나 마이너스로 얻을 수 있습니다.

엄청나게 많은 숫자로 작업하기위한 팁이 있습니까?

도움이 되었습니까?

해결책

다른 팁

일부 기본 수학 원칙을 사용하여 이러한 작업을 분할하는 다수의 클래스를 사용해야합니다. 이것 C# biginteger 라이브러리 구현 CodePoject에서 가장 유망한 것 같습니다. 이 기사는 대량 숫자로 작동하는 방식에 대한 좋은 설명이 있습니다.

또한 참조 :C#의 큰 정수

Project Euler가가는 한, 당신이 외부에서 예외를 밟을 경우 잘못된 나무를 짖을 수 있습니다. 그들의 웹 사이트에서 :

각 문제는 "1 분 규칙"에 따라 설계되었으며, 이는 더 어려운 문제로 성공적인 알고리즘을 설계하는 데 몇 시간이 걸릴 수 있지만 효율적인 구현을 통해 적당히 전원이 공급 된 컴퓨터에서 솔루션을 얻을 수 있습니다. 1 분 미만.

사용자 Jakers가 말했듯이, 큰 숫자를 사용하고 있다면 아마도 잘못하고있을 것입니다.

내가 한 Projecteuler 문제 중에서 지금까지 큰 수학이 필요하지 않았습니다. 큰 수치를 피하기 위해 적절한 알고리즘을 찾는 것입니다.

힌트를 원하십니까? 여기에 게시하면 흥미로운 오일러 스레드가 시작될 수 있습니다.

이게 C#이라고 생각해? F#은 이러한 문제 (큰 유형 및 게으른 시퀀스)를 처리하는 방법으로 내장되어 있습니다.

원하는 경우 C#의 F# 기술을 모두 사용할 수 있습니다. Core F# 어셈블리에 대한 참조를 추가하면 큰 유형이 다른 언어에서 합리적으로 사용할 수 있습니다.

게으른 시퀀스는 기본적으로 구문 친화적 인 열거 자입니다. 목록에 100,000,000의 요소를 넣는 것은 훌륭한 계획이 아니므로 솔루션을 다시 생각하여이를 해결해야합니다. 정보를 유지할 필요가 없다면 버리십시오! 저장하는 것보다 다시 컴퓨팅하는 것이 저렴하다면 버리십시오!

이것의 답변을 참조하십시오 . 아마도 타사 대형 정수 라이브러리/클래스 중 하나를 사용하거나 기본 BigInteger 데이터 유형이 포함 된 C# 4.0을 기다려야 할 것입니다.

앱이 사용할 메모리의 양을 정의하는 한 사용하여 작업을 수행하기 전에 사용 가능한 메모리를 확인할 수 있습니다. MemoryFailPoint 수업.

이렇게하면 작업을 수행하기 전에 메모리를 Prealloced로 만들 수 있으므로 작동이 실행되기 전에 작동이 실패하는지 확인할 수 있습니다.

BigInteger를 사용할 필요가 없습니다.이 이벤트를 문자열 배열로 할 수 있습니다.

class Solution
{

    static void Main(String[] args)
    {
        int n = 5;
        string[] unsorted = new string[6] { "3141592653589793238","1", "3", "5737362592653589793238", "3", "5" };

        string[] result = SortStrings(n, unsorted);

        foreach (string s in result)
            Console.WriteLine(s);
        Console.ReadLine();
    }
    static string[] SortStrings(int size, string[] arr)
    {

        Array.Sort(arr, (left, right) =>
        {

            if (left.Length != right.Length)
                return left.Length - right.Length;
            return left.CompareTo(right);
        });

        return arr;
    }
}
string Add(string s1, string s2)
{
        bool carry = false;
        string result = string.Empty;

        if (s1.Length < s2.Length)
            s1 = s1.PadLeft(s2.Length, '0');
        if(s2.Length < s1.Length)
            s2 = s2.PadLeft(s1.Length, '0');

        for(int i = s1.Length-1; i >= 0; i--)
        {
            var augend = Convert.ToInt64(s1.Substring(i,1));
            var addend = Convert.ToInt64(s2.Substring(i,1));
            var sum = augend + addend;
            sum += (carry ? 1 : 0);
            carry = false;
            if(sum > 9)
            {
                carry = true;
                sum -= 10;
            }
            result = sum.ToString() + result;
        }
        if(carry)
        {
            result = "1" + result;
        }

    return result;
}

그것이 그것을 처리하는 좋은 방법인지 확실하지 않지만 프로젝트에서 다음을 사용합니다.

각 항목에 대해 "Double ThereLevantNumber"변수와 "int powerOften"이 있으며 관련 클래스에는 "int relatedDecimals"변수가 있습니다.

그래서 ... 많은 숫자가 발생하면 다음과 같이 처리됩니다.

먼저 그들은 x, yyy 양식으로 변경됩니다. 따라서 숫자 123456,789가 입력되고 "파워로 된"이 10이면 다음과 같이 시작합니다.

TherelevantNumber = 123456,789 PowerOften = 10 숫자는 다음과 같습니다. 123456,789*10^10

그런 다음 : 1,23456789*10^15로 변경됩니다.

그런 다음 관련 소수의 수 (예 : 5)에서 1,23456의 수로 반올림 된 다음 "PowerOften = 15"와 함께 저장됩니다.

숫자를 함께 추가하거나 하위를 추가 할 때 관련 데시 몰 이외의 숫자는 무시됩니다. 당신이 복용하는 경우 의미 :

1*10^15 + 1*10^10 "relatedDecimals"가 5 인 경우 1,00001로 변경되지만 "관련 대상"이 4 인 경우 전혀 변경되지 않습니다.

이 방법을 사용하면 D

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top