【题目链接】
【题目考点】
1. 循环:数位分离
2. 数字组合
【解题思路】
解法1:取出三个三位数字
对于一个五位数字
a
1
a
2
a
3
a
4
a
5
a_1a_2a_3a_4a_5
a1a2a3a4a5
s
u
b
1
=
a
1
a
2
a
3
sub_1=a_1a_2a_3
sub1=a1a2a3,是x的前3位,要取到前3位的方法是:x/100。
s
u
b
2
=
a
2
a
3
a
4
sub_2=a_2a_3a_4
sub2=a2a3a4,是x的中间3位,要取到中间3位的方法是:x/10%1000。
s
u
b
3
=
a
3
a
4
a
5
sub_3=a_3a_4a_5
sub3=a3a4a5,是x的中间3位,要取到最后3位的方法是:x%1000。
枚举10000~30000的每一个数字,通过计算得到该五位数字分解出的
s
u
b
1
,
s
u
b
2
,
s
u
b
3
sub_1, sub_2, sub_3
sub1,sub2,sub3,判断这三个数字是否都是k的倍数(除以k的余数为0)
设标志位hasOutput
,标记是否有输出。
如果
s
u
b
1
,
s
u
b
2
,
s
u
b
3
sub_1, sub_2, sub_3
sub1,sub2,sub3这三个数字都是k的倍数,则输出该数字,将hasOutput
设为真
最后通过判断hasOutput
判断是否有输出,如果没有输出,则输出No。
解法2:将数字数位分离保存到数组
枚举10000~30000的每一个数字,对于一个五位数字
a
1
a
2
a
3
a
4
a
5
a_1a_2a_3a_4a_5
a1a2a3a4a5将其数位分离,保存到数组a
中。
而后分别进行数字组合,组合出
s
u
b
1
=
a
1
a
2
a
3
sub_1=a_1a_2a_3
sub1=a1a2a3,
s
u
b
2
=
a
2
a
3
a
4
sub_2=a_2a_3a_4
sub2=a2a3a4,
s
u
b
3
=
a
3
a
4
a
5
sub_3=a_3a_4a_5
sub3=a3a4a5
判断这三个数字是否都是k的倍数,是则输出。
最后如果没有输出数字则输出No。
【题解代码】
解法1:取出三个三位数字
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
#define N 105
int main()
{
bool hasOutput = false;
int k, a, b, c;
cin >> k;
for(int i = 10000; i <= 30000; ++i)
{
a = i/100;
b = i/10%1000;
c = i%1000;
if(a%k == 0 && b%k == 0 && c%k == 0)
{
hasOutput = true;
cout << i << endl;
}
}
if(hasOutput == false)
cout << "No";
return 0;
}
解法2:将数字数位分离保存到数组
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
#define N 105
int main()
{
bool hasOutput = false;
int k, a[10], sub1, sub2, sub3;
cin >> k;
for(int i = 10000; i <= 30000; ++i)
{
for(int x = i, d = 5; x > 0; x /= 10, d--)
a[d] = x%10;
sub1 = a[1]*100+a[2]*10+a[3];
sub2 = a[2]*100+a[3]*10+a[4];
sub3 = a[3]*100+a[4]*10+a[5];
if(sub1%k == 0 && sub2%k == 0 && sub3%k == 0)
{
hasOutput = true;
cout << i << endl;
}
}
if(hasOutput == false)
cout << "No";
return 0;
}