4945. 比大小

150 阅读1分钟

题目链接

题目详情

给定一个 n 位 bxb_x 进制数 X 和一个 m 位 byb_y 进制数 Y。

X 和 Y 都为正整数,且都不含前导 0。

请你比较它们的大小。

输入格式

第一行包含两个整数 n,bxn,b_x

第二行包含 n 个整数 x1,x2,,xnx_1,x_2,…,x_n,表示 X 的各位数字,它们按照从最高有效位到最低有效位的顺序给出。

第三行包含两个整数 m,bym,b_y

第四行包含 m 个整数 y1,y2,,ymy_1,y_2,…,y_m,表示 Y 的各位数字,它们按照从最高有效位到最低有效位的顺序给出。

X 和 Y 的各位数字在输入中均按十进制表示给出。

输出格式

共一行:

  • 如果 X<Y,则输出 <
  • 如果 X>Y,则输出 >
  • 如果 X=Y,则输出 =

数据范围

前 6 个测试点满足 2bx,by162≤b_x,b_y≤16
所有测试点满足 1n,m102bx,by40bxby0xi<bx0yi<by1≤n,m≤10,2≤b_x,b_y≤40,b_x≠b_y,0≤x_i<b_x,0≤y_i<b_y

输入样例1:

6 2
1 0 1 1 1 1
2 10
4 7

输出样例1:

=

输入样例2:

3 3
1 0 2
2 5
2 4

输出样例2:

<

解题思路

这道题很简单,就是进制的转换,而且是其他进制转换为10进制,很容易。这里我定义了一个函数n_to_10()。第一个参数n为进制数,第二个参数q为存储数的数组,第三个参数是数组的长度。然后转换就是依次求每一位的 数 * 该位的权重,再求和即可。最后比较两个十进制数的大小输出即可!

AC代码

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector> 
#include<cmath>
using namespace std;
#define int long long
#define endl '\n'
typedef long long ll;

const int N =1000;
int a[N],b[N];

int n_to_10(int n, int q[], int len)
{
    int res = 0;
    for(int i=1;i<=len;i++) 
    {
        res += q[i] * pow(n,len-i);
    }
    return res;
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int n,x,m,y;
    cin >> n >> x;
    for(int i=1;i<=n;i++) cin>>a[i];
    cin>>m>>y;
    for(int i=1;i<=m;i++) cin>>b[i];
    int s1 = n_to_10(x,a,n);
    int s2 = n_to_10(y,b,m);
    //cout<<s1<<endl<<s2;
    if(s1>s2) cout<<">";
    else if(s1<s2) cout<<"<";
    else cout<<"=";
    return 0;
}