CCF NOI1056. 表达式 (C++)

探讨了如何通过编程找出使特定数学表达式在不同进制下成立的最小进制,涉及进制转换和编程实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1056. 表达式

题目描述

表达式6×9=42对于十进制来说是错误的,但是对于十三进制来说是正确的。即6(13)×9(13)=42(13),而42(13)=4×131+2×130=54(10)。你的任务是写一段程序读入3个整数p、q和r,然后确定一个进制B(2≤B≤16)使得p×q=r。如果B有很多选择,输出最小的一个。例如:p=11,q=11,r=121。则有11(3) ×11(3)=121(3),11(10) ×11(10)=121(10)。这种情况下,输出3。如果没有合适的进制,则输出0。

输入

一行,3个B进制的正整数p、q、r(数位≤7)。

输出

使得p×q=r成立的最小进制B,如果没有合适的进制,则输出0。

样例输入

6 9 42

样例输出

13

数据范围限制

C++代码

#include <iostream>
#include <vector>
#include <cassert>
#include <cmath>

using namespace std;

const int max_digits = 7;

int getNumOfDigits(int n)
{
    int numOfDigits = 0;

    while (n > 0)
    {
        numOfDigits++; 
        n /= 10;
    }
    return numOfDigits;
}
    
int getDecimalNumber(int n, float B)
{
    vector<int> digits;

    int num = 0;
    while (n > 0)
    {
        digits.push_back(n%10); 
        n /= 10;
    }

    for(int i=0; i<digits.size(); i++)
    {
        if (digits[i] >= B)  // each digit should be less than B
        {
            num = 0;
            break;
        }
        else
        {
            num += digits[i]*(int)(pow(B, i));
        }
    }
    return num;
}

int findSmallestB(int p, int q, int r)
{
    int pDecimal, qDecimal, rDecimal;
    for (float B=2; B<=16; B++)
    {
        pDecimal = getDecimalNumber(p, B);
        qDecimal = getDecimalNumber(q, B);
        rDecimal = getDecimalNumber(r, B);

        if (rDecimal == pDecimal*qDecimal && rDecimal > 0)
        {
            return (int)B;
        }
    }
    
    return 0;
}
    
int main()
{
    int p, q, r;

    cin >> p >> q >> r;

    assert(p>=1 && getNumOfDigits(p)<=max_digits);
    assert(q>=1 && getNumOfDigits(q)<=max_digits);
    assert(r>=1 && getNumOfDigits(r)<=max_digits);

    int B = findSmallestB(p, q, r);
    cout << B << endl;

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值