使用Objective-C实现13进制转换为10进制数

2017-12-16  本文已影响0人  TianKengZhe

int main(int argc, const char * argv[]) {

@autoreleasepool {

//定义一个数组,保存对应的13进制数,0-12,共13个字母,对应10进制的数字

NSArray *testArray = @[@"a",@"b",@"c",@"d",@"e",@"f",@"g",@"h",@"i",@"j",@"k",@"l",@"m"];

NSString *num = @"abc";//"abc"为给出的13进制数

NSInteger sum = 0; //sum保存计算的值

NSMutableArray *newNumbers = [NSMutableArray array]; //定义一个可变数组,用来保存从"abc"中分解出来的字符"a","b","c".

for (NSInteger i = num.length - 1; i >= 0; i--) { //反向循环取"abc"对应位置的字符,在字符串"abc"中,如果正向循环取值的话,a对应的是0位,b代表1位,c代表2位,正确的对应应该是a代表第三位,b代表第二位,c代表第一位,在转换为对应的10进制数后加入新的数组,需要反向排序一次,不然计算13进制计算过程会变成a * 13º + b * 13¹ + c * 13²,这是不对的,正确算法是c * 13º + b * 13¹ + a * 13²,有点啰嗦,核心就是:主要的做法就是分解字符串加入数组,并且让其对应的数组下标跟13的指数相同

unichar charater = [num characterAtIndex:i];

NSString *subString = [NSString stringWithFormat:@"%c",charater]; //unichar转换为NSString

if (![testArray containsObject:subString]) { //如果13进制原始数组不包含需要转换的字符串中的字符,如:"x","y","t"之类的,那么是不合法的13进制数,直接退出循环。

NSLog(@"There's some illegal chracters : %@",subString);

break;

}

NSUInteger index = [testArray indexOfObject:subString]; //取出"a","b","c"在原始数组中的下标,即对应的10进制数,"a"代表0,"b"代表1,"c"代表2

[newNumbers addObject:[NSNumber numberWithInteger:index]];

}

for (int i = 0 ; i < newNumbers.count; i++) {// 循环数组,对应位置做13的指数运算,加起来的值就是对应的10进制的值,例如:101这个数字在10进制中是1 * 10º + 0 * 10¹ + 1 * 10² = 101,在2进制中是1 * 2º + 0 * 2¹ + 1 * 2² = 5.

sum += pow(13, i) * [newNumbers[i] integerValue];

}

NSLog(@"%@,%ld",newNumbers,sum);

}

return 0;

}

上一篇下一篇

猜你喜欢

热点阅读