一种等价类划分问题
作者:互联网
题目描述
在两个正整数m和n给定的整数范围内(m 小于 n,且不包括m和n)取出各位数字之和均为k的倍数的所有数(k为正整数),然后将这些数划分成若干个子集合,每个子集合中的元素满足其各位数字之和相等,请输出各个子集合, 其中 n 不大于10000。
每个集合元素按从小到大输出,逗号间隔,如果有多个集合,则输出多行;集合中最小元素较小的在前面行输出。
例如,m=11, n=35, k=3
则,
12,21,30 这三个数的每位数字之和均为3,且为3的倍数
15,24,33 这三个数的每位数字之和为6,且为3的倍数
18,27 这二个数的每位数字之和为9,也为3的倍数
由于三组数的最小数分别是12,15,18,于是,输出结果应为:
12,21,30
15,24,33
18,27
关于输入
一行,三个值:m,n,k,以逗号间隔
关于输出
输出各位数之和为k的倍数的若干行,每一行中,其元素的各位数字和相等,且前面行元素的各位数字之和小于后面行元素的各位数字之和,每行的元素按增序排列,以逗号间隔。
例子输入
11,35,3
例子输出
12,21,30
15,24,33
18,27
源码
#include<iostream>
using namespace std;
int numbersum(int m) {
int sum = 0;
while (m > 0) {
sum += (m % 10);
m /= 10;
}
return sum;
}
int main() {
int m, n, k;
char c;
cin >> m >>c>> n >>c>> k;
//m,n,k用逗号分隔,cin不能识别!!
for (int i = k; i < 40; i += k) {
bool first = 1;
for (int j = m + 1; j < n; j++) {
if (numbersum(j)==i) {
if (first) {
if (i != k)
cout << endl << j;
else
cout << j;
first = 0;
}
else
cout << "," << j;
}
}
}
return 0;
}
标签:输出,12,15,数字,int,元素,等价,一种,划分 来源: https://blog.csdn.net/Hyx1273724818/article/details/120792083