Это можно сделать быстро с помощью формулы:
мы можем вычислить максимально возможное число для степени 4, это это начало. чтобы минимизировать цикл for, мы можем закончить, когда находимся на половине числа. Решение поддерживает и другие полномочия. Полный код ниже (C #)
public static void Main(string[] args)
{
const int raisedPow = 4;
long num = 3262811042;
Console.WriteLine("{0}", num);
int start = (int) Math.Pow(Math.E, (Math.Log(num) / Math.Log(Math.E)) / raisedPow);
int end = (int) Math.Pow(Math.E, (Math.Log(num/2) / Math.Log(Math.E)) / raisedPow);
int y = -1;
int stepCount = 0;
for (int i = start; i>end;i--)
{
stepCount++;
long rest = (long) (num - (Math.Pow(i, raisedPow)));
int j = (int) Math.Round(Math.Pow(Math.E, (Math.Log(rest) / Math.Log(Math.E)) / raisedPow));
if (rest - (Math.Pow(j, raisedPow)) == 0)
{
Console.WriteLine("{0} {1}", i, j);
y = j;
}
}
Console.WriteLine("steps {0}", stepCount);
if (y == -1) Console.WriteLine("No Solution");
Console.ReadKey();
}
JUnit 4.7 добавил эту функцию, похоже, используя TestName-Rule . Похоже, это даст вам имя метода:
import org.junit.Rule;
public class NameRuleTest {
@Rule public TestName name = new TestName();
@Test public void testA() {
assertEquals("testA", name.getMethodName());
}
@Test public void testB() {
assertEquals("testB", name.getMethodName());
}
}
JUnit 4 не имеет никакого out-of-the-box механизма для тестового сценария для получения it’s собственного имени (включая во время установки и разрушения).
Я предложил бы, чтобы Вы разъединили имя метода тестирования от своего набора данных тестирования. Я смоделировал бы класс DataLoaderFactory, который загружает/кэширует наборы данных тестирования от Ваших ресурсов, и затем в Вашем тестовом сценарии бегунок называет некоторый метод интерфейса, который возвращает ряд данных тестирования для тестового сценария. Связь данных тестирования к имени метода тестирования предполагает, что данные тестирования могут только использоваться однажды, где в большей части случая я предположил бы что те же данные тестирования в использовании в нескольких тестах проверить различные аспекты Вашей бизнес-логики.
Сложным способом является создание собственного бегуна путем создания подкласса org.junit.runners.BlockJUnit4ClassRunner.
Вы можете затем сделайте что-то вроде этого:
public class NameAwareRunner extends BlockJUnit4ClassRunner {
public NameAwareRunner(Class<?> aClass) throws InitializationError {
super(aClass);
}
@Override
protected Statement methodBlock(FrameworkMethod frameworkMethod) {
System.err.println(frameworkMethod.getName());
return super.methodBlock(frameworkMethod);
}
}
Затем для каждого тестового класса вам нужно добавить аннотацию @RunWith (NameAwareRunner.class). В качестве альтернативы, вы можете поместить эту аннотацию в суперкласс Test, если вы не хотите помнить ее каждый раз. Это, конечно, ограничивает ваш выбор бегунов, но это может быть приемлемо.
Кроме того, может потребоваться немного кунг-фу, чтобы вывести название текущего теста из Runner в вашу среду, но это по крайней мере получает тебе имя.