1 条题解
-
0
🧠 题解(Solution)
-
进制转换与数字表示
- 数字 可以是任意进制(),其符号范围:
- 表示
- 表示
- 表示
- 例如,字符 'A' 在 进制下表示 (十进制)。
- 数字 可以是任意进制(),其符号范围:
-
数学条件
- 给定 是 进制数,且 能被 整除。
- 根据数论性质,一个数 在 进制下能被 整除,当且仅当 的各位数字之和(按 进制计算)能被 整除。
-
求解最小进制
- 首先,确定数字 中最大的字符对应的最小可能进制 。
- 从 开始,逐步增加 ,检查 是否成立。
- 如果找到最小的 满足条件,则输出;否则判定为不可能。
📌 示例说明
-
输入 "3"
- 可能是 进制(因为 在 进制下表示 ),且 。
- 输出 。
-
输入 "5"
- 可能是 进制()。
- 输出 。
-
输入 "A"
- 'A' 表示 ,最小进制是 ,且 。
- 输出 。
🔍 解题思路
- 字符转换
- 将输入字符串的每个字符转换为对应的数值()。
- 计算最小可能进制
- 。
- 检查可能的
- 计算数字各位之和 。
- 遍历 从 到 ,检查 。
- 找到则返回 ,否则判定不可能。
边界情况
- 若输入为 "0",任何 都满足( 能被任何数整除),故最小 。
- 若数字只有一位(如 "A"),则 必须满足 。
最终输出格式
- 对每个输入,输出最小满足条件的 或 "such number is impossible!"。
示例输出
1: 4 2: 6 3: 11
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; char a[100000]; int main() { int i,s,len,max; bool d; while(scanf("%s",a)!=EOF) { len=strlen(a); s=0; max=0; //max记录所能代表的最小进制数(比如数字里面有B,则这个进制至少也是12吧。。。) for(i=0;i<len;i++) //接下来的过程,不要怀疑.经过验证了的 { //(如果这个n进制的数能取余n-1等于0,则这个数的各个位数相加也要能取余n-1等于0,这样问题变简单咯)[这个很容易证明的,不妨试试] if (a[i]>='0'&&a[i]<='9') { if (a[i]-'0'>max) max=a[i]-'0'; s=s+a[i]-'0'; } if (a[i]>='a'&&a[i]<='z') { if (a[i]-'a'+36>max) max=a[i]-'a'+36; s=s+a[i]-'a'+36; } if (a[i]>='A'&&a[i]<='Z') { if (a[i]-'A'+10>max) max=a[i]-'A'+10; s=s+a[i]-'A'+10; } } d=false; for(i=2;i<=62;i++) if (s%(i-1)==0&&max<i) {d=true;break;} if (d) printf("%d\n",i); else printf("such number is impossible!\n"); } return 0; }
-
- 1
信息
- ID
- 153
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者