Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1575412
  • 博文数量: 399
  • 博客积分: 8508
  • 博客等级: 中将
  • 技术积分: 5302
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-14 09:28
个人简介

能力强的人善于解决问题,有智慧的人善于绕过问题。 区别很微妙,小心谨慎做后者。

文章分类

全部博文(399)

文章存档

2018年(3)

2017年(1)

2016年(1)

2015年(69)

2013年(14)

2012年(17)

2011年(12)

2010年(189)

2009年(93)

分类: LINUX

2009-12-07 18:22:29

#include
#include
#include
#include
#include
using namespace std;
string add(string  s1, string s2)
{
    string s,tmp;
    long l; //l是长度,表示数有多少位,c表进位
    reverse(s1.begin(),s1.end());
    reverse(s2.begin(),s2.end());
    l = max( s1.size(),s2.size() );
    //高位补零,使长度相等,便于比较和进位
    tmp.assign(l-s1.size(),'0');
    s1+=tmp;
    tmp.assign(l-s2.size(),'0');
    s2+=tmp;
    //按位相加    
    int c=0;
    for(int i=0;i    {
        c+=s1[i]-48+s2[i]-48;
        s+= char(c%10+48);
        c = c/10;
    }
    if(c>0)
        s+= char(c+48);
    reverse(s.begin(),s.end());
    return s;
}
string mul(string s1,string s2)
{
    vector tmp(250); //存放未进位的中间结果,假设相乘结果不超过250位
    string s,t;     //最后结果
    reverse(s1.begin(),s1.end());
    reverse(s2.begin(),s2.end());
    for(int i=0;i    {
        for(int j=0;j        {
            tmp[i+j]+= (s1[i]-48)*(s2[j]-48);//每次都不进位,累加到最后再进位也一样
        }
    }
    long l;     //l是长度,表示数有多少位
    l = s1.length()+s2.length()-1;
    //进位,不进位的情况下l是准确的位数
    for(int i=0;i    {
        tmp[i+1]+=tmp[i]/10;
        tmp[i] %=10;
    }
    int k=l-1;
    while(tmp[k]>10)
    {
        tmp[k+1]+=tmp[k]/10;
        tmp[k]%=10;
        k++;
    }
    for(int i=0;i<=k;i++)
        s+=char(tmp[i]+48);
    reverse(s.begin(),s.end());
    return s;
}
//计算p^3+p^2+3*p
string compute(string s)
{
    //p^2
    string s2 = mul(s,s);
    //p^3
    string s3 = mul(s2,s);
    //3p
    string  coef("3");
    string  t= mul(s,coef);
    //p^3+p^2
    string t1=add(s3,s2);
    //p^3+p^2+3p
    string r=add(t,t1);
    return r;
}
bool bigger(string& a,string& b)
{
    if(a.size()>b.size())
        return true;
    else if(a.size()==b.size())
    {
        return a>b;
    }
    return false;
}
//p^3+p^2+3*p < n
string search_up(string n)
{
    string p(n.length(),'0'),tmp;
    for(int i=0;i    {
        for(int j=1;j<10;j++)
        {
            p[i]=j+'0';
            //去最前面的无意义的0
             if(p.find_first_not_of('0',0) == string::npos)
                                tmp="0";
            else
            {
                 tmp = p;
                 tmp.erase(0,tmp.find_first_not_of('0',0));
                 tmp = compute(tmp);
            }
            if(bigger(tmp,n))
            {
                p[i]=j-1+'0';
                break;
            }
        }
    }
    if(p.find_first_not_of('0',0) == string::npos)
        tmp="0";
    else     
    {
        tmp = p;
        tmp.erase(0,tmp.find_first_not_of('0',0));
    }
    return tmp;
}
    
main()
{
    string n,res;
    cin>>n;
    res=search_up(n);
    cout<}
阅读(1036) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~