求AB数

给定正整数a和b,构建集合L(乘积)和R(异或),组合成AB数,并求所有可能AB数的和。当a=2, b=4时,通过示例解释了AB数的生成过程,但实际提交时未能通过测试。" 106948647,5995242,使用ScrollMagic.js创建粘性侧边栏,"['JavaScript', 'CSS', 'HTML', '前端开发', 'ScrollMagic']

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

给定两个正整数a,b,分别定义两个集合L和R,

集合L:即把1~a,1~b中整数乘积的集合定义为L = {x * y | x,y是整数且1 <= x <=a , 1 <= y <= b};

集合R:1~a,1~b中整数异或的集合定义为集合R = {x ^ y | x,y是整数且1 <= x <=a , 1 <= y <= b},其中^表示异或运算。

现从L中任取一个整数作为A,从R中任取一个整数作为B,如果必要在B的左边补0,使得B达到:“b的位数+1”位(十进制),然后把B接到A的右边,形成的一个十进制数AB。求所有这样形成数的和。


输入a,b  1<=a<=30, 1<=b<=10000000。

输出所有产生的AB数的和,由于结果比较大,输出对1000000007取余数的结果。


例如:a = 2, b = 4,

则L = {1 * 1, 1 * 2, 1 * 3, 1 * 4, 2 * 1, 2 * 2, 2 * 3, 2 * 4} =  {1, 2, 3, 4, 6, 8}

  R =  {1^1,1^2,1^3,1^4,2^1,2^2,2^3,2^4} =  {0, 1, 2, 3, 5, 6}

相接的时候保证R中的数至少有两位,所以相接后所有的AB数的集合是

{

100, 101, 102, 103, 105, 106,

200, 201, 202, 203, 205, 206,

300, 301, 302, 303, 305, 306,

400, 401, 402, 403, 405, 406,

600, 601, 602, 603, 605, 606,

800, 801, 802, 803, 805, 806

}

输出它们的和:14502

#include<stdio.h>
#define M 100
#define N 100
//归并排序
void merge(int a[],int first, int mid ,int last)
{
    int i=first;
    int j=mid+1;
    int k=0;
    int b[N];
    while(i<=mid && j<=last)
    {
        if(a[i]>a[j])
        {
            b[k]=a[j];
            j++;
            k++;
        }
        else
        {
            b[k]=a[i];
            i++;
            k++;
        }
    }
    while(i<=mid)
    {
        b[k++]=a[i++];
    }
    while(j<=last)
    {
        b[k++]=a[j++];
    }
    for(i=first,k=0; i<=last; i++)
    {
        a[i]=b[k];
        k++;
    }
}
void MergeSort(int a[], int first ,int last)
{
        if(first<last)
        {
             int mid=(first+last)/2;
             MergeSort(a,first,mid);
             MergeSort(a,mid+1,last);
             merge(a,first,mid,last);
        }
}
int GetNum(int a)
{
    int num=0;
    while(a!=0)
    {
        a=a/10;
        num++;
    }
    if(num==0)return 1;
    else      return num;
}
int run (int a,int b)
{
    int i;
    int j;
    int len=0;
    int kl=0;
    int kr=0;
    int m=0;
    int n=0;
    int lenl;
    int lenr;
    int L[M]={0};
    int R[N]={0};
    int num=0;
    float result=0;
    int temp=1;
    for(i=1; i<=a; i++)
    {
        for(j=1; j<=b; j++)
        {
            L[m++]=i*j;
            R[n++]=i^j;
            len++;
        }
    }
    //对L和R进行排序,然后剔除那些重复的元素
    MergeSort(L,0,len-1);
    MergeSort(R,0,len-1);
    //剔除数组中重复的元素
    for(i=1; i<len; i++)
    {
        if(L[i] != L[i-1])
        {
            L[++kl]=L[i];
        }
        if(R[i]!=R[i-1])
        {
            R[++kr]=R[i];
        }
    }
    lenl=kl+1;
    lenr=kr+1;
    
    for(i=0; i<lenr; i++)
    {
        num=GetNum(R[i]);
        num++;
        temp=1;
        while(num!=0)
        {
            temp=temp*10;
            num--;
        }
        for(j=0; j<lenl; j++)
        {
            result+=L[j]*temp+R[i];
            if(result>1000000007)
            {
                result=result-1000000007;
            }
        }
    }
    return result;
}
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{    
    printf("%d",run(2,4));
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加

运行上面的测试例子,成功了,可是提交时候的说测试没有过,不知道哪里出错了!郁闷,挑战失败了,先留着,以后在看看

赶脚在这里用定数组不合适,应该分配动态数组。



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值