【编程之美】2.4 1的数目
这道题其实是做过了的,在http://www.cnblogs.com/dplearning/p/3921535.html中
但是再次做还是相当的糟糕。又看了一遍答案。
关键:要求每一位上1的个数, 其任意一位上1的个数受当前位、高位、低位三方面的影响。 注意这三位怎么求,注意数据类型。注意循环条件。
#include <stdio.h> long long Sum1s(unsigned long long n) { unsigned long long iCount = 0; unsigned long long iFactor = 1; unsigned long long iCurrent = 0; unsigned long long iHigher = 0; unsigned long long iLower = 0; while(n/iFactor != 0) { iHigher = n / (iFactor * 10); iLower = n % iFactor; iCurrent = (n / iFactor) % 10; switch(iCurrent) { case 0: iCount += iHigher * iFactor; break; case 1: iCount += iHigher * iFactor + iLower + 1; break; default: iCount += (iHigher + 1) * iFactor; break; } iFactor *= 10; } return iCount; } int main() { long long num = Sum1s(123); return 0; }
扩展问题,如果数字不是10进制的如何:
很简单,把所有用到10的地方都换成需要的进制数就可以了。
long long Sum1sDifferentFactor(unsigned long long n, unsigned char factor) { unsigned long long iCount = 0; unsigned long long iFactor = 1; unsigned long long iCurrent = 0; unsigned long long iHigher = 0; unsigned long long iLower = 0; while(n/iFactor != 0) { iCurrent = (n / iFactor) % factor; iHigher = n / (iFactor * factor); iLower = n % iFactor; switch(iCurrent) { case 0: iCount += iHigher * iFactor; break; case 1: iCount += iHigher * iFactor + iLower + 1; break; default: iCount += (iHigher + 1) * iFactor; break; } iFactor *= factor; } return iCount; }