zoukankan      html  css  js  c++  java
  • 【bzoj1263】[SCOI2006]整数划分 高精度

    题目描述

    从文件中读入一个正整数n(10≤n≤31000)。要求将n写成若干个正整数之和,并且使这些正整数的乘积最大。 例如,n=13,则当n表示为4+3+3+3(或2+2+3+3+3)时,乘积=108为最大。

    输入

    只有一个正整数: n (10≤n≤31000)

    输出

    第1行输出一个整数,为最大乘积的位数。 第2行输出最大乘积的前100位,如果不足100位,则按实际位数输出最大乘积。 (提示:在给定的范围内,最大乘积的位数不超过5000位)。

    样例输入

    13

    样例输出

    3
    108


    题解

    高精度

    首先根据某小学奥数理论,如果n%3==0,则全拆成3;如果n%3==1,则拆出来一个4,其余全拆成3;如果n%3==2,则拆出来一个2,其余全拆成3.

    然后高精度乘低精度就好了。

    由于有位数限制,所以比较懒没有压位,可能会慢点。

    #include <cstdio>
    #include <cstring>
    struct data
    {
    	int len , num[5010];
    	data()
    	{
    		len = 0 , memset(num , 0 , sizeof(num));
    	}
    	data operator=(const int a)
    	{
    		len = 1 , num[0] = a;
    		return *this;
    	}
    	data operator*(const int a)const
    	{
    		data t;
    		int i;
    		for(i = 0 ; i < len ; i ++ ) t.num[i] += num[i] * a , t.num[i + 1] += t.num[i] / 10 , t.num[i] %= 10;
    		t.len = len + (bool)t.num[len];
    		return t;
    	}
    	void output()
    	{
    		printf("%d
    " , len);
    		int i;
    		for(i = len - 1 ; i >= 0 && i >= len - 100 ; i -- ) printf("%d" , num[i]);
    		printf("
    ");
    	}
    }ans;
    int main()
    {
    	int n , i;
    	scanf("%d" , &n);
    	ans = (n + 1) % 3 + 2;
    	for(i = 1 ; i <= (n - 2) / 3 ; i ++ ) ans = ans * 3;
    	ans.output();
    	return 0;
    }
  • 相关阅读:
    常用排序算法(七)归并排序
    常用排序算法(六)堆排序
    常用排序算法(五)选择排序
    常用排序算法(四)希尔排序
    常用排序算法(三)直接插入排序
    常用排序算法(二)快速排序
    常用排序算法(一)冒泡排序
    Linux内核中双向链表的经典实现
    回溯法
    迪杰斯特拉Dijkstra算法介绍
  • 原文地址:https://www.cnblogs.com/GXZlegend/p/6670378.html
Copyright © 2011-2022 走看看