Java教程

一种等价类划分问题

本文主要是介绍一种等价类划分问题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

题目描述

在两个正整数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;
}
这篇关于一种等价类划分问题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!