给定一个正整数N,写下从1开始到N的所有整数,然后数一下其中出现1的个数。
例如 N=3, 1,2,3 出现1个1
N=11, 1,2,3,4,5,6,7,8,9,10,11 出现4个1
解法1:
从1 开始遍历到N,将其中每一个数中含有1的个数加起来,就得到所有1的个数。
程序清单:
class count1num{ public int count(int n){ int m=0; while (n!= 0){ if((n)==1){ m+=1; } n=n/10; } return m; } }
解法2:
将每一位上1的个数相加起来就是所有的1的个数和,例如123 个位出现1的个数为13,十位出现1的个数为20,百位出现1的个数为24,所有出现1的个数13+20+24=57.
程序清单:
// 各个位数上1 的个数之和 class count2{ public int count(int n){ int iCount=0; int iFactor=1; int iLowerNum=0; int iCurrNum=0; int iHigherNum=0; while((n/iFactor )!=0){ iLowerNum = n - (n/iFactor) * iFactor; iCurrNum = ( n / iFactor) % 10; iHigherNum = n / (iFactor*10); switch (iCurrNum) { case 0: iCount += iHigherNum * iFactor; break; case 1: iCount += iHigherNum * iFactor + iLowerNum +1; break; default: iCount += (iHigherNum + 1) * iFactor; break; } iFactor *= 10; } return iCount; } }