使用Objective-C实现13进制转换为10进制数
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;
}