Codeforces 858A. k-rounding 数论

题目:

 

题意:输入n和k,找到一个最小的数,满足末尾有至少k个0和是n的倍数。

 

最小的情况 ans = n,最大的情况 ans = n*pow(10,k)。

 

令 k = pow(10,k);

我们发现所有可能的情况就是 ans = n*(k的因子)。

把k的因子从小到大遍历一遍就可以了。

 

代码:

#include <bits\stdc++.h>
using namespace std;
typedef long long ll;

int main() {
    ll n,k;
    cin >> n >> k;
    k = (ll)pow(10,k);
    for(ll i = 1;i <= k; i++){
        if(k%i == 0 && n*i%k == 0){
            cout << n*i << endl;
            break;
        }
    }
    return 0;
}

 

 

我在网上看到的另一种方法,想法很不错:

 

#include<bits/stdc++.h>  
#define rep(i,a,b) for(int i=a;i<=b;i++)  
#define dep(i,a,b) for(int i=a;i>=b;i--)  
#define LL long long  
using namespace std;  
  
LL n,k,cnt5=0,cnt2=0;  
int main()  
{  
    cin>>n>>k;  
    while(n%5==0&&cnt5<k){n/=5;cnt5++;}  
    while(n%2==0&&cnt2<k){n/=2;cnt2++;}  
    rep(i,1,k)n*=10;  
    cout<<n<<endl;  
    return 0;  
}  

他的做法是把n的因数2和5除掉缩小成一个末尾没有0,且不具备乘以一个数让末尾变成0的数。

然后在n的末尾补上k个0,这个n恰好是符合要求的值。

posted @ 2017-09-19 17:37  ninding  阅读(276)  评论(0编辑  收藏  举报