五家共井问题


“五家共井”问题和“鸡兔同笼”问题一样,都是一个著名的问题。具体的题目如下:现在有五家共用一口井,甲、乙、丙、丁、戊五家各有一条绳子汲水(下面用文字表示每一家的绳子):甲×2+乙=井深,乙×3+丙=井深,丙×4+丁=井深,丁×5+戌=井深,戌×6+甲=井深,求甲、乙、丙、丁、戊各家绳子的长度和井深。

len1X2+len2=len2X3+len3=len3X4+len4=len4X5+len5=len5X6+len1

由此推出

len1=len2+len3/2

len2=len3+len4/3

len3=len4+len5/4

len4=len5+len1/5

由此可以看出以下几点 

len3能被2整除

len4能被3整除

len5能被4整除

len1能被5整除

按照这个思路


void FiveFamilyHasWell(int *h,int *len1,int *len2,int *len3,int *len4,int *len5){
    int flag;//标志位
    flag=1;
    while(flag){
        (*len5)+=4;
        *len1=0; //第一次写的写的时候一句忘记写了,导致死循环 (len5不断的增加,在len5的基础上 len1每次循环都必须初始成0,不然死循环)
        while(flag){
            (*len1) +=5;
            
            (*len4)=(*len5) + (*len1)/5;
        
            (*len3)=(*len4) + (*len5)/4;
       
             //不能整除 直接下次循环
            if((*len3)%2){
                
                continue;
            }
            //不能整除 直接下次循环
            if((*len4)%3){
                continue;
            }
            (*len2)= (*len3) + (*len4)/3;
            //不满足 直接外层循环
            if((*len2 + *len3/2)< *len1){
                break;
            }
            //找到了标志位置为 0
            if((*len2 + (*len3)/2)== (*len1)){
                flag=0;
            }
            
        }
        
    }
    
    *h= 2*(*len1)+ (*len2);
}

int main(){   
    int h=0;
      int len1=0;
      int len2=0;
      int len3=0;
      int len4=0;
      int len5=0;
    FiveFamilyHasWell(&h, &len1, &len2, &len3, &len4, &len5);
    printf("甲 %d \n乙 %d \n丙 %d \n丁 %d \n戊 %d \n井深 %d\n",len1,len2,len3,len4,len5,h);
    return 0
}

五家共井问题_第1张图片



你可能感兴趣的:(C语言趣味编程)