大整数问题

题目描述:有一个k(1≤k≤80)位的十进制正整数n,设计一个程序,找到满足条件:P3+ P2+3P≤nP的最大值。

测试用例:

输入:

1000000000000001000000000000003000000000000001

输出:

100000000000000

#include 
<
iostream
>

#include 

<
string
>


using
 
namespace
 std;
#include 


decnum.h

decnum n,p;

int
 k;

char
 succ(
char
 num)
{

//
后继数字


    
if
 (num
==

9

)
    {
        num 

=
 

0

;
    }
    

else

        

++
num;
    

return
 num;
}

char
 pred(
char
 num)
{

//
前一个数字


    
return
 

num;
}

bool
 IsOk(
const
 
char
*
 temp,
int
 size)
{

//
判断是否当前值符合条件


    decnum num(temp,size);
    decnum sum 

=
 pow(num, 
3
)
+
pow(num,
2
)
+
(num
*
3
);
    

if
 (sum
>
n)
    {

//
太大了


        
return
 
false
;
    }
    

return
 
true
;
}


void
 search()
{
    

char
*
 temp 
=
 
new
 
char
[k];
    

int
 i;
    

//
初始化都是0


    
for
 (i
=
0
;i
<
k;
++
i)
    {
        temp[i] 

=
 

0

;
    }
    temp[i] 

=
 

\0

;
    

for
 (i
=
0
;i
<
k;
++
i)
    {
        

do

        {
            

//
尝试这一位


            temp[i] 
=
 succ(temp[i]);
            

if
 (temp[i]
==

0

)
            {

//
此位置从0到9都尝试过了


                
break
;
            }
        }
        

while
(IsOk(temp,k));
        

//
回退到前一位合法值


        temp[i] 
=
 pred(temp[i]);
    }
    

//
输出结果


    p 
=
 decnum(temp,k);
    cout

<<
p
<<
endl;
}

int
 main()
{
    

string
 line;
    getline(cin,line);
    n 

=
 decnum(line.c_str(), line.length());
    k 

=
 line.length();
//
位数


    search();
    cout

<<
n
<<
endl;
    

return
 
0
;
}

本文使用的大数类请参见一个大数运算类》这篇文章

    原文作者:大整数乘法问题
    原文地址: https://blog.csdn.net/weixin_34189116/article/details/85416455
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞