今天晚上笔试题目: 求可以整除M 的最小N位正整数。
1 <= M <= 1e6
1 <= N <= 1e6
示例输入:
2
3 10
4 730
输入2表示几组数据
3 表示 N 即期望3位
10 表示 M即 可以整除M
100 ➗ 10 = 10
4 表示 N期望4位
730 表示 M
1460 / 730 = 2
1460为 可以整除 730 的最小4位数
输出
100
1460
###疑惑:
这是我写的代码,因为N位的范围是 1 ~ 1e6 必然溢出,所以考虑 求出比M的位 大一 或相同 时的最小 整数(位数b), 然后往后边部N-b个0.
自测各种数据,加手算,没问题。但是提交通过 0%。懂哥们看看为什么会这样。今天的笔试崩了,就因为这道题很早写完结果0%,改了1戈多小时。我另一个简单版本都20%通过,直接给我今晚整没了。求懂哥指点一下:
#include <iostream>
#include <vector>
using namespace std;
int find_minN(int M, int N, int &flag, int &N_chg)
{
int idx = 1;
int tmp = M;
while(tmp >= 10)
{
tmp = tmp / 10;
++idx;
}
// 不够M的位
if(N < idx)
return -1;
else if(N == idx)
return M;
int minsa = 1;
for(int i = 0; i < idx; ++i)
{
minsa *= 10;
}
int other = minsa % M;
if(other == 0)
{
N_chg = N - idx - 1;
flag = true;
return minsa;
}
else
{
flag = true;
N_chg = N - idx - 1;
return (minsa / M + 1) * M;
}
}
int main()
{
int times = 0;
cin >> times;
vector<vector<int>> input(times, vector<int>(2, 0));
for(int i = 0; i < times; ++i)
{
cin >> input[i][0] >> input[i][1];
}
for(int i = 0; i < times; ++i)
{
int flag = false;
int newN = 0;
int res = find_minN(input[i][1], input[i][0], flag, newN);
if(!flag)
cout << res << endl;
else
{
cout << res;
for(int j = 0; j < newN; ++j)
cout << 0;
if(i != times - 1)
cout << endl;
}
}
}