区间取最小值最大值-位值和
更新一次,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 }