sum=0,len=数字位数,从最高位开始往个位遍历: ① 判断当前第i位数字的范围: a. x <= 3,sum += x×8len-i(eg:30以内的完好扇区数=3×10以内的完好扇区数-1,减掉的为第30号) b. 3<x<=6,sum += (x-1)×8len-i c. 6<x,sum += (x-2)×8len-i ③ x=3或6: sum-1,结束循环(3456,因为首位的3,3000开始以后的都不是完好扇区,不用处理)
代码
#include<cstdio>#include<string.h>#include<math.h>usingnamespace std;char input[25];intmain(){double sum, x;int len;while(scanf("%s", input)!=EOF){
sum =0;
len =strlen(input);for(int i=0; i<strlen(input); i++){
x = input[i]-'0';if(x<=3)
sum += x*pow(8, len-i-1);elseif(x<=6)
sum +=(x-1)*pow(8, len-i-1);else
sum +=(x-2)*pow(8, len-i-1);if(x==3|| x==6){
sum--;break;}}printf("%.0f\n", sum);}return0;}