区间取最小值最大值-位值和

题目如下

解题的一点思路

最小值简单,最大值就要进行一系列的██████。

我觉得我写的没人能看明白了,自己琢磨吧......唉。

#include <stdio.h>
#include <windows.h> 
#include <math.h>

int main(void){
    UINT x=0,l=2000,r=8000;//区间2000~8000 
    UINT lw=0,rw=0;//区间值的位数 
    UINT nn[10]={0};//,nn2[10]={0},nn3[10]={0};
    
    scanf("%u%u%u",&x,&l,&r);//输入数字 
    printf("\n");
    UINT w=0,sum=0;
    w=l;// 
    while(w){
        sum++;
        w/=10;
    }
    lw=sum;//下限长度 
    sum=0; 
    w=0;
    w=r;// 
    while(w){
        sum++;
        w/=10;
    }
    rw=sum;//上限长度 
    //printf("%u %u\n",lw,rw); 
    for(UINT i=0,temp=0,temp2=0;i<10;i++){//得到每位,到数组1234=4,3,2,1 
        temp2=x%(UINT)ceil(pow(10,i+1));
        nn[i]=(temp2-temp)/(UINT)ceil(pow(10,i));
        //nn2[i]=nn[i];
        //nn3[i]=nn[i];
        temp=temp2;
    }
    
    UINT ln[10]={0},rn[10]={0};
    for(UINT i=0,temp=0,temp2=0;i<lw;i++){//得到每位,区间最小值2000 
        temp2=l%(UINT)ceil(pow(10,i+1));
        ln[i]=(temp2-temp)/(UINT)ceil(pow(10,i));
        temp=temp2;
    }
    UINT n=0;
    UINT l2=l;
    for(int i=0;i<lw;i++){//先将每位数的和得到,最小值 
        n+=ln[i];
    }
    //printf("%u",n);
    for(UINT i=0,i2=0,temp=0;i<666;i++){//i2-位指针变量 

        if(ln[i2]==9){//判断位指针进位 
            i2++;
        }
        if(n!=x){
            n++;//加到28 
            l2+=ceil(pow(10,i2));
            ln[i2]++;
            
        }
        else{
            break;
        }
        
    }
    printf("最小值=%u\n",l2);
    n=0;//初始化 n为初始计数,8000=8 
    UINT r2;
    for(UINT i=0,temp=0,temp2=0;i<rw;i++){//得到每位,区间最大值8000 
        temp2=r%(UINT)ceil(pow(10,i+1));
        rn[i]=(temp2-temp)/(UINT)ceil(pow(10,i));
        temp=temp2;
    }
    for(int i=0;i<rw;i++){//先将每位数的和得到,最大值 
        n+=rn[i];
    }
    
    for(UINT i=0,i2=0,temp=0;i<666;i++){//i2-位指针变量 

        if(i2==(rw-1)){//0000=0,1,2,3 超限 
            printf("_<< 超限!\n%d",0);
            break;
        }
        if(rn[i2+1]!=0){
            n-=rn[i2];//n-位值 
            rn[i2+1]--;

//            for(int k=0;k<4;k++){
//                printf("k=%u\n",rn[k]);
//            }
            if((n-1)+(i2+1)*9>=x){        
                r2=((n-1)+(i2+1)*9)-x;//r2 记录差值 
                n=r-(UINT)ceil(pow(10,i2+1));
                for(int ii=0;ii< (i2+1);ii++){
                    n-=rn[ii]*(UINT)ceil(pow(10,ii));
                    n+=9*(UINT)ceil(pow(10,ii));
                    rn[ii]=9;
                }
                
                break;
            }
            else{
                rn[i2+1]++;
                i2++;//如果<28,位增加 
            }
        }
        else{
            i2++;//如果=0,位增加 
        }
    
    }

    for(UINT i=0,i2=0,temp=0;i<r2;i++){//i2-位指针变量 
        if(rn[i2]==0){//判断位指针进位 
            i2++;
        }        
        n-=ceil(pow(10,i2));
        rn[i2]--;
        
    }
    printf("最大值=%u\n",n);
    
    
    
}

猜你喜欢

转载自www.cnblogs.com/pta00/p/12960844.html
今日推荐