51Nod 1116 K进制下的大数

来源:互联网 发布:mysql 官网下载旧版本 编辑:程序博客网 时间:2024/06/03 06:55
有一个字符串S,记录了一个大数,但不知这个大数是多少进制的,只知道这个数在K进制下是K - 1的倍数。现在由你来求出这个最小的进制K。
例如:给出的数是A1A,有A则最少也是11进制,然后发现A1A在22进制下等于4872,4872 mod 21 = 0,并且22是最小的,因此输出k = 22(大数的表示中A对应10,Z对应35)。
Input
输入大数对应的字符串S。S的长度小于10^5。
Output
输出对应的进制K,如果在2 - 36范围内没有找到对应的解,则输出No Solution。
Input示例
A1A
Output示例
22

方法1

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define MAXN 100010char s[MAXN];int a[MAXN];int main(){    int n,k,j,num1,num2,mod;scanf("%s",s);n = strlen(s);k = 2;for(int i = n-1; i >= 0; i--) {if(s[i] >= '0' && s[i] <= '9') {a[j] = s[i]-'0';k = max(k,a[j]+1);}else {a[j] = s[i]-'A'+10;k = max(k,a[j]+1);}    j++;}a[j]='\0';for(;k <= 36;k++) {     num1 = 0;     num2 = 1; mod = k - 1;for(int i=0;i<n;i++){num1 = (num1 + a[i]*num2%mod )%mod;num2 = num2*k%mod;}if(num1 == 0)  break;}if(k < 37) printf("%d\n",k);else printf("No Solution\n");return 0;}

方法2:K ≡ 1 (mod K-1)  (K>=2)

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define MAXN 100010char s[MAXN];int main(){    int n,k,sum;scanf("%s",s);sum = 0;n = strlen(s);k = 2;for(int i = n-1; i >= 0; i--) {if(s[i] >= '0' && s[i] <= '9') {sum += s[i]-'0';k = max(k,s[i]-'0'+1);}else {sum += s[i]-'A'+10;k = max(k,s[i]-'A'+11);} }for(;k <= 36;k++) {     if(sum % (k-1) == 0)        break;}if(k < 37) printf("%d\n",k);else printf("No Solution\n");return 0;}



0 0
原创粉丝点击