HDU 5429 【大数除法模拟】

生死一瞬间。。。QAQ

在debug之后我想到如果都是0怎么办,然后去百度了一下,说全是0的数列不是等比数列。。。再见,于是我看了好久也看不出来哪里还有错,试了好多数据。。

看了题解,题解是用大数模板,由于如果使用除法,会有小数产生,所以用了a[i]*a[i]=a[i+1]*a[i-1]来做。

我是认为如果比值是小数的话那么一定不是等比数列,因为所有的数都是整数。居然自己写了一个大数除法,倍感骄傲呵呵哒

#include <cstdio>
#include <cstring>
#include <string>
#include <iostream>
using namespace std;
#define maxn 210
int n;
string a[maxn];
int cmp(string x,string y)
{
    if(x.length()!=y.length())
        return x.length()>y.length()?1:-1;
    for(int i=0;i<x.length();i++)
        if(x[i]!=y[i])
            return x[i]>y[i]?1:-1;
    return 0;
}
void getclear(string &x)
{
    for(string::iterator t=x.begin();t!=x.end();)
    {
        if(*t<='9'&&*t>'0') break;
        t=x.erase(t);
    }
}
string have(string &x,string y)
{
    //cout<<"have:"<<x<<" "<<y<<endl;
    string ret="";
    int num=0;
    if(cmp(x,y)==-1) return ret="0";
    else if(cmp(x,y)==0)
    {
        x="";
        return ret="1";
    }
    while(cmp(x,y)!=-1)
    {
        for(int i=x.length()-1,j=y.length()-1;i>=0||j>=0;i--,j--)
        {
            if(j<0)
            {
                if(x[i]<'0') x[i]+=10,x[i-1]-=1;
                else break;
                continue;
            }
            if(x[i]>=y[j]) x[i]=(x[i]-y[j])+'0';
            else
            {
                x[i-1]--;
                x[i]=(x[i]+10-y[j])+'0';
            }
        }
        num++;
        getclear(x);
        
    }
    while(num)
    {
        ret=char(((num%10)+'0'))+ret;
        num/=10;
    }
    getclear(x);
    return ret;
}
string cal(string x,string y)
{
    string chu="",bei="",ret="";
    int tmp=cmp(x,y);
    if(tmp==1) bei=x,chu=y;
    else if(tmp==-1) bei=y,chu=x;
    else
    {
        ret="1";
        return ret;
    }
    int len=chu.length()-1;
    string rem="";
    for(int i=0;i<=len;i++) rem+=bei[i];
    for(int i=len;i<bei.length();i++)
    {
        ret+=have(rem,chu);
        //cout<<"ret: "<<ret<<" "<<"rem: "<<rem<<endl;
        if(i+1>=bei.length()) break;
        rem+=bei[i+1];
    }
    if(rem.length()!=0)
    {ret="";}//cout<<"length: "<<rem.length()<<endl;}
    //cout<<"finale-ret: "<<ret<<endl;
    getclear(ret);
    return ret;
}
int solve()
{
    int st,en,flag;
    int tmp=cmp(a[0],a[1]);
    if(tmp==1)
        st=0,en=n,flag=1;
    else if(tmp==-1)
        st=n-1,en=0,flag=-1;
    else
    {
        for(int i=1;i<n;i++)
            if(a[i]!=a[i-1]) return 0;
        return 1;
    }
    string s=cal(a[0],a[1]);
    //cout<<"the first: "<<s<<endl;
    for(int i=st;i<n&&i>=0;i+=flag)
    {
        if(i+flag>=n||i+flag<0) break;
        string ttmp=cal(a[i],a[i+flag]);
        //cout<<ttmp<<endl;
        if(ttmp==""||ttmp!=s) return 0;
    }
    return 1;
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        cin>>n;
        int flag=0;
        for(int i=0;i<n;i++)
        {cin>>a[i];getclear(a[i]);if(!a[i].length()) flag++;}
        if(flag&&flag!=n) {cout<<"No"<<endl;continue;}
        if(n==1||n==2) {cout<<"Yes"<<endl;continue;}
        
        cout<<(solve()?"Yes":"No")<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值