更新一次,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); }