损坏的RAID5 C语言代码

这里我是直接给出了代码:

#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;
} 

这一道题目的重点是理解题目给出的关键信息去完成这一道题。所以,在理解题目之后,我们就可以找到解题的重点,即在除特例的情况之外,我们只要掌握了目标信息所在的确切的位置和剩余硬盘的信息,这一题就可以说是解决了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值