模拟与高精度:最大乘积

简介: 模拟与高精度:最大乘积

题目描述

一个正整数一般可以分为几个互不相同的自然数的和,如 3=1+2,4=1+35,=1+4=2+3,6=1+5=2+4。现在你的任务是将指定的正整数 nn 分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。

输入格式  只一个正整数 n,(3≤n≤10000)。

输出格式第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。第二行是最大的乘积。

输入输出样例

输入

10


输出

2 3 5

30

#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
typedef long long ll;
int n,a[1000],t;
struct bn{
  int len;
  int d[10000];
  bn() {
    memset(d, 0, sizeof(d));
    len = 0;
  }
};
bn mul(bn a, int b) {
  int carry = 0;
  bign res;
  for(int i = 0; i < a.len; i++) {
    int tem = a.d[i] * b + carry;
    res.d[res.len++] = tem % 10;
    carry = tem / 10;
  }
  while(carry) {
    res.d[res.len++] = carry % 10;
    carry /= 10;
  }
  while(res.len > 1 && res.d[res.len - 1] == 0) res.len--;
  return res;
}
void output(bn ans) {
  for(int i = ans.len - 1; i >= 0; i--)
    cout << ans.d[i];
  cout << endl;
}
int main() {
  cin >> n;
  if(n < 5) {
    cout << n;
    return 0;
  }
  int id = 2, sum = 0;
  while(n) {
    a[t++] = id;
    sum += id++;
    if(sum == n)
      break;
    if(sum > n) {
      if(sum == n + 1) {
        a[0] = 1;
        a[t - 1]++;
      }
      else {
        for(int i = 0; i < t; i++)
          if(a[i] == sum - n) {
            a[i] = 1;
            break;
          }
      }
      break;
    }
  }
  bn ans;
  ans.len = 1;
  ans.d[0] = 1;
  for(int i = 0; i < t; i++) {
    if(a[i] != 1)
      cout << a[i] << " ";
  }
  cout << endl;
  for(int i = 0; i < t; i++) {
    ans = mul(ans, a[i]);
  
  }
  output(ans);
  return 0;
}
目录
相关文章
|
2月前
本周练习题目(高精度,大数值)
本周练习题目(高精度,大数值)
|
3月前
|
人工智能 算法 BI
【算法基础】基础算法(二)--(高精度、前缀和、差分)(下)
【算法基础】基础算法(二)--(高精度、前缀和、差分)(下)
|
3月前
|
存储 算法 索引
【算法基础】基础算法(二)--(高精度、前缀和、差分)(上)
【算法基础】基础算法(二)--(高精度、前缀和、差分)(上)
|
3月前
|
机器学习/深度学习 算法
蒙特卡洛模拟求圆周率
蒙特卡洛模拟求圆周率
56 0
|
存储 人工智能 算法
【高精度加减乘除法、一维二维前缀和&&差分】思路讲解及代码实现
用一篇Blog来讲解下最近学到的高精度加减乘除法、一维二维前缀和&&差分等算法,为日后的刷题打下坚实的基础。
67 0
|
机器学习/深度学习 传感器 算法
基于Matlab模拟单元平均、审核式、有序统计CFAR检测门限
基于Matlab模拟单元平均、审核式、有序统计CFAR检测门限
|
存储 算法 大数据
基础算法-高精度除法
高精度算法 为什么要使用高精度算法 C++ 每一个变量都有自己的类型,每个类型都有自己的存储长度范围。
【数字IC手撕代码】Verilog偶数分频|题目|原理|设计|仿真(二分频,四分频,六分频,八分频,偶数分频及特殊占空比)
【数字IC手撕代码】Verilog偶数分频|题目|原理|设计|仿真(二分频,四分频,六分频,八分频,偶数分频及特殊占空比)
【数字IC手撕代码】Verilog偶数分频|题目|原理|设计|仿真(二分频,四分频,六分频,八分频,偶数分频及特殊占空比)
|
定位技术
(枚举)(模拟)(二位前缀和)99. 激光炸弹
(枚举)(模拟)(二位前缀和)99. 激光炸弹
69 0
|
机器学习/深度学习 传感器 人工智能
【物理应用】基于Zernike多项式的大气湍流相位屏的数值模拟附matlab代码
【物理应用】基于Zernike多项式的大气湍流相位屏的数值模拟附matlab代码