首页 > 试题广场 >

数据分类处理

[编程题]数据分类处理
  • 热度指数:173213 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

信息社会,有海量的数据需要分析处理,比如公安局分析身份证号码、 QQ 用户、手机号码、银行帐号等信息及活动记录。

采集输入大数据和分类规则,通过大数据分类处理程序,将大数据分类输出。

数据范围: ,输入的整数大小满足

输入描述:

一组输入整数序列I和一组规则整数序列RIR序列的第一个整数为序列的个数(个数不包含第一个整数);整数范围为0~(2^31)-1,序列个数不限



输出描述:

R依次中取出R<i>,对I进行处理,找到满足条件的I 

I整数对应的数字需要连续包含R<i>对应的数字。比如R<i>23I231,那么I包含了R<i>,条件满足 。 

R<i>从小到大的顺序:

(1)先输出R<i> 

(2)再输出满足条件的I的个数; 

(3)然后输出满足条件的II序列中的位置索引(0开始) 

(4)最后再输出I 

附加条件: 

(1)R<i>需要从小到大排序。相同的R<i>只需要输出索引小的以及满足条件的I,索引大的需要过滤掉 

(2)如果没有满足条件的I,对应的R<i>不用输出 

(3)最后需要在输出序列的第一个整数位置记录后续整数序列的个数(不包含“个数”本身)

 

序列I15,123,456,786,453,46,7,5,3,665,453456,745,456,786,453,123(第一个15表明后续有15个整数) 

序列R5,6,3,6,3,0(第一个5表明后续有5个整数) 

输出:30, 3,6,0,123,3,453,7,3,9,453456,13,453,14,123,6,7,1,456,2,786,4,46,8,665,9,453456,11,456,12,786

说明:

30----后续有30整数

3----从小到大排序,第一个R<i>0,但没有满足条件的I,不输出0,而下一个R<i>3

6--- 存在6个包含3I 

0--- 123所在的原序号为0 

123--- 123包含3,满足条件 

示例1

输入

15 123 456 786 453 46 7 5 3 665 453456 745 456 786 453 123
5 6 3 6 3 0

输出

30 3 6 0 123 3 453 7 3 9 453456 13 453 14 123 6 7 1 456 2 786 4 46 8 665 9 453456 11 456 12 786

说明

将序列R:5,6,3,6,3,0(第一个5表明后续有5个整数)排序去重后,可得0,3,6。
序列I没有包含0的元素。
序列I中包含3的元素有:I[0]的值为123、I[3]的值为453、I[7]的值为3、I[9]的值为453456、I[13]的值为453、I[14]的值为123。
序列I中包含6的元素有:I[1]的值为456、I[2]的值为786、I[4]的值为46、I[8]的值为665、I[9]的值为453456、I[11]的值为456、I[12]的值为786。
最后按题目要求的格式进行输出即可。     
#include <stdio.h>
#include <math.h>
int main() {
    int n1,n2;
    scanf("%d",&n1);
    int I[n1];
    for(int i=0;i<n1;i++)
    {
        scanf("%d",&I[i]);
    }
    scanf("%d",&n2);
    int R[n2],flag[n2][n1],flag2[n2],flag3=0;
    for(int i=0;i<n2;i++)
    {
        scanf("%d",&R[i]);
        flag2[i]=0;
        for(int j=0;j<n1;j++)
        {
            flag[i][j]=0;
        }
    }
    for(int i=0;i<n2;i++)
    {
        int t;
        for(int j=i+1;j<n2;j++)
        {
            if(R[i]>R[j])
            {
                t=R[i];
                R[i]=R[j];
                R[j]=t;
            }
        }
    }
    for(int i=0;i<n2;i++)
    {
        if(i>0)
        {
            if(R[i]==R[i-1])
                continue;
        }
        int count=0,temp=R[i];
        while(temp)
        {
            temp/=10;
            count++;
        }
        for(int j=0;j<n1;j++)
        {
            int t=I[j];
            while(t)
            {
                if(count!=0)
                {
                    int a=0;
                    a=pow(10,count);
                    if(t%a==R[i])
                    {
                        flag[i][j]=1;
                        break;
                    }
                    else {
                        t/=10;
                    }
                }
                else {
                    if(t==R[i])
                    {
                        flag[i][j]=1;
                        break;
                    }
                    else{
                        break;
                    }
                }
            }
        }
    }
    int sum=0;
    for(int i=0;i<n2;i++)
    {
        for(int j=0;j<n1;j++)
        {
            sum+=flag[i][j];
            flag2[i]+=flag[i][j];
        }
        if(flag2[i])
        flag3+=1;
    }
    int x;
    x=sum*2+flag3*2;
    printf("%d",x);
    for(int i=0;i<n2;i++)
    {
        if(i>0)
        {
            if(R[i]==R[i-1])
                continue;
        }
        if(flag2[i])
        {
            printf(" %d %d",R[i],flag2[i]);
            for(int j=0;j<n1;j++)
            {
                if(flag[i][j])
                {
                    printf(" %d %d",j,I[j]);
                }
            }
        }
    }
    printf("\n");
    return 0;
}

发表于 2024-10-10 22:13:43 回复(0)
#include <stdio.h>
#include <string.h>
int incld(int i,int r){//转换成字符串方便判断是否连续包含
    int k,j;
    char istr[0xff];
    char rstr[0xff];
    sprintf(istr, "%d", i);
    sprintf(rstr, "%d", r);
    for(k=0;k<strlen(istr);k++)
        {
            if(istr[k]==rstr[0])//找到第一个数字相同时
            {for(j=1;j<strlen(rstr);j++)
            if(istr[k+j]!=rstr[j]) break;
            // if(k+j>=strlen(istr)||istr[k+j]!=rstr[j]) break; 效果一样,但多考虑了边界条件
            if(j==strlen(rstr)) return 1;}
        }
    return 0;  
}

int main() {
    int i[100]={0};
    int r[100]={0};
    int icount,rcount;
    scanf("%d",&icount);
    for(int j=0;j<icount;j++)
    {scanf("%d",&i[j]);}
    scanf("%d",&rcount);
    for(int j=0;j<rcount;j++)
    {scanf("%d",&r[j]);}

    int temp;//冒泡排序
    for(int m=0;m<rcount-1;m++)
        for(int n=0;n<rcount-1-m;n++)
        if(r[n]>r[n+1]) {
            temp = r[n];
            r[n] = r[n+1];
            r[n+1] =temp;
        }

    int map[icount][rcount];
    memset(map, 0, sizeof(map));
    int match[rcount];
    memset(match, 0, sizeof(match));
    for(int m=0;m<icount;m++)
        for(int n=0;n<rcount;n++)
        {
            if(r[n]==r[n+1]&&n+1<rcount) continue;//去重
            if(incld(i[m],r[n]))
            {map[m][n]=1;match[n]++;}
        }
   
    int sum=0;
    for(int j=0;j<rcount;j++)
    if(match[j]) sum += 2+match[j]*2;
    printf("%d",sum);

    for(int n=0;n<rcount;n++)
        {if(match[n])
        {printf(" %d %d",r[n],match[n]);
        for(int m=0;m<icount;m++)
        if(map[m][n]) printf(" %d %d",m,i[m]);
        }
        }

    return 0;
}
发表于 2024-07-21 17:35:30 回复(0)
很繁琐!
发表于 2024-06-13 20:05:53 回复(0)
#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a,const void *b)
{
    return *(long long *)a-*(long long *)b;
}

int main() {
    int ni,nr,i,j,fr[101][101]={0},count=0,sum=0;
    long long I[101]={0},R[101]={0},temp,temp1,f;
    scanf("%d",&ni);
    for(i=0;i<ni;i++)
        scanf("%lld",&I[i]);
    scanf("%d",&nr);
    for(i=0;i<nr;i++)
    {
        scanf("%lld",&temp);
        f=0;
        for(j=0;j<i;j++)
        {
            if(temp==R[j]) //Ri重复,去重
            {
                f=1;break;
            }
        }
        if(f==0) R[count++]=temp;  
    }
    nr=count; //更新Ri数量
    count=0;
    qsort(R,nr,sizeof(long long int),cmp);
    for(i=0;i<nr;i++)
    {
        count=0;
        for(j=0;j<ni;j++)
        {
            temp=R[i];
            temp1=I[j];
            f=temp1;
            while(temp1>0)
            {
                if(temp%10==temp1%10 && f==temp1) //发现相同部分并判断连续
                {
                    temp=temp/10;
                    temp1=temp1/10;
                    f=temp1;
                }
                else if(temp==R[i]) //还没找到相同部分
                {
                    temp1=temp1/10;
                    f=temp1;
                }
                else if(temp!=R[i])//找到了相同部分,但是中断了
                {
                    temp=R[i];
                }
                else temp1=temp1/10;
                if(temp==0 && temp!=R[i]) break;
            }
            if(temp==0 && temp!=R[i]) //当前Ii合规
            {
                fr[i][0]++;
                fr[i][++count]=j;
            }
        }
        
        if(fr[i][0]!=0) sum=sum+fr[i][0]*2+2; //合规Ii+对应坐标+当前Ri+Ii数量
    }
    printf("%d ",sum);
    for(i=0;i<nr;i++)
    {
        if(fr[i][0]!=0)
        {
            printf("%lld %d ",R[i],fr[i][0]);
            for(j=1;j<=fr[i][0];j++)
            {
                if(i==(nr-1) && j==fr[i][0]) printf("%d %lld",fr[i][j],I[fr[i][j]]);
                else printf("%d %lld ",fr[i][j],I[fr[i][j]]);
            }
        }
    }
    return 0;
}

发表于 2024-02-20 19:46:45 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
    int Iarr[110] = {0};
    int Rarr[110] = {0};
    int i = 0;
    while(scanf("%d",&Iarr[i++]) != EOF)
    {
        for(;i<=Iarr[0];)
        {
            scanf("%d",&Iarr[i++]);
        }
        i = 0 ;
        while(scanf("%d",&Rarr[i++]) != EOF)
        {
            for(;i<=Rarr[0];)
            {
                scanf("%d",&Rarr[i++]);
            }
        }
        int Inum = Iarr[0];
        int Rnum = Rarr[0];
        //对Rarr[]进行冒泡排序
        for (i = 1; i <= Rnum - 1; i++)
        {
            for (int j = i + 1; j <= Rnum; j++)
            {
                if (Rarr[i] > Rarr[j])
                {
                    int tmp = Rarr[i];
                    Rarr[i] = Rarr[j];
                    Rarr[j] = tmp;
                }
            }
        }
        //去掉多余的重复的数据
        int afterRnum = Rnum;
        for (i = 1; i <= afterRnum; i++)
        {
            for (int j = i + 1; j <= afterRnum;)
            {
                if (Rarr[j] == Rarr[i])
                {
                    for (int k = j; k < afterRnum; k++)
                    {
                        Rarr[k] = Rarr[k + 1];
                    }
                    afterRnum--;
                }
                else
                {
                    j++;
                }
            }
        }
        //用来存储结果的数组
        int ret[500] = { 0 };
        int k = 1;
        //把ret数组的第一个位置留出来,用来存储总数
        for (i = 1; i <= afterRnum; i++)
        {
            //如果排序后第一个是0就跳过
            if (Rarr[i] == 0 &&i==1)
            {
                continue;
            }
            //其他数据就保存在ret中
            ret[k++] = Rarr[i];
            //记录一个位置用来存储满足R<i>数据的总数
            int flag = k++;
            char r[31] = { '\0' };
            sprintf(r, "%d", Rarr[i]);
            for (int j = 1; j <= Inum; j++)
            {
                char I[31] = { '\0' };
                sprintf(I, "%d", Iarr[j]);
                if (strstr(I, r))
                {
                    ret[k++] = j - 1;//存储满足数据要求的位置下标
                    ret[k++] = Iarr[j];//存储满足的I数据
                }
            }
            if((k - flag) / 2==0)//如果满足R<i>的数据总数是0,就把k值返回到最开始标记位置的前一个位置重新存储
            {
                k = flag-1;
            }
            else {
            ret[flag] = (k - flag) / 2;
            }
           
        }
        //最后打印出来
        ret[0] = k - 1;
        for (i = 0; i < k; i++)
        {
            printf("%d ", ret[i]);
        }
    }
   
    return 0;
}
发表于 2023-10-09 10:46:39 回复(0)
#include <stdio.h>

typedef struct data {
    int index;
    int value;
} DATA;

//判断R[i]是否在I里面
int R_IN_I(int a, int b) {
    while (a) {
        if (b == a % 10 || b == a % 100 || b == a % 1000)
            return 1;
        a = a / 10;
    }
    return 0;
}

int main() {
    int a, b;
    int I[100] = {0};
    int R[100] = {0};
    scanf("%d", &a);
    for (int i = 0; i < a; i++) {
        scanf("%d", &I[i]);
    }
    scanf("%d", &b);
    for (int i = 0; i < b; i++) {
        scanf("%d", &R[i]);
    }

    //将序列R去重排序
    int temp = 0;
    int R1[100] = {0};
    int p = 0;
    for (int i = 0; i < b - 1; i++) {
        for (int j = 0; j < b - 1 - i; j++) {
            if (R[j] > R[j + 1]) {
                temp = R[j];
                R[j] = R[j + 1];
                R[j + 1] = temp;
            }
        }
    }
    R1[0] = R[0];
    for (int i = 0; i < b - 1; i++) {
        if (R[i] != R[i + 1])
            R1[++p] = R[i + 1];
    }

    //统计R[i]在I里的数量
    int count[100] = {0};
    DATA data[100][100] = {0};
    for (int i = 0; i < p + 1; i++) {
        int q = 0;
        for (int j = 0; j < a; j++) {
            if (R_IN_I(I[j], R1[i])) {
                count[i]++;
                data[i][q].index = j;
                data[i][q].value = I[j];
                q++;
            }
        }
    }

    //整理输出格式
    int sum = 0;
    for (int i = 0; i < 100; i++) {
        if (count[i]) {
            sum += 2 + 2 * count[i];
        }
    }

    printf("%d ", sum);
    for (int i = 0; i < 100; i++) {
        if (count[i]) {
            printf("%d %d ", R1[i], count[i]);
            for (int j = 0; j < count[i]; j++) {
                printf("%d %d ", data[i][j].index, data[i][j].value);
            }
        }
    }

    return 0;
}

发表于 2023-02-22 23:02:01 回复(0)
//超时了。。
#include <stdio.h>
#include <stdbool.h>
#define MAX 100

bool contains(int container, int num) {
    int c_mode = 0;
    int n_mode = 0;
    int n_temp = num;
    bool flag = false;
    if (container == num)
        return true;
    if (container < num)
        return false;
    n_mode = n_temp % 10;
    n_temp /= 10;
    while (container) {
        c_mode = container % 10;
        container /= 10;
        if (n_mode == c_mode) {
            if (!n_temp)
                return true;
            n_mode = n_temp % 10;
            n_temp /= 10;
            flag = true;
        } else {
            n_temp = num;
            n_mode = n_temp % 10;
            n_temp /= 10;
            if (flag)
                container *= 10;
        }
    }
    return false;
}

void sort(int R[], int total_R) {
    for (int i = 0; i < total_R; i++) {
        int min_R = R[i];
        int index = 0;
        bool flag = false;
        for (int j = i + 1; j < total_R; j++)
            if (R[j] < min_R) {
                min_R = R[j];
                index = j;
                flag = true;
            }
        if (flag) {
            R[index] = R[i];
            R[i] = min_R;
        }
    }
}
int main() {
    int I[MAX] = { 0 };
    int R[MAX] = { 0 };
    int total_I, total_R;
    scanf("%d", &total_I);
    for (int i = 0; i < total_I; i++)
        scanf("%d", &I[i]);
    scanf("%d", &total_R);
    for (int i = 0; i < total_R; i++)
        scanf("%d", &R[i]);
    sort(R, total_R);

    int out_info[MAX * MAX] = { 0 };
    int index = 1;
    for (int i = 0; i < total_R; i++) {
        int contain_count = 0;
        bool flag = false;
        if (i > 0 && R[i] == R[i - 1])
            continue;
        out_info[index++] = R[i];
        for (int j = 0; j < total_I; j++) {
            if (contains(I[j], R[i])) {
                contain_count++;
                out_info[++index] = j;
                out_info[++index] = I[j];
                flag = true;
            }
        }
        if (flag) {
            out_info[index - contain_count * 2] = contain_count;
            index++;
        } else
            index--;
    }
    out_info[0] = index - 1;
    for (int i = 0; i <= index - 1; i++)
        printf("%d ", out_info[i]);
    return 0;
}

发表于 2022-12-25 21:40:13 回复(0)
主要是数据输出和数字包含判断,判断时先获取I的位数得到mask,每次将R[i]对mask求余判断是否等于I,不等于则将R[i]除以10继续循环判断。纯c语言确实不好写。
#include <stdio.h>
#include <stdlib.h>

int compare(const void *a, const void *b) {
    return (*(int*)a - *(int*)b);
}

int bitMask(int num) {
    int mask = 10;
    while (num / 10 != 0) {
        num /= 10;
        mask *= 10;
    }
    return mask;
}

int contains(int src, int num) {
    int mask = bitMask(num);
    while (src != 0) {
        if (src % mask == num) {
            return 1;
        }
        src /= 10;
    }
    return 0;
}

int main() {
    int iarr[100] = {0}, rarr[100] = {0};
    int inum = 0, rnum = 0;
    scanf("%d", &rnum);
    for (int i = 0; i < rnum; ++i) {
        scanf("%d", rarr+i);
    }
    scanf("%d", &inum);
    for (int i = 0; i < inum; ++i) {
        scanf("%d", iarr+i);
    }
    // 排序
    qsort(iarr, inum, sizeof(int), compare);
    int arr[100][202] = {0};
    int idx = 0, sum = 0;
    for (int i = 0; i < inum; ++i) {
        // 去重
        if (i > 0 && iarr[i] == iarr[i-1]) {
            continue;
        }
        int tail = 2, cnt = 0;
        for (int j = 0; j < rnum; ++j) {
            if (contains(rarr[j], iarr[i])) {
//                 printf("i: %d, %d %d \n", iarr[i], j, rarr[j]);
                // 写入index和值
                arr[idx][tail++] = j;
                arr[idx][tail++] = rarr[j];
                ++cnt;
            }
        }
        if (cnt == 0) {
            continue;
        }
        // 记录指令和数量
        arr[idx][0] = iarr[i];
        arr[idx][1] = cnt;
        // 计算数字总数
        sum += cnt * 2 + 2;
        ++idx;
    }
    printf("%d ", sum);
//     printf("\n");
    for (int i = 0; i < idx; ++i) {
        for (int j = 0; j < arr[i][1] * 2 + 2; ++j) {
            printf("%d ", arr[i][j]);
        }
//         printf("\n");
    }
    return 0;
}


发表于 2022-08-11 17:23:33 回复(1)
#include <stdio.h>
#include <string.h>
#define    N    100
#define    M    32
int cnt=1;
int match(char str1[],char str2[],int len1,int len2)
{
    int k=0;
    int i=k,j=0;
    while(i<len1&&j<len2)
    {
        if(str1[i]==str2[j])
        {
            i++;
            j++;
        }
        else
        {
            k++;
            i=k;
            j=0;
        }
    }
    if(j==len2)
        return 1;
    else
        return 0;
}
int main()
{
    int numi,numr,I[N],R[N],i,j,k,arr[3*N],temp,flag,flag1[N],left,right,len1,len2;
    char str1[N][M],str2[N][M],ch;
    scanf("%d",&numi);
    for(i=0;i<numi;i++)
    {
        scanf("%d",&I[i]);
        temp=I[i];
        j=0;
        if(temp==0)
        {
            str1[i][0]='0';
            str1[i][1]='\0';
        }
        else
        {
            left=0;right=0;
            while(temp>0)
            {
                str1[i][j++]=temp%10+'0';
                temp/=10;
                right++;
            } 
            str1[i][right]='\0';
            right--;
            while(left<right)
            {
                ch=str1[i][left];
                str1[i][left]=str1[i][right];
                str1[i][right]=ch;
                left++;right--;
            }
        }
    }
    scanf("%d",&numr);
    for(i=0,j=0;i<numr;i++)
    {
        scanf("%d",&temp);
        if(i==0)
        {
            R[j++]=temp;
        }
        else
        {
            flag=0;
            for(k=0;k<j;k++)
            {
                if(temp==R[k])
                {
                    flag=1;break;
                }
            }
            if(flag==0)
            {
                R[j++]=temp;
            }
        }
    }
    k=j;
    for(i=0;i<k-1;i++)
    {
        for(j=0;j<k-1-i;j++)
        {
            if(R[j]>R[j+1])
            {
                temp=R[j];
                R[j]=R[j+1];
                R[j+1]=temp;
            }
        }
    }
    for(i=0;i<k;i++)
    {
         j=0;
         if(R[i]==0)
         {
             str2[i][0]='0';
             str2[i][1]='\0';
         }
        else
        {
            left=0;right=0;temp=R[i];
            while(temp>0)
            {
                str2[i][j++]=temp%10+'0';
                temp/=10;
                right++;
            } 
            str2[i][right]='\0';
            right--;
            while(left<right)
            {
                ch=str2[i][left];
                str2[i][left]=str2[i][right];
                str2[i][right]=ch;
                left++;right--;
            }           
        }
    }
    for(i=0;i<k;i++)
    {
        len2=strlen(str2[i]);    //str2为要查找的子串序列
        temp=0;
        for(j=0;j<numi;j++)
        {
            flag1[j]=0;
            len1=strlen(str1[j]);    //str1为主串序列
            flag1[j]=match(str1[j],str2[i],len1,len2);
            temp+=flag1[j];
        }
        if(temp!=0)
        {
            arr[cnt++]=R[i];
            arr[cnt++]=temp;
            for(j=0;j<numi;j++)
            {
                if(flag1[j]==1)
                {
                    arr[cnt++]=j;
                    arr[cnt++]=I[j];
                }
            }
        }
    }
    arr[0]=cnt-1;
    for(i=0;i<cnt;i++)
    {
        printf("%d ",arr[i]);
    }
    return 0;
}
写了几个小时。。。。。
发表于 2022-04-19 22:29:52 回复(0)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/*全局变量*/
int Total = 0;

/*函数声明*/
void Rank(int *R, int Len_R);
int Cal_Weight(int R);
void Match_I(int R, int *I, int Len_I, int *Output);

int main()
{
	/*int Len_I = 15;
    int I[10000] = { 123, 456, 786, 453, 46, 7, 5, 3, 665, 453456, 745, 456, 786, 453, 123 };
	int Len_R = 5;
    int R[10000] = {6, 3,6, 3, 0 };
	int Output[10000] = { 0 };*/
	int Len_I = 0;
	int Len_R = 0;
    int I[1000] = { 0 };
	int R[1000] = {0};
	int Output[1000] = { 0 };

	while (scanf("%d", &Len_I) != EOF)
	{
		for (int i = 0; i < Len_I; i++)
		{
			scanf("%d", &I[i]);
		}
		scanf("%d", &Len_R);

		for (int i = 0; i < Len_R; i++)
		{
			scanf("%d", &R[i]);
		}

		Rank(R, Len_R);

		for (int i = 0; i < Len_R; i++)
		{
			if (!i)
				Match_I(R[i], I, Len_I, Output);
			else if (R[i - 1] != R[i])
				Match_I(R[i], I, Len_I, Output);
		}
		Output[0] = Total;
		//Match_I(0, I, Len_I, Output);
		for (int i = 0; i < Total + 1; i++)
			printf("%d ", Output[i]);
		printf("\n");

		/*多组数据输入,需要每个循环清空数组和全局变量*/
		memset(I, 0, sizeof(I));
		memset(R, 0, sizeof(R));
		memset(Output, 0, sizeof(Output));
		Total = 0;

	}
	
}

/*将R数组从小到大排序*/
void Rank(int *R, int Len_R)
{
	int temp = 0, k = 0;
	for (int i = 0; i < Len_R - 1; i++)
	{

		for (int j = i + 1; j < Len_R; j++)
		{
			if (R[i] > R[j])
			{
				temp = R[i];
				R[i] = R[j];
				R[j] = temp;
			}
		}
	}
}

/*算出R是几位数,取模运算来匹配I数组*/
int Cal_Weight(int R)
{
	if (R < 10)	
        return 10;
	else if (10 <= R && R < 100)	
        return 100;
	else if (100 <= R && R < 1000)	
        return 1000;
    else
        return 0;
}

/*匹配I数组*/
void Match_I(int R, int *I, int Len_I, int *Output)
{
	int weight_R = 0, temp = 0;
	int match_flag = 0;
	int match_num = 0;
	int match_num_pointer = 0;

	/*算出R是几位数,下方去模运算用*/
	weight_R = Cal_Weight(R);

	for (int i=0; i < Len_I; i++ )
	{
		temp = I[i];
		
		while(temp >= R)
		{
			if (R == (temp % weight_R))
			{
				if (!match_flag)
				{
					match_flag = 1;
					Output[++Total] = R;
					match_num_pointer = Total + 1;
					Total++;
				}
				Output[++Total] = i;
				Output[++Total] = I[i];
				match_num++;
				break;
			}
			temp = temp / 10;
			if (!temp)	break;
		}
	}
	Output[match_num_pointer] = match_num;
}
发表于 2021-07-24 17:25:32 回复(0)
纯c的解法,参考了剑指offer老哥的是否包含的算法,细化了b=0的情况的判断。主要为了各位可以直接贴代码测试,因为剑指老哥有几行没有用代码框。
这题的难点:
1.去重。历遍数组将重复的插到最后一位,然后把数组位数-1.
2.排序。多次历遍数组,每一次都将最大的数放到该次历遍的最后一位,将下次历遍的位数-1.
3.判断是否包含。先取到被包函数的位数,比如为10(b)时位数为2(kb),然后被判断数(a)对10^kb取余,将余数与b对比,再将a/10去掉最后一位重复上述操作,直到a=0。注意b=0的特殊情况,因为此时kb=1,任何大于0的数对1取余都是0.
4.整合输出。这个地方会有很多参数,首先要理清楚要用到哪些参数:不重复的r[i],符合要求的l[i]的位置及l[i]的值,每个r[i]下有多少个符合要求的l[i]的个数.我寻思应该可以用四重数组直接完成取值,但是思考量有点大。简单的方法就是把他们分成三个数组,然后逐一赋值。
#include <stdio.h>
#include <string.h>

void px(int *r, int *gs){//排序
    for(int i=0;i<*gs-1;i++){
        for(int j=0;j<*gs-i-1;j++){
            int c=0;
            if(r[j]>r[j+1]){
                c=r[j];
                r[j]=r[j+1];
                r[j+1]=c;
            }
        }
    }
}

void qc(int *r,int *gs){//去重
    for(int i=0;i<*gs;i++){
        for(int j=i+1;j<*gs;j++){
            if(r[i]==r[j]){
                r[j]=r[*gs-1];
                *gs-=1;
            }
        }
    }
}

int bh(int a,int b){//包含
    int res=0;
    int b_num=0;
    int b_kvalue=1;
    int b2=b;
    //printf("a:%d b:%d \n",a,b);
    while(b2)
    {
        b2=b2/10;
        b_kvalue=b_kvalue*10;      //判断b是几位数字, 则b_kvalue为多少: 如 b=47, b_kvalue为100      
        b_num++;    
    } 
    while(a>0)
    {
        if(b){
            if(a%b_kvalue==b)
            {
                res=1;
                return res;    
            }    
            a=a/10;
        }
        if(!b){
             if(a%10==b)
            {
                res=1;
                return res;    
            }    
            a=a/10;
        }
    }
    return res;
}

int main(){
    char next2='\n';
    char next1=' ';
    while(next2=='\n'){
        int flage=0;
        int r[100]={0};
        int l[100]={0};
        int gs_r=0,gs_l=0;
        int sc_r[100]={0},sc_l[100][100]={0},sc_l_pos[100][100]={0};
        int sc_r_count=0,sc_l_count=0;
        int sum=0,div=0;
        int i_arr[100];
        int l_sum=0;

        //int len_r=0,len_l=0;
        scanf("%d",&gs_l);
        if(gs_l==0)    break;
        for(int i=0;i<gs_l;i++){
            scanf("%d",&l[i]);
        }
        scanf("%d",&gs_r);
        for(int i=0;i<gs_r;i++){
            scanf("%d",&r[i]);
        }

        qc(&r, &gs_r);
        px(&r, &gs_r);
        for(int i=0;i<gs_r;i++){//r[i]
            sc_r[sc_r_count]=r[i];
            for(int j=0;j<gs_l;j++){//l[j]
                if(bh(l[j],r[i] )==1){
                    sc_l[sc_r_count][sc_l_count]=l[j];
                    sc_l_pos[sc_r_count][sc_l_count]=j;
                    sc_l_count++;
                    flage=1;
                }
            }
            i_arr[sc_r_count]=sc_l_count;
            sc_l_count=0;
            if(flage){
                sc_r_count++;
                flage=0;
            }
        }

        for(int i=0;i<sc_r_count;i++){//r[i]
            sum+=i_arr[i];
        }

        printf("%d ",(sum+sc_r_count)*2);

        for(int i=0;i<sc_r_count;i++){//sc_r[i]
            printf("%d %d ",sc_r[i],i_arr[i]);
            for(int j=0;j<i_arr[i];j++){//sc_l[j]
                printf("%d %d ",sc_l_pos[i][j],sc_l[i][j]);
            }
        }
        printf("\n");
        scanf("%c%c",&next1,&next2);
    }
    
    return 0;
}


发表于 2021-07-23 23:35:57 回复(0)