2022年蓝桥杯cc++ b组X进制减法 个人思路

2022年蓝桥杯cc++ b组X进制减法 个人思路,第1张

这个题思路对了就能模拟出,但是数据大了就不知道能不能跑了。


举例:

对x进制数321,进制分别为 8 10 2 ,转化为10进制数65.

百位

十位

个位

X进制数

3

2

1

X进制

8

10

2

转换10进制

3*10+2=32

32*2+1=65

如上表,高位数字就是低位数字的进制溢出上去的。


所以计算的时候反推回去

思路:

对于数字A=a(n+1) an a(n-1) a(n-2)……a3 a2 a1 (每个an对应一个位),进制为X=x(n+1) xn x(n-1) x(n-2)……x3 x2 x1

              位

n+1

n

n-1

2

1

数字A(X进制)

a(n+1)

an

a(n-1)

a2

a1

X进制

x(n+1)

xn

x(n-1)

x2

x1

计算为B(十进制)

a(n+1)*xn+an

an*x(n-1)+a(n-1)

a3*x2+a2

a2*x2+a1

计算:

X进制计算为10进制:第n位数的数值为:an= a(n+1)*xn+an

这样从高位往低位计算,最后得到的a1的位置,就是数字A(X进制)转化为的B(十进制)

题目思路:

       所以,在做题目的时候,就按照这种思路模拟。


这里现将A减去B,然后再将结果由X进制转化为10进制。


这里可以在转化的每个位数的地方都模上1000000007,就不用担心出界了。


        对于题目的最小,每位数的进制肯定是最小,也就是A和B每位数最大的数字+1。


代码:

#include
using namespace std;

int n,a[100003],b[100003],c[100003],ma,mb;

int main(){

    cin>>n;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    cin>>ma;
    int i;
    for(i=ma;i>=1;i--)
        cin>>a[i];
    cin>>mb;
    for(i=mb;i>=1;i--)
    {
        cin>>b[i];
        c[i]=a[i]>b[i]?a[i]:b[i];     //每位数的进制对应最大+1  
        c[i]++;
    }
    for(i=ma;i>mb;i--)  // 对A比B超出的位数移植
        c[i]=a[i]+1;

    for(i=ma;i>=1;i--)  // 最小的进制是2,这里如果两个数都是0,就变为2进制
    {
        if(c[i]<=2)
        c[i]=2;
        if(c[i]>n)
        c[i]=n;
    }
    int aa,bb;
    for(i=ma;i>1;i--)
    {
        aa=a[i]*c[i-1]+a[i-1];
        bb=b[i]*c[i-1]+b[i-1];        //主要是对b的第一个数做运算,后面bb=b[i-1]
        a[i-1]=(aa-bb)%1000000007;
        b[i-1]=0;
    }

    cout<

执行结果展示:

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/584816.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-12
下一篇 2022-04-12

发表评论

登录后才能评论

评论列表(0条)