学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!
附上汇总贴:小猴编程C++ | 汇总-CSDN博客
【题目描述】
小猴有一个智能密码锁,密码锁是由 5 个轮子组成,每个轮子上都写着数字 0∼9。在第 i 轮子上,他可以拨动轮子移动。每次移动有两种类型:
① 向上移动:表示将第 i 个数字向上移动 1 步,数字 9 向上移动之后会回到数字 0;
② 向下移动:表示将第 i 个数字向下移动 1 步,数字 0 向下移动之后会回到数字 9。
如上图所示,密码锁显示的数字序列是 0,0,0,0,0。
智能密码锁新颖的点在于,如果 5 个轮子上的数字按照从左到右的顺序组成的整数是质数时,密码锁就可以被打开了。
现在小猴带着你一起参观他的智能密码锁,小猴真正给你演示密码锁的使用,为了更快的打开密码锁,请你帮助小猴计算最少需要多少次移动才能打开密码锁。
【输入】
一行,包含一个五位数(可能含有前导 0),表示密码锁初始时从左到右五个轮子上显示的数字。
【输出】
一行,包含一个五位数(可能含有前导 0),表示打开密码锁通过最少的移动次数得到的质数。如果有多种可能,输出满足条件的最大整数。
【输入样例】
10004
【输出样例】
11003
【代码详解】
#include <bits/stdc++.h>
#include <cmath>
using namespace std;
int a[10] = {0};
int b[10] = {0};
int ans[10] = {0};
bool isPrime(int n)
{
if (n<2) return false;
for (int i=2; i<=sqrt(n); i++) {
if (n%i==0) return false;
}
return true;
}
int main()
{
int move=0, minn=1e9, maxn=-1e9;
for (int i=1; i<=5; i++) {
scanf("%1d", &a[i]);
}
for (int i=1; i<=99999; i++) {
int cnt = 0;
if (isPrime(i)) {
b[1] = i/10000; b[2] = i/1000%10; b[3] = i/100%10; b[4] = i/10%10; b[5] = i%10;
for (int j=1; j<=5; j++) {
cnt += min((a[j]-b[j]+10)%10, (b[j]-a[j]+10)%10);
}
if (cnt <= minn) {
minn = cnt;
if (i>maxn) {
maxn = i;
ans[1] = i/10000; ans[2] = i/1000%10; ans[3] = i/100%10; ans[4] = i/10%10; ans[5] = i%10;
}
}
}
}
for (int i=1; i<=5; i++) {
cout << ans[i];
}
return 0;
}
【运行结果】
10004
11003