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


    更新一次,else少写了一点处理,改掉。

    题目如下

    解题的一点思路

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

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

    #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("
    ");
        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
    ",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
    ",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("_<< 超限!
    %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
    ",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{
                n-=rn[i2];//n-位值 
                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);
        
        
        
    }
  • 相关阅读:
    localStorage、sessionStorage详解,以及storage事件使用
    企业和开发人员究竟该如何适应web标准?
    平面设计常用制作尺寸
    git命令
    TCP/IP、Http、Socket的区别
    canvas
    《千克》
    《小数的加法》
    fiddler设置代理
    《分数的基本性质》
  • 原文地址:https://www.cnblogs.com/pta00/p/12960844.html
Copyright © 2020-2023  润新知