int numberOfOnes(const char* str) { if(str == NULL || *str < '0' || *str > '9' || *str == '\0') { return 0; } int first = *str - '0'; unsigned int length = static_cast<unsigned int>(strlen(str)); if(length == 1 && first == 0) { return 0; } if(length == 1 && first > 0) { return 1; } //假设str是"21345", numFirstDigit是10000~19999中1的数目 int numFirstDigit = 0; if(first > 1) { numFirstDigit = powerBase10(length - 1); } else if(first == 1) { numFirstDigit = atoi(str + 1) + 1; } //numOtherDigit是数字10000~19999的第一位之外的数位中的数目 int numOtherDigit = first * (length - 1) * powerBase10(length - 2); int numRecursive = numberOfOnes(str + 1); return numFirstDigit + numOtherDigit + numRecursive; }
//方法二 int findOnesFromOneToN_Solution2(int n) { if(n <= 0) { return 0; } char str[50]; sprintf(str, "%d", n); return numberOfOnes(str); }
int main() { int n,m; scanf("%d %d",&n, &m); long long int * skills = malloc(n*(sizeof(long long int))); long long parsed; int i,j; char str[500][500]; for(i=0;i<n;i++){ char * ptr; scanf("%s",str[i]); //parsed = strtoll(str, & ptr, 2); // printf("%llX\n", parsed); //skills[i] = parsed; } // qsort(skills,n,sizeof(skills[0]),comp); long long maxteam=0; long long maxskill=0; long long temp; for(i=0;i<n;i++){ for(j=i+1;j<n;j++){ temp = numberOfOnes(str[i],str[j],m); if(temp>maxskill){ maxskill=temp; maxteam =1; } else if(temp == maxskill){ maxteam++; } } } //maxskill = numberOfOnes(maxskill); printf("%lld\n%lld\n",maxskill,maxteam); return EXIT_SUCCESS; }