天天看點

第九屆藍橋杯【C/C++省賽B組】【第三題:乘積尾零】

題目:

如下的10行資料,每行有10個整數,請你求出它們的乘積的末尾有多少個零?

5650 4542 3554 473 946 4114 3871 9073 90 4329 

2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 

9937 1173 6866 3397 4759 7557 3070 2287 1453 9899 

1486 5722 3135 1170 4014 5510 5120 729 2880 9019 

2049 698 4582 4346 4427 646 9742 7340 1230 7683 

5693 7015 6887 7381 4172 4341 2909 2027 7355 5649 

6701 6645 1671 5978 2704 9926 295 3125 3878 6785 

2066 4247 4800 1578 6652 4616 1113 6205 3264 2915 

3966 5291 2904 1285 2193 1428 2265 8730 9436 7074 

689 5510 8243 6114 337 4096 8199 7313 3685 211 

答案:31

解題思路:兩種方法

        ①直接将所有數相乘,然後每乘一個數就把後面0全部去掉記一下,不過中間會爆long long,這個好辦,每次乘完隻保留後4位非0數字,例如216037就隻保留6037

        ②正解:所有的0都一定是2*5産生的,是以将每個數拆成一堆2乘上一堆5再乘上一個數,之後統計下有多少個2和多少個5取少的那個就是答案

代碼:

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
  int n;
  int num1 = 0;
  int num2 = 0;
  while(cin>>n)
    {
      while(1)
        {
          if(n % 2 == 0)
            {
              n /= 2;
              num1++;
            }
          else if(n % 5 == 0)
            {
              n /= 5;
              num2++;
            }
          else
            {
              break;
            }
        }
    }
  printf("%d\n",num1>num2?num2:num1);
  return 0;
}