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

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

题目如下

解题的一点思路

 

 

 

 

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

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

 

  1 #include <stdio.h>
  2 #include <windows.h> 
  3 #include <math.h>
  4 
  5 int main(void){
  6     UINT x=0,l=2000,r=8000;//区间2000~8000 
  7     UINT lw=0,rw=0;//区间值的位数 
  8     UINT nn[10]={0};//,nn2[10]={0},nn3[10]={0};
  9     
 10     scanf("%u%u%u",&x,&l,&r);//输入数字 
 11     printf("\n");
 12     UINT w=0,sum=0;
 13     w=l;// 
 14     while(w){
 15         sum++;
 16         w/=10;
 17     }
 18     lw=sum;//下限长度 
 19     sum=0; 
 20     w=0;
 21     w=r;// 
 22     while(w){
 23         sum++;
 24         w/=10;
 25     }
 26     rw=sum;//上限长度 
 27     //printf("%u %u\n",lw,rw); 
 28     for(UINT i=0,temp=0,temp2=0;i<10;i++){//得到每位,到数组1234=4,3,2,1 
 29         temp2=x%(UINT)ceil(pow(10,i+1));
 30         nn[i]=(temp2-temp)/(UINT)ceil(pow(10,i));
 31         //nn2[i]=nn[i];
 32         //nn3[i]=nn[i];
 33         temp=temp2;
 34     }
 35     
 36     UINT ln[10]={0},rn[10]={0};
 37     for(UINT i=0,temp=0,temp2=0;i<lw;i++){//得到每位,区间最小值2000 
 38         temp2=l%(UINT)ceil(pow(10,i+1));
 39         ln[i]=(temp2-temp)/(UINT)ceil(pow(10,i));
 40         temp=temp2;
 41     }
 42     UINT n=0;
 43     UINT l2=l;
 44     for(int i=0;i<lw;i++){//先将每位数的和得到,最小值 
 45         n+=ln[i];
 46     }
 47     //printf("%u",n);
 48     for(UINT i=0,i2=0,temp=0;i<666;i++){//i2-位指针变量 
 49 
 50         if(ln[i2]==9){//判断位指针进位 
 51             i2++;
 52         }
 53         if(n!=x){
 54             n++;//加到28 
 55             l2+=ceil(pow(10,i2));
 56             ln[i2]++;
 57             
 58         }
 59         else{
 60             break;
 61         }
 62         
 63     }
 64     printf("最小值=%u\n",l2);
 65     n=0;//初始化 n为初始计数,8000=8 
 66     UINT r2;
 67     for(UINT i=0,temp=0,temp2=0;i<rw;i++){//得到每位,区间最大值8000 
 68         temp2=r%(UINT)ceil(pow(10,i+1));
 69         rn[i]=(temp2-temp)/(UINT)ceil(pow(10,i));
 70         temp=temp2;
 71     }
 72     for(int i=0;i<rw;i++){//先将每位数的和得到,最大值 
 73         n+=rn[i];
 74     }
 75     
 76     for(UINT i=0,i2=0,temp=0;i<666;i++){//i2-位指针变量 
 77 
 78         if(i2==(rw-1)){//0000=0,1,2,3 超限 
 79             printf("_<< 超限!\n%d",0);
 80             break;
 81         }
 82         if(rn[i2+1]!=0){
 83             n-=rn[i2];//n-位值 
 84             rn[i2+1]--;
 85 
 86 //            for(int k=0;k<4;k++){
 87 //                printf("k=%u\n",rn[k]);
 88 //            }
 89             if((n-1)+(i2+1)*9>=x){        
 90                 r2=((n-1)+(i2+1)*9)-x;//r2 记录差值 
 91                 n=r-(UINT)ceil(pow(10,i2+1));
 92                 for(int ii=0;ii< (i2+1);ii++){
 93                     n-=rn[ii]*(UINT)ceil(pow(10,ii));
 94                     n+=9*(UINT)ceil(pow(10,ii));
 95                     rn[ii]=9;
 96                 }
 97                 
 98                 break;
 99             }
100             else{
101                 rn[i2+1]++;
102                 i2++;//如果<28,位增加 
103             }
104         }
105         else{
106             n-=rn[i2];//n-位值 
107             i2++;//如果=0,位增加 
108         }
109     
110     }
111 
112     for(UINT i=0,i2=0,temp=0;i<r2;i++){//i2-位指针变量 
113         if(rn[i2]==0){//判断位指针进位 
114             i2++;
115         }        
116         n-=ceil(pow(10,i2));
117         rn[i2]--;
118         
119     }
120     printf("最大值=%u\n",n);
121     
122     
123     
124 }

 

posted @ 2020-05-25 21:05  『PTA00』  阅读(510)  评论(0编辑  收藏  举报