计算NSString中任意重复十进制数的数量

时间:2014-02-17 17:13:49

标签: objective-c cocoa nsstring numbers nsnumber

在我的代码中,我正在处理包含NSNumber值的NSString。此NSNumber值可能可能是重复的十进制数(e.x. 2.333333333e + 06),以字符串格式缩短为“2.333333”。它也可能是一个终止号码(e.x.2.5),负数或无理数(2.398571892858 ......)(这里只处理小数)

我需要有办法弄清楚字符串中是否有重复的数字(如果需要,还有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 1/3)。我已经使用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    
}

2 个答案:

答案 0 :(得分:1)

使用C.取小数部分。转换为具有已知精度的字符串。如果字符串的长度表示缺少最后的数字,则不重复。使用NSString-UTF8String转换字符串。摆脱最后一位数(可能是舍入或实际浮点算术错误)。使用函数int strncmp(const char * str1,const char * str2,size_t num)在字符串本身内执行比较。如果结果是8个字符长,最后2个字符与前2个字符匹配,那么前6个字符是否应被视为重复?

假设您需要分数知识:

•可能性1:使用分数。输入分数。用分数计算。输出分数。如果需要,扩展c ++分数类的许多示例之一并使用它。

•可能性2:选择远小于两倍的精度。从结果中得到一小部分。根据准确度减少允许舍入的分数。

答案 1 :(得分:0)

我建议使用不是最优但易于编写的解决方案

创建NSMutableDictionary,其中包含作为键的数字和作为值的出现次数。

如果字符串中的数字由已知符号

分隔,则可以使用componentsSeparatedByString:

循环检查字典中的valueForKey,如果需要增加值

最后一步是分析我们的字典,并用数字做任何你需要的事情