【题目链接】
洛谷 P1151 子数整数
【题目考点】
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;
}