这里我是直接给出了代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//建立一个足够大的数组
char disk[1000][81*1024];
//获取字符串
void GetData(char *num,int num_disk,int p_disk_block){
int b=0;
for(;b<8;b++){
num[b]=disk[num_disk][p_disk_block*8+b];
}
}
int main(){
//n是硬盘的个数,s是条带的大小,l是现存的硬盘个数;
int n,s,l,a,m;
int disk_right[1000]={0};
scanf("%d %d %d",&n,&s,&l);
a=l;
//输入数据的一个过程
int long_data=0,cnt_block=0,cnt_s=0;
while(a--){
int b;
scanf("%d",&b);
disk_right[b]=1;
scanf("%s",&disk[b]);
if(disk_right[b]!=0){
long_data=strlen(disk[b]);
}
}
cnt_block=(n-1)*(long_data/8);
scanf("%d",&m);
while(m--){
int b;
scanf("%d",&b);
int p_block_s=b/s; //块所在的条带的位置
int p_block_disk=p_block_s%n; //块所在的磁盘
int s_num=p_block_s/(n-1); //条带所在的列
int p_s_block=b-p_block_s*s; //块在条带中的位置
int check_disk=n-1-s_num%n; //检验的磁盘所在
int p_disk_block=s_num*s+p_s_block; //块在磁盘中的位置
if(b>=cnt_block){
printf("-\n");
}else if(disk_right[p_block_disk]){
int a=0,i=8*p_disk_block;
for(;a<8;a++){
printf("%c",disk[p_block_disk][i+a]);
}
printf("\n");
}else{
if(l<n-1){
printf("-\n");
continue;
}
int num_1=0,num_2=0,Flag=n;
char check_data[9];
GetData(check_data,check_disk,p_disk_block);
sscanf(check_data,"X",&num_1);
while(Flag--){
if(Flag==p_block_disk||Flag==check_disk) continue;
char check_data_1[9];
GetData(check_data_1,Flag,p_disk_block);
sscanf(check_data_1,"X",&num_2);
num_1^=num_2;
}
printf("%08X\n",num_1);
}
}
return 0;
}
这一道题目的重点是理解题目给出的关键信息去完成这一道题。所以,在理解题目之后,我们就可以找到解题的重点,即在除特例的情况之外,我们只要掌握了目标信息所在的确切的位置和剩余硬盘的信息,这一题就可以说是解决了。