1010. Radix (25)
2016-06-27 11:03
423 查看
1010. Radix (25)
目录
Radix 25目录
原题
思路
AC代码
原题
1010. Radix (25)链接思路
1. 以字符串形式读入读入前两个数字。以整型的形式读入后两个数字。 2. 如果第三个数字是1,使用strtol函数把第一个数字转换为十进制数。从i=1循环,直到36为止。 1. 使用strtol函数把第二个数字以转换为i进制数。 2. 如果两者相等,输出i。如果第二个数字大于第一个数字,输出Impossible,跳出循环。 3. 对于第三个数字是2,有类似的处理方式。
但是这种思路有错误。
第一:radix最大可达INT_MAX。
第二:已知进制的数字不会大于int的上限,但是要求的数字不仅会超过int的上限,而且也会超过long long的上限。
第三:这种暴力求解的方法会超时。
AC代码
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cctype> #include <climits> long long find_max_digit(char string[]); long long strtolong(char string[], int radix); int compare(char string[], int radix, long long num1); int main(void) { char string1[11], string2[11], string3[11]; int tag, radix; long long start, end; scanf("%s %s %d %d", string1, string2, &tag, &radix); if (2 == tag) { strcpy(string3, string1); strcpy(string1, string2); strcpy(string2, string3); } long long num1 = strtolong(string1, radix); long long least_possible_radix; least_possible_radix = find_max_digit(string2); start = least_possible_radix; end = num1 > start + 1 ? num1 : start + 1; while (start <= end) { long long middle = (start + end) >> 1; int result = compare(string2, middle, num1); if (result > 0) { end = middle - 1; } else if (!result) { printf("%lld\n", middle); return 0; } else { start = middle + 1; } } puts("Impossible"); return 0; } long long find_max_digit(char string[]) { int length = strlen(string); int max_digit = 0; for (int i = 0; i < length; i++) { if (isalpha(string[i])) { max_digit = max_digit < string[i] - 'a' + 10 ? string[i] - 'a' + 11 : max_digit; } else { max_digit = max_digit < string[i] - '0' + 1 ? string[i] - '0' + 1 : max_digit; } } return (long long)max_digit; } long long strtolong(char string[], int radix) { long long sum = 0ll, temp; int length = strlen(string); for (int i = 0; i < length; i++) { temp = isdigit(string[i]) ? string[i] - '0' : string[i] - 'a' + 10; sum = sum * radix + temp; } return sum; } int compare(char string[], int radix, long long num1) { long long sum = 0ll, temp, base = 1ll; int length = strlen(string); for (int i = length - 1; i >= 0; i--) { temp = isdigit(string[i]) ? string[i] - '0' : string[i] - 'a' + 10; sum += temp * base; base *= radix; if (sum > num1) { return 1; } } if (sum == num1) { return 0; } else { return -1; } }
相关文章推荐
- android Spinner控件详解
- 欢迎使用CSDN-markdown编辑器
- PullToRefresh 的扩展
- ASPNET常用工具方法(二)
- 利用ASP.NET MVC+Bootstrap搭建个人博客之修复UEditor编辑时Bug(四)
- xx.xcodeproj cannot be opened because the project file cannot be parsed.Xcode工程文件打不开
- stp
- 窗体操作一切正常,为什么在form.free;时会出现Invalid pointer operation(无效的指针操作)的错误提示?
- cxgrid行变色
- PullToRefresh 的源码分析
- 数据结构上机测试2-2:单链表操作B
- vlan
- 【JavaScript】table显示问题
- angularjs+requlirejs 搭建前端框架(1)
- 安卓取消标题栏和隐藏ActionBar
- Android 开发第一步 短信验证码登录
- 在Windows上安装Android Cygwin(NDKr7以后不要安装会报错)
- 数据库设计三范式
- PullToRefresh 的继承关系
- jquery中去重复排序(函数: $.grep() join() sort() )