51Nod 1116(进制转换)

/*
    51Nod  1116
    题意大体是
    一个数在k进制下是(k-1)的倍数问k是几
    进制转换
    十进制转换成k进制的核心是
    a5a4a3a2a1=a5*k^4+a4*k^3+a3*k^2+a2*k^1+a1*k^0
    先把每一位转换成十进制下的数
    如:7->7 A->10一样
    然后从个位开始乘以进制数加上下一位数
    相当于把原来的数的进行如下操作:
    for(int j=0; j<i-1; j++)
    {
        if(ch[j]>='A'&&ch[j]<='Z')
            sum=sum*k+(ch[j]-'A'+10);
        else
            sum=sum*k+(ch[j]-'0');
    }
    十进制下字母对应的数值
    A         B         C        D       E        F        G       H        I         J        K       L        M
    10       11       12      13      14      15      16      17      18      19      20      21      22
    N         O        P        Q       R        S        T       U        V        W      X       Y        Z
    23       24       25      26      27      28      29      30      31      32      33      34      35
*/
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
#include<stdio.h>
#include<math.h>
#define ll long long
#define MAX 1000005
using namespace std;


int main()
{
    char ch[100005];
    memset(ch,'\0',sizeof(ch));
    char maxn=0;
    int i;
    for(i=0; ch[i-1]!='\n'; i++)
    {
        scanf("%c",&ch[i]);
        if(ch[i]!='\n'&&ch[i]>maxn)
            maxn=ch[i];
    }
    int max;
    if(maxn>='0'&&maxn<='9')
        max=maxn-'0';
    else
        max=maxn-'A'+10;
    int flag=0;
    for(int k=max+1; k<=36; k++)
    {
        int sum = 0;
        for(int j=0; j<i-1; j++)
        {
            if(ch[j]>='A'&&ch[j]<='Z')
            {
                sum=sum*k+(ch[j]-'A'+10);
                sum=sum%(k-1);
            }
            else
            {
                sum=sum*k+(ch[j]-'0');
                sum=sum%(k-1);
            }
        }
        if(sum == 0)
        {
            cout<<k<<endl;
            flag=1;
            break;
        }


    }
    if(!flag)
        cout<<"No Solution"<<endl;
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值