Member 13294470 Ответов: 2

Помогите мне улучшить мой код...


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Prime_digit_replacements
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Enter number of members of the family: ");
            int fn = int.Parse(Console.ReadLine());
            int change = 1;
            if(fn > 6)
            {
                change = fn - 5;
            }
            int number = Convert.ToInt32(Math.Pow(10, change));

            List<int> tprime = new List<int>();
            int[] family = new int[fn];
            int i = 0;
            int leng = number;
            int temp = 0;
            bool a = true;
            while (a)
            {
                number = MyMath.Here.NextPrime(number);
                i = 0;
                temp = number;
                family[i] = number;
                tprime.Clear();
                while (temp.ToString().Length == number.ToString().Length)
                {
                    tprime.Add(temp);
                    temp = MyMath.Here.NextPrime(temp);
                }
                i++;
                int dis = 0;
                int temporary = number;
                foreach (int mun in tprime)
                {
                    dis = number.ToString().Distinct().Count();
                    i = 1;
                    temporary = number;
                    family[0] = number;
                    foreach (int tr in tprime)
                    {
                        if(number > tr)
                        {
                            continue;
                        }
                        if (tr.ToString().Distinct().Count() <= dis)
                        {
                            if (!family.Contains(tr) && number % 10 == tr %10)
                            {
                                if (Repeat(temporary, tr, change))
                                {
                                    family[i] = tr;
                                    i++;
                                    if (i == fn)
                                    {
                                        a = false;
                                        break;
                                    }
                                }
                            }
                        }
                    }
                    if (!a)
                    {
                        break;
                    }
                    number = mun;
                }
            }

            foreach(int v in family)
            {
                Console.WriteLine(v);
            }
        }

        public static bool Repeat(int a, int b, int num)
        {
            int leng = Convert.ToInt32(Math.Floor(Math.Log10(a))) + 1;
            int[] aa = new int[leng];
            int[] bb = new int[leng];
            for(int i = 0; i < leng; i++)
            {
                aa[i] = a % 10; a /= 10;
                bb[i] = b % 10; b /= 10;
            }
            int j = 0;
            int[] repa = new int[num];
            int[] repb = new int[num];
            int y = 0;
            while (j < leng)
            {
                if(aa[j] != bb[j])
                {
                    if (y >= num) { return false; }
                    repa[y] = aa[j];
                    repb[y] = bb[j];
                    y++;
                }
                j++;
            }
            if(y != num)
            {
                return false;
            }
            int tempa = repa[0];
            int tempb = repb[0];
            foreach(int tr in repa)
            {
                if(tr != tempa)
                {
                    return false;
                }
            }
            foreach (int tr in repb)
            {
                if (tr != tempb)
                {
                    return false;
                }
            }
            return true;
        }
    }
}



Вот
Где mymath.Вот.NextPrime

public static int NextPrime(int lastprime)
        {
            int a = 0;
            if (IsPrime(lastprime))
            {
                a = 2;
            }
            else
            {
                a = 1;
            }

            if(lastprime < 2)
            {
                return 2;
            }
            else if(lastprime == 2)
            {
                return 3;
            }
            lastprime += a;
            while (!IsPrime(lastprime))
            {
                lastprime += a;
            }
            return lastprime;
            
        }



Как сделать это быстрее??

Что я уже пробовал:

Это медленно..
Пожалуйста, помогите мне улучшить его.

Patrice T

Что же должен делать этот код ?

PIEBALDconsult

https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

Patrice T

Это совет, чтобы использовать его ?

Member 13294470

Следующий Прайм очень быстрый

2 Ответов

Рейтинг:
9

Patrice T

Цитата:
Как сделать это быстрее??

Первое, что нужно сделать, - это не делать предположений о том, что быстро, а что нет.
Цитата:
Следующий Прайм очень быстрый

Единственное, что нужно сделать, это использовать инструмент, созданный для этого: использовать программный профилировщик.
Профилировщик программы будет измерять время, затраченное на каждую часть программы, и сколько раз выполняется каждая часть. С этой информацией вы будете знать, где искать оптимизацию.

Профилирование (компьютерное программирование) - Википедия[^]
Список инструментов анализа производительности-Википедия[^]


Member 13294470

Окей

Рейтинг:
1

KarstenK

Для более высокой скорости преобразования строк необходимо избегать. Работайте только с числами и избегайте какой-нибудь пересчет данных. В противном случае используйте некоторые структурные данные для кэширования результатов.

///int leng = Convert.ToInt32(Math.Floor(Math.Log10(a))) + 1// slow;
int leng = (int) Math.Log10(a)) + 1;//should be faster
Также избегайте консольного вывода, который также замедляется. Или только для отладочного использования.

Если вы хотите реверсировать число: print as string, string reverse и parse to number. Но см. Совет 2.

Совет: чтобы получить длину числа, вы можете использовать log10 коп.

Совет 2: Напишите тестовый код для подфункции и повторите их миллион раундов, чтобы получить ощущение где код работает медленно.


Member 13294470

Вы пытались запустить код?