2014-02-17 1 views
2

В моем коде я имею дело с NSString, который содержит значение NSNumber. Это значение NSNumber может быть возможно быть повторяющимся десятичным числом (e.x. 2.333333333e + 06), которое сокращается до «2.333333» в строковом формате. Это может быть также конечное число (ex 2.5), отрицательное или иррациональное число (2.398571892858 ...) (только с десятичными знаками здесь)Подсчитайте количество произвольных повторяющихся десятичных чисел в NSString

Мне нужно найти способ выяснить, есть ли повторяющиеся числа в строка (или NSNumber, если необходимо). В моем коде у меня не было бы способа узнать, что такое повторяющийся номер, так как это результат вычислений, запущенных пользователем. Я пробовал этот цикл for (см. Ниже), который не работает так, как я этого хочу, из-за моей неопытности с индексированием строк/диапазонами/длинами.

BOOL repeat = NO; //bool to check if repeating # 
double repNum, tempNum; //run in for loop 
NSString *repeating = [numVal stringValue]; //string that holds possible repeating # 
for (int i = 3; i <= [repeating length]-3; i++) { //not sure about index/length here 
      if (i == 3) { 
        repNum = [repeating characterAtIndex:i]; 
        } 
      tempNum = [repeating characterAtIndex:i]; 
      if (tempNum == repNum) { 
        repeat = YES; 
         } else { 
         repeat = NO; 
        } 

       } 

Этот код не работает, как я хотел бы, чтобы, в основном потому, что я также должен учитывать отрицательные черточки в строке и разным количеством цифр (13 1/3 против 1/3 1). Я использовал функцию modf, чтобы отделить целые числа от десятичных знаков, но для меня это тоже не сработало.

Заранее спасибо. Пожалуйста, дайте мне знать, если я смогу прояснить ситуацию.

РЕДАКТИРОВАТЬ:

Этот код работает с выводом различных решений для многочленов (квадратичной формулы). Надеюсь, что это поможет превратить его в контекст. Глянь сюда. (Пример входных данных)

NSNumber *firstPlusSolution, *secondMinusSolution; 
NSString *pValueStr, *mValueStr; 

firstPlusSolution = -(b) + sqrt(square(b) - (4)*(a)*(c)); //a, b, c: "user" provided 
firstPlusSolution /= 2*(a); 

secondMinusSolution = -(b) - sqrt(square(b) - 4*(a)*(c)); 
secondMinusSolution /= 2*(a); 

pValueStr = [firstPlusSolution stringValue]; 
mValueStr = [secondMinusSolution stringValue]; 

if ([NSString doesString:pValueStr containCharacter:'.']) { //category method I implemented 

    double fractionPart, integerPart; 
    fractionPart = modf(firstPlusSolution, &integerPart); 

    NSString *repeating = [NSString stringWithFormat:@"%g", fractionPart]; 
    int repNum, tempNum; 
    BOOL repeat = NO; 

    //do for loop and check for negatives, integers, etc. 
} 

if ([NSString doesString:mValueStr containCharacter'.']) { 
    //do above code 
    //do for loop and check again  
} 
+1

Как "2.333333333e + 06" сократить до "2.333333"?Процесс неясен. – insys

+0

Кроме того, вы хотите проверить повторение чисел * в любом месте * в строке (это то, что предлагает ваш вопрос)? Например, 22222.3 и 2.33333? – insys

+0

@ user2311023 На 1-м комментировании это то, что он делает. Передача из NSNumber в NSString сокращает его (по крайней мере для меня) до 2.33333. Я предположил, что это всего лишь часть литья значения другому объекту. 2-й комментарий: Нет, извините, просто десятичная. Будет редактировать, чтобы сделать более понятным. –

ответ

1

Использование C. Возьмите дробную часть. Преобразуйте в строку с известной точностью. Если длина строки указывает, что последние цифры отсутствуют, то она не повторяется. Используйте NSString-UTF8String для преобразования строки. Избавьтесь от последней цифры (может быть округление или фактическая арифметическая ошибка с плавающей запятой). Используйте функцию int strncmp (const char * str1, const char * str2, size_t num) для выполнения сравнения внутри самой строки. Если результат равен 8 символам, а последние 2 символа соответствуют первым двум символам, то должны ли первые шесть символов повторяться?

Предполагая, что фракция знания вашего желания:

• Возможность 1: Использование фракции. Входные фракции. Вычислить фракции. Выходные фракции. Разверните один из многих примеров класса фракций C++, если это необходимо, и используйте его.

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

0

Я полагаю, использование не является оптимальным, но легко писать Solution

Создание NSMutableDictionary, который будет содержать число как ключ и подсчета появления в качестве значения.

Вы можете использовать componentsSeparatedByString:, если числа в строку с разделителями известным символом

В проверке valueForKey петли в словаре, и если увеличение потребности значение

Последний шаг анализа наш словарь и делать все, что нужно с номерами

+0

Как я могу получить числа/вхождения в словарь? Это моя настоящая проблема. Я мог бы обработать счетчик возникновения, если бы у меня был способ получить количество произвольных символов в строке. –

+0

укажите реальный пример ввода – sage444

+0

@ HunterE. Я обновил свой ответ, пожалуйста, проверьте – sage444

 Смежные вопросы

  • Нет связанных вопросов^_^