题目描述
已知连续正整数数列{K}=K1,K2,K3…Ki的各个数相加之和为S,i=N (0<S<100000, 0<N<100000), 求此数列K。
输入描述
输入包含两个参数,1)连续正整数数列和S,2)数列里数的个数N。
输出描述
如果有解输出数列K,如果无解输出-1。
用例
输入 | 525 6 |
输出 | 85 86 87 88 89 90 |
说明 | 无 |
输入 |
|
输出 | -1 |
说明 | 无 |
题目解析
本题解题思路:
由于要求连续正整数数列的和,因此,S / N 的结果必然是数列的中间值,比如 525 / 6 = 87.5,由于6是偶数个,因此87.5其实就是 87 和 88 的中间值。
再比如 9 / 3 = 3,而9是 2 3 4 数列的和,而3是奇数个,因此3就是2 3 4 数列的中间值。
得到中间值后,我们就可以根据连续正整数数列半径求出连续数列两个边界值,如果左边界~右边界的元素之和为S,否则求得边界就是符合要求的。
最后,返回两个边界之内的值即可。
JavaScript算法源码
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.on("line", (line) => {
const [sum, n] = line.split(" ").map(Number);
console.log(getResult(sum, n));
});
function getResult(sum, n) {
const mid = Math.floor(sum / n);
let left, right;
if (n % 2 == 0) {
const half = n / 2;
left = mid - half + 1;
right = mid + half;
} else {
const half = (n - 1) / 2;
left = mid - half;
right = mid + half;
}
const arr = [];
let total = 0;
for (let i = left; i <= right; i++) {
arr.push(i);
total += i;
}
if (total == sum) return arr.join(" ");
else return "-1";
}
Java算法源码
import java.util.Scanner;
import java.util.StringJoiner;
public class Main {
// 输入获取
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int sum = sc.nextInt();
int n = sc.nextInt();
System.out.println(getResult(sum, n));
}
// 算法入口
public static String getResult(int sum, int n) {
int mid = sum / n;
int left, right, half;
if (n % 2 == 0) {
half = n / 2;
left = mid - half + 1;
} else {
half = (n - 1) / 2;
left = mid - half;
}
right = mid + half;
StringJoiner sj = new StringJoiner(" ");
int total = 0;
for (int i = left; i <= right; i++) {
sj.add(i + "");
total += i;
}
if (total == sum) return sj.toString();
else return "-1";
}
}
Python算法源码
# 输入获取
sumV, n = map(int, input().split())
# 算法入口
def getResult():
mid = sumV // n
if n % 2 == 0:
half = n // 2
left = mid - half + 1
right = mid + half
else:
half = (n - 1) // 2
left = mid - half
right = mid + half
arr = [i for i in range(left, right + 1)]
total = sum(arr)
if total != sumV:
return "-1"
else:
return " ".join(map(str, arr))
# 算法调用
print(getResult())
C算法源码
#include <stdio.h>
#include <string.h>
int main() {
int sum, n;
scanf("%d %d", &sum, &n);
int mid = sum / n;
int left, right, half;
if(n % 2 == 0) {
half = n / 2;
left = mid - half + 1;
} else {
half = (n - 1) / 2;
left = mid - half;
}
right = mid + half;
char res[100000];
int total = 0;
for(int i = left; i <= right; i++) {
char tmp[1000];
sprintf(tmp, "%d", i);
strcat(res, tmp);
if(i < right) {
strcat(res, " ");
}
total += i;
}
if(total == sum) {
puts(res);
} else {
puts("-1");
}
return 0;
}
免责声明:
1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文
评论0