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;}
Problem 1682 拯救数据.题意扇区编号的数字中含有3或6的损坏输入:总扇区数N(0<N<2^64),超出int类型范围输出:完好的扇区数思路对10:个位不能取3、6,有8种取法,即8个完好的扇区对100:个位8种取法,十位8种取法,即8*8=64个完好的扇区……对1020(264 = ):即820个完好的扇区笔记每组数据要初始化数组为0一组...