最开始想得太复杂了,想用结构体之类的来实现,后面发现不需要,一个数组走遍天下
思路:1、循环获取R的时候,给R排序
2、将得到的R去重
3、循环去重后的R,将R[i]用sprintf方法转换成char类型,循环I,将I[j]用sprintf方法转换成char类型,用strstr(I[j],R[i])方法判断是否是子字符串,是则加入数组
4、整理数组
c语言的代码如下所示

#include<stdio.h>
int main(void){
    int a,n,m,i,j;
    while(scanf("%d",&n)!=EOF){
        int I[1000]={0},R[1000]={0},R1[1000] = {0},sum[1000] ={0};
        //获取I
        for(i=0;i<n;i++)
            scanf("%d",&I[i]);

        //获取并得到排序后的R
        scanf("%d",&m);
        for(i=0;i<m;i++){
            scanf("%d",&R1[i]);
            //从小到大排序
            a=R1[i];
            for(j=i-1;j>=0;j--){
                if(R1[j] > a){
                    R1[j+1] = R1[j];
                    R1[j] = a;
                }
            }
        }

        //R去重
        R[0] = R1[0];
        j=1;
        for(i=1;i<m;i++){
            if(R1[i] != R1[i-1]){
                R[j] = R1[i];
                j++;
            }
        }
        m=j;

        //查找R在I中的索引和value
        //思路:循环R,找到R[i]对应的I的key和value,并保存,再统计到sum中
        char s1[20],s2[20];
        int key=0,count = 0;
        for(i=0;i<m;i++){
            int rSum[1000] = {0};
            key = 0;
            sprintf(s1, "%d", R[i]);
            for(j=0;j<n;j++){
                sprintf(s2, "%d",I[j]);
                if(strstr(s2,s1)){
                    rSum[key] = j;
                    key++;
                    rSum[key] = I[j];
                    key++;
                }
            }

            //有数据,一起处理
            if(key > 0){
                //先将R[i]和数目放入
                sum[count] = R[i];
                count++;
                sum[count] = key/2;
                count++;
                //放对应的数据
                for(j=0;j<key;j++){
                    sum[count] = rSum[j];
                    count++;
                }
            }
        }
        printf("%d ",count);
        for(int i = 0;i<count;i++)
            printf("%d ",sum[i]);
        printf("\n");
    }
    return 0;

}