【问题标题】:Count number of arbitrary repeating decimal numbers in NSString计算 NSString 中任意重复十进制数的个数
【发布时间】:2014-02-17 17:13:49
【问题描述】:

在我的代码中,我正在处理一个包含 NSNumber 值的 NSString。此 NSNumber 值可能可能是一个重复的十进制数(例如 2.333333333e+06),它以字符串格式缩短为“2.333333”。它也可以是终止数(例如 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.333333333e+06”如何缩短为“2.333333”?过程不清楚
  • 另外,您是否希望检查字符串中的重复数字anywhere(这就是您的问题标题所暗示的)?比如 22222.3 和 2.33333 ?
  • @user2311023 在第一条评论中,它就是这样做的。从 NSNumber 到 NSString 的转换将它(至少对我来说)缩短为 2.33333。我认为这只是将值转换为另一个对象的一部分。第二条评论:不,对不起,只是小数。将进行编辑以使其更清晰。
  • 你没有完全理解“重复数”的数学概念。仅仅因为一个数字以“67676767”结尾并不意味着它在数学意义上是“重复的”。可能是,或者下一个数字可能是 4。没有办法检查小数并判断它是否“重复”——要确定它是否“重复”,您必须检查生成数字的算法。
  • 你不懂。简单地发现小数部分的已知数字重复并没有说明什么。 33333/10000 = 3.3333。但这不是数学意义上的“重复”数字,因为下一个数字是 0。10/3 也等于 3.3333,精度相同,但下一个数字(以及之后的每个数字)也将是 3。作为字符串,但是,您无法区分“3.3333”和“3.3333”。

标签: objective-c cocoa nsstring numbers nsnumber


【解决方案1】:

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

假设你想要知道分数:

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

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

【讨论】:

    【解决方案2】:

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

    创建NSMutableDictionary,它将包含数字作为键和出现次数作为值。

    如果字符串中的数字由已知符号分隔,您可以使用componentsSeparatedByString:

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

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

    【讨论】:

    • 我将如何将数字/出现次数输入字典?那是我真正的问题。如果我有办法获取字符串中任意字符的计数,我可以处理出现次数。
    • 请提供真实输入示例
    • 啊哈!所以我知道重复的#s 会用句号分隔。那可行!不过,我将如何检查发生情况?这仍然是一个问题。我更新了问题以添加上下文。
    • 确定已知数字重复不会将该数字确定为“重复”。
    猜你喜欢
    • 2015-03-10
    • 2012-05-26
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 2011-01-28
    • 2020-11-14
    相关资源
    最近更新 更多