Hdu5429,数学+高精度+等比序列判断

来源:互联网 发布:中国m2历年数据曲线图 编辑:程序博客网 时间:2024/05/19 13:13

题意:

给出n个高精度的数,判断是否是等比序列。

范围:0<n<=100,每个数值长度不超过100。

分析:

根据题意,可得这道题肯定得用高精度解决,用数组模拟乘法计算过程。

判断是否为等比序列方法:a[i],a[i+1],a[i+2],对于任意的i,有a[i]*a[i+2]=a[i+1]*a[i+1]。

所以用高精度模拟乘法计算,判断相邻三项是否都满足上述关系式即可。

注意:

①题目中给出的数可能有前导零;

②等比序列的公比为非零的数;但是当序列全为零的时候,也是等比序列

如:0 0 0 0是等比序列,因为公比可以为1,2……,

而:1 0 0 0不是等比序列,公比为0。

注意这两件事,具体代码还是比较简单的,注意高精度乘法的书写细节。

具体代码:

#include<cstdio>#include<algorithm>#include<iostream>#include<vector>#include<cstring>#include<cmath>using namespace std;typedef long long LL;int t,n;char s[110][110],str[110][110];int res[300];char Res[300];string product(char a[],char b[]){//    cout<<"***************************"<<endl;//    cout<<a<<' '<<b<<endl;    int len1=strlen(a);    int len2=strlen(b);    memset(res,0,sizeof(res));    memset(Res,0,sizeof(Res));    for(int i=0;i<len1;i++) //2    {        for(int j=0;j<len2;j++) //1        {            int c,d;            c=a[i]-'0';            d=b[j]-'0';            res[i+j]+=c*d;            res[i+j+1]+=(res[i+j]/10);            res[i+j]%=10;            //printf("%d %d %d %d\n",c,d,res[i+j],res[i+j+1]);        }    }    for(int i=0;i<len1+len2-1;i++) Res[i]=res[i]+'0';    if(res[len1+len2-1]) Res[len1+len2-1]=res[len1+len2-1]+'0';//    cout<<Res<<endl;    return Res;}bool judge(string a,string b){//    cout<<a<<' '<<b<<endl;//    cout<<"--------------------------"<<endl;    int len1=a.size();    int len2=b.size();    if(len1!=len2) return false;    for(int i=0;i<len1;i++)    {        if(a[i]!=b[i]) return false;    }    return true;}int main(){    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        for(int i=0; i<n; i++)        {            scanf("%s",str[i]);        }        int e=0;        for(int i=0;i<n;i++)        {            int len=strlen(str[i]);            for(int j=len-1;j>=0;j--)            {                s[i][len-1-j]=str[i][j];            }            while((s[i][len-1]=='0')&&(len>1))            {                len-=1;            }            s[i][len]='\0';            if((len==1)&&(s[i][len-1]=='0'))            {                e++;            }//            cout<<s[i]<<endl;        }        if(e>0)        {            if(e<n)            cout<<"No"<<endl;            else cout<<"Yes"<<endl;            continue;        }        bool flag=true;        string A,B;//        char A[200],B[200];        for(int i=1;i<n-1;i++)        {            A=product(s[i-1],s[i+1]);//            cout<<"A= "<<A<<endl;            B=product(s[i],s[i]);//            cout<<"B= "<<B<<endl;            bool f=judge(A,B);            if(!f)            {                flag=false; break;            }        }        if(flag) cout<<"Yes"<<endl;        else cout<<"No"<<endl;    }    return 0;}/*101031 1 131 4 2516 8 4 2 1*/


0 0
原创粉丝点击