关闭

圈乘运算问题

737人阅读 评论(0) 收藏 举报
分类:
#include "iostream"
#include "algorithm"
#include "cmath"
#include "fstream"
using namespace std;
#define INF 100000
/*
求X和圈乘运算组成的值为K的表达式最少需要多少个圈乘运算

  m为X的位数,圈乘运算表达式最大值不超过 L = (9*m)*9 + 9,当m=1时,不超过171
  m = lg(X+1) 向上取整
  s[L][4]存储各数字信息
  s[i][0] 存储i所需最少圈乘运算次数,s[i][1]存储sum(i),s[i][2]存储max(i),s[i][3]存储min(i)
  s[0][0]、s[0][1]、s[0][2]、s[0][3]分别存储X信息

    s[K][0]为结果
*/

int **s;
int X, K, L;

void count(int num[], int i)
{
    int t;
    int max = 0;
    int min = 10;
    int sum = 0;
    while(i)
    {
        t = i % 10;
        if(t > max)
            max = t;  
        if(t < min)
            min = t;  
        sum += t;     
        i /= 10;
    }
    num[1] = sum;
    num[2] = max;
    num[3] = min;
}

void init()
{
    int m = ceil(log(X+1)/log(10.0)); 
    L = 81 * m + 9;
    if(L < 171)
        L = 171;

    s = new int*[L+1];
    for(int i=0; i<=L; i++)
        s[i] = new int[4];

    for(i=1; i<=L; i++)
    {
        s[i][0] = INF;  //圈乘运算最少次数
        s[i][1] = 0;    //sum(i)
        s[i][2] = 0;    //max(i)
        s[i][3] = INF;  //min(i)
    }

    for(i=1; i<=L; i++)  //计算s[i][4]中的信息
        count(s[i], i); 

    s[0][0] = 0;
    count(s[0], X);
}

int dyna()
{
    init();

    if(X == K)
        return 0;
    if(K > L)
        return -1;

    bool flag = true; 
    while(flag)  //最优值不再更新时退出
    {
        flag = false;
        for(int i=0; i<=L; i++)
        {
            if(s[i][0] < INF)  //i已计算过
                for(int j=0; j<=L; j++)
                    if(s[j][0] < INF)  //j已计算过
                    {
                        int a = s[i][1] * s[j][2] + s[j][3];
                        if(s[a][0] > s[i][0] + s[j][0] + 1) //圈乘个数更少,更新
                        {
                            s[a][0] = s[i][0] + s[j][0] + 1; 
                            flag = true; 
                        }
                    }
        }
    }

    if(s[K][0] < INF)
        return s[K][0];
    else
        return -1;
}

int main()
{
    ifstream fin("圈乘.txt");
    cout << "输入整数X:";
    fin >> X; cout << X;
    cout << "\n输入整数K:";
    fin >> K; cout << K;
    cout << "\n最少圈乘运算个数为:" << dyna() << endl;
    fin.close();
    return 0;
} 

这里写图片描述

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

几个经典的动态规划的算法

列举几个动态规划经典的算法
  • jpbj_zb
  • jpbj_zb
  • 2016-05-05 09:25
  • 4862

密码学大数乘法

大数是算法语言中的数据类型无法表示的数,其位数超过最大数据类型所能表示的范围,所以,在处理大数问题时首先要考虑的是怎样存储大数,然后是在这种存储方式下其处理的实现方法。 一般情况下大数的存储是采用字...
  • gjggj
  • gjggj
  • 2017-03-15 16:47
  • 249

圈乘运算问题

思路源于Will_Lee_Buaa #include using namespace std; int NumLen(int x){//统计位数 int len = 0; while (x>...
  • horizon_zore
  • horizon_zore
  • 2015-10-29 09:11
  • 237

"小密圈"来了,带你了解更多开发技术,和我每天一起进步!

在公众号之后,决定开通小密圈功能,小密圈其实就是类似于知乎上的专栏功能,它的好处在于可以更好的将一些人和技术划定在一个圈子内部,圈子内的人都可以分享各自的技术!第一、为何要开通小密圈呢?有人很好奇,已...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2017-03-10 08:46
  • 3655

白盒测试之圈复杂度,以及可以直接降低圈复杂度的10种重构技术

圈复杂度 圈复杂度(Cyclomatic Complexity)是一种代码复杂度的衡量标准。它可以用来衡量一个模块判定结构的复杂程度,数量上表现为独立现行路径条数,也可理解为覆盖所有的可能情况最少使...
  • kaka1121
  • kaka1121
  • 2016-09-22 20:09
  • 3919

组合补考的我且先装个比,竞赛图中求汉密尔顿圈算法设计

竞赛图找哈密尔顿回路   下面内容转自http://blog.sina.com.cn/s/blog_8d84b9240101fdwj.html: 对于一个图中是否存在一条哈密顿路,没有可靠的充分...
  • a519781181
  • a519781181
  • 2016-07-13 13:11
  • 763

付费的「小密圈」值不值得我们加入呢?

听说最早听说小密圈是在2016年,小道消息的冯大辉老师在公众号发文说自己开通了小密圈。当时没有在意,只知道需要花199元才能加入这个圈子。进入2017年,似乎业内的大V们,尤其内容从业者们纷纷都选择开...
  • Marno__
  • Marno__
  • 2017-03-01 09:09
  • 3158

圈复杂度详解

一、现象1. 代码设计不规范。当项目规模达到一定的程度,比如达到十万行的代码量。那么项目肯定存在有些类特别大,方法特别多、特别长。以上因素会导致什么后果呢?
  • ITxiaodong
  • ITxiaodong
  • 2017-04-09 23:09
  • 2375

基于Table方法降低代码圈复杂度

描述:           在项目开发过程中,经常要求圈复杂度不能超过10,有时候写着写着圈复杂度就很大,我在项目代码中见过函数圈复杂度大于100的函数,由于历史的原因,代码越积越多,没人出去重构,导...
  • xiaoding133
  • xiaoding133
  • 2015-04-25 22:01
  • 2024

动圈扬声器构成的详细剖析

上面我已经较为详细地介绍了扬声器的发声原理以及扬声器的评测指标。 接下来我准备为大家详细地剖析一下扬声器的构成。首先让我们来看一张扬声器的结构图: 可以清楚地看出,大的扬声器主要构成有: ...
  • killzero
  • killzero
  • 2013-02-13 15:46
  • 2548
    个人资料
    • 访问:363891次
    • 积分:11611
    • 等级:
    • 排名:第1517名
    • 原创:822篇
    • 转载:47篇
    • 译文:4篇
    • 评论:124条
    最新评论