大整数问题

题目描述:有一个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;
}

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

posted on 2008-11-17 17:07  Phinecos(洞庭散人)  阅读(839)  评论(0编辑  收藏  举报

导航