首页 > 试题广场 >

单组_spj判断数组之和

[编程题]单组_spj判断数组之和
  • 热度指数:20794 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定两个整数 nm ,请你构造一个长度为 n 的正整数数组,使得其元素之和为 m
保证有 n \leq m

输入描述:
第一行有两个整数 n\ (\ 1 \leq n \leq 10^5\ )m\ (\ n \leq m \leq 10^9\ )


输出描述:
输出 n 个正整数,它们的和需要为 m
示例1

输入

3 6

输出

1 2 3
这个题目就是有问题啊,我输入3 6,输出1 1 4也是符合的呀,为什么报错呢

发表于 2024-11-27 16:05:41 回复(5)
没注意看执行结果,以为红了就是错了,浪费我时间了。。。。。仔细一看题解才发现,我开始的理解是正确的

发表于 2024-09-11 17:20:53 回复(0)
 222 和114都符合
发表于 2025-05-10 16:06:47 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 输入 n 和 m
        int n = scanner.nextInt();
        int m = scanner.nextInt();

        // 创建数组
        int[] array = new int[n];

        // 前 n-1 个元素为 1
        for (int i = 0; i < n - 1; i++) {
            array[i] = 1;
        }

        // 最后一个元素为 m - (n - 1)
        array[n - 1] = m - (n - 1);

        // 输出结果
        for (int num : array) {
            System.out.print(num + " ");
        }
        System.out.println();

        scanner.close();
    }
}
发表于 2024-09-20 23:12:11 回复(0)
换掉自测输入 3 6不严谨
发表于 2025-10-05 14:23:39 回复(0)
#include <iostream>
#include <vector>
using namespace std;

int main () {
int n, m;
cin >> n >> m;
int extra = m - n; // 计算额外需要分配的数值(初始每个数为 1,总和为 n)
vector<int> res (n, 1); // 初始化数组为 n 个 1

// 从第二个数开始,尽量让序列保持递增
for (int i = 1; i < n && extra> 0; ++i) {
// 确保当前数至少比前一个数大 1,计算需要的增量
int need = res [i-1] + 1 - res [i];
// 实际分配的增量(不超过剩余的 extra)
int add = min (need, extra);
res [i] += add;
extra -= add;
}

// 若还有剩余的数值,全部加到最后一个数上(不破坏递增性)
if (extra> 0) {
res.back () += extra;
}

// 输出结果
for (int i = 0; i < n; ++i) {
cout << res [i] << (i == n-1 ? "\n" : " ");
}

return 0;
}
亲测通过
发表于 2025-09-02 19:29:58 回复(0)
这问题对强迫症真不友好 = =
#include <iostream>

using namespace std;

int main()
{
    long n, m;
    cin >> n >> m;
    for(long i = 0; i < n - 1; ++i)
        cout << 1 << " ";
    cout << m - n + 1 << endl;
}

发表于 2025-03-22 17:37:58 回复(0)
n, m = map(int, input().split(" "))
for i in range(n-1):
    # 打印n-1个1,和为n-1
    print(1, end=" ")
print(m - (n - 1), end="")  # 余下的数作为第n个数
发表于 2025-03-20 23:19:02 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int a = m/n;
        int b = m%n;
        int [] arr = new int[n];
        for(int i = 0;i<n;i++){
            arr[i]=a;
        }
        arr[0]+=b;
        for(int i = 0;i<n;i++){
            System.out.print(arr[i]);
            System.out.print(" ");
        }
    }
}
发表于 2024-10-20 16:01:44 回复(0)
/*我认为这个题目主要是两个任务,1,创建一个大小为a的数组,2,数组里面填入大小和为b的数据,这个数据是随机的应该由随机数来给定,并且由裕度来决定随机数的范围,创建a大小的数组,在C语言中不能将变量当做数组大小,所以应该用向堆申请空间的形式创建*/

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define SIZENAM 10     //裕度
int main() {
    int a, b;
    int sum;
    srand((unsigned int) time(NULL));
    int randint =rand()%SIZENAM;
    scanf("%d %d", &a, &b);
    int* array = (int*)malloc(a*sizeof(int));
    if(array == NULL)
    {
        printf("err malloc");
    }
    while(1)
    {
        sum = 0;
        for(int i = 0;i<a;i++)
        {
            array[i] = rand()%SIZENAM ;
            sum+=array[i];
        }
        if(sum == b)
        {
            break;
        }
    }
    for(int i = 0;i<a;i++)
    {
        printf("%d ",array[i]);
    }
    free(array);
    array = NULL;

return 0;

}


发表于 2024-08-23 10:01:16 回复(0)
import java.util.Random;
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        int n = in.nextInt();
        int m = in.nextInt();
        int temp = n;
        for(int i = 0; i < n - 1; i++){
            Random random = new Random();
            int a = random.nextInt(m - temp + 1) + 1;
            m = m - a;
            temp--;
            System.out.print(a + " ");  
        }
        System.out.println(m);
    }
}
发表于 2026-05-16 16:55:12 回复(0)
我的思路是先得到a=m/n,输出啊,m=m%n,然后b做指针从1往后指,找到此时c=m/(n-b+1)不为0的b,a+=c,重复操作
发表于 2026-05-10 19:39:10 回复(0)
我的评价是 题目本身有bug解法 就硬靠1去创,创到后面剩1个 用总和减下 就没了
发表于 2026-04-15 14:03:22 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        //前n-1各元素为1,最后一个m-(n-1)
        int n = in.nextInt();
        int m = in.nextInt();
        for(int i = 0; i < n-1; i++){
            System.out.print(1+" ");
        }
        System.out.print(m-n+1);
    }
}

发表于 2026-04-11 17:27:36 回复(0)
public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            int m = in.nextInt();
            int x = m - n;
            /**
             * 分析:m = n+x = (1..1 + 2 + x) n个
             * 第n个数必然是m-n
             * 前n-2个数必然全是1
             * 第n-1个数必须是2
             * 特例:n=1 和 n=m 情况
             */
            if (n == 1) { // n=1
                System.out.println(m);
                break;
            }

            for (int i = 0; i < n-1; i++) {
                if (i < n - 1) {
                    System.out.print(1 + " ");
                } else if (i == n - 1) {
                    if (x > 0) {
                        System.out.print(2 + " ");
                    } else {
                        System.out.print(1 + " ");
                    }
                }
            }

            if (x > 0) {
                System.out.print(x);
            } else {// n=m
                System.out.print(1);
            }
        }
    }


发表于 2026-04-07 18:19:33 回复(0)
要么n等于m,所有数字都是1,输出全是1的一个数组
要么m大于n,有比1大的,将数组第一个数字增加m-n,数组的和就是m

#include <stdio.h>

int main(){
    int n,m;
    scanf("%d %d",&n ,&m );

    int num[n];
    for(int i = 0 ; i <n ; i++){
        num[i]= 1;
    }

    num[0] += m -n ;
   
    for(int i = 0 ; i <n ; i++){
        printf("%d ",num[i]);
    }

    return 0;

}
发表于 2026-04-01 17:03:32 回复(0)
诶!我直接输入3 6然后print("1 2 3")🤓
发表于 2026-03-22 17:54:01 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        // while (in.hasNextInt()) { // 注意 while 处理多个 case
            int n = in.nextInt();
            int m = in.nextInt();
            for(int i=0;i<n-1;i++){
                System.out.print("1 ");
            }
            System.out.print(m-n+1);
    }
}

发表于 2026-03-16 16:08:23 回复(0)
list1 = list(map(int, input().split()))
m = int(list1[-1])
n = int(list1[0])
list1 = []
if n == m:
    for i in range(n):
        list1.append("1")
    print(" ".join(list1))
else:
    for i in range(n - 1):
        list1.append("1")
    list1.append(str(m - n + 1))
    string = " ".join(list1)
    print(string)
发表于 2026-03-08 15:18:17 回复(0)
public class Program {
    public static void Main() {
        string line=System.Console.ReadLine();
         string[] tokens = line.Split();
         int n =int.Parse(tokens[0]);
         int m= int.Parse(tokens[1]);
        for(int i=1;i<n;++i) System.Console.Write("1 ");
        System.Console.Write(m-n+1);
        
    }
}

发表于 2026-02-23 22:45:26 回复(0)