信息社会,有海量的数据需要分析处理,比如公安局分析身份证号码、 QQ 用户、手机号码、银行帐号等信息及活动记录。
信息社会,有海量的数据需要分析处理,比如公安局分析身份证号码、 QQ 用户、手机号码、银行帐号等信息及活动记录。
一组输入整数序列I和一组规则整数序列R,I和R序列的第一个整数为序列的个数(个数不包含第一个整数);整数范围为0~(2^31)-1,序列个数不限
从R依次中取出R<i>,对I进行处理,找到满足条件的I
: I
整数对应的数字需要连续包含R<i>对应的数字。比如R<i>为23,I 为231,那么I 包含了R<i>,条件满足 。 按R<i>从小到大的顺序:
(1)先输出R<i>;
(2)再输出满足条件的I
的个数; (3)然后输出满足条件的I
在I序列中的位置索引(从0开始); (4)最后再输出I
。 附加条件:
(1)R<i>需要从小到大排序。相同的R<i>只需要输出索引小的以及满足条件的I
,索引大的需要过滤掉 (2)如果没有满足条件的I
,对应的R<i>不用输出 (3)最后需要在输出序列的第一个整数位置记录后续整数序列的个数(不包含“个数”本身)
序列I:15,123,456,786,453,46,7,5,3,665,453456,745,456,786,453,123(第一个15表明后续有15个整数)
序列R:5,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个包含3的I
0--- 123所在的原序号为0
123--- 123包含3,满足条件
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; }
#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; }
#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; }
//超时了。。 #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; }
#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; }
#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; }写了几个小时。。。。。
#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; }
#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; }