poj 1150 The Last Non-zero Digit

<textarea cols="90" rows="15" name="code" class="cpp">//poj 1150 The Last Non-zero Digit (计数) /* 题解:http://www.aowe.net/n285c6.aspx这位老兄的题解够清楚了,只是网页有毒,汗。。。 PS: 好像和之前做的求阶乘的0尾数个数的题如出一辙,只不过这题是求非0的最后一位。除了 经典的求质因数2和5的个数外,还要求以3、7、9这样的奇数结尾的数的个数。 */ #include &lt;iostream&gt; #include &lt;algorithm&gt; #include &lt;cmath&gt; #include &lt;vector&gt; using namespace std; const int inf = 1&lt;&lt;28; int n,m; //返回2或5的个数 int getnum(int n,int val) { int ans=0; while(n) { ans+=(n/=val); } return ans; } //返回1、3或7 的 个数 int getx(int n,int val) { int ans=0; for (int i=n;i;i&gt;&gt;=1) for (int j=i;j;j/=5) { ans+=j/10 + (j%10&gt;=val); } return ans; } int num[10]; //分别代表2^i(i=2、3、7、9)的个位数循环节 int fac[4][4]={6,2,4,8, 1,3,9,7, 1,7,9,3, 1,9,1,9}; int main() { while (scanf("%d%d",&amp;n,&amp;m)!=EOF) { int ans=1; m=n-m; num[5]=getnum(n,5)-getnum(m,5); num[2]=getnum(n,2)-getnum(m,2); if (num[5]&gt;num[2]) { printf("5/n"); continue; } else if (num[5]==num[2]) ans=1; else ans=fac[0][(num[2]-num[5])%4]; num[3]=getx(n,3)-getx(m,3); ans=ans*fac[1][num[3]%4]%10; num[7]=getx(n,7)-getx(m,7); ans=ans*fac[2][num[7]%4]%10; num[9]=getx(n,9)-getx(m,9); ans=ans*fac[3][num[9]%2]%10; printf("%d/n",ans); } system("pause"); return 0; } </textarea>

你可能感兴趣的:(poj 1150 The Last Non-zero Digit)