大数练习【训练】

这种大数题以后还是不要用C来模了。不然签到题都能成手速题。

HDU-1000:

没什么好说的,还能有wa的,吓老子一跳。

HDU-1002

 

 

 

思路:按题意模拟即可,比较1、2串的长度分类方便模拟,注意HDU的格式问题。

#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;

int main()
{
    int t;
    int gg=0;
    scanf("%d",&t);

        int q=1;
    while(t--)
    {

        char a[2007];
        char b[2007];
        char sum[1007];
        int o=0;
        scanf("%s%s",a,b);

        printf("Case %d:\n",q++);
        int la=strlen(a);
        int lb=strlen(b);
        for(int i=0;i<la;i++)
        {
            a[i]-='0';
            printf("%d",a[i]);
        }
        printf(" + ");

        for(int i=0;i<lb;i++)
        {
            b[i]-='0';
            printf("%d",b[i]);
        }
        printf(" = ");

        int cot=0;

        if(la>lb)
        {
            int j=lb-1;
            for(int i=la-1;i>=0;i--)
            {
                int k=b[j];
                if(j<0) k=0;
                //printf("a:%d b:%d cot:%d\n",a[i],k,cot);
                a[i]+=(k+cot);
                cot=0;
                if(a[i]>=10)
                {
                    cot=a[i]/10;//进位
                    sum[o++]=a[i]%10;//取余
                }
                else
                {
                    sum[o++]=a[i];
                }
                j--;
            }
            if(cot!=0) sum[o++]=cot;
        }
        else
        {
            int j=la-1;
            for(int i=lb-1;i>=0;i--)
            {
                int k=a[j];
                if(j<0) k=0;
                //printf("a:%d b:%d cot:%d\n",k,b[i],cot);
                b[i]+=(k+cot);
                cot=0;
                //printf("b:%d\n",b[i]);
                if(b[i]>=10)
                {
                    cot=b[i]/10;//进位
                    sum[o++]=b[i]%10;//取余
                    b[i]%=10;
                }
                else
                    sum[o++]=b[i];

                j--;
            }
            if(cot!=0) sum[o++]=cot;
        }
        for(int i=o-1;i>=0;i--)
        {
            printf("%d",sum[i]);
        }
        //printf("t:%d",t);

        printf("\n");

        if(t!=0) printf("\n");
    }
    return 0;
}

 

HDU-1060:

 

思路:乍看之下大数题,然而直接暴力模拟必Time Limit Exceed。用JAVA就不说了,所有大数题在JAVA面前都是A+B。队友教我数学降维,看的我目瞪口呆。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>

using namespace std;
typedef long long LL;
int main()
{
	int t;
    scanf("%d",&t);
    while(t--!=0)
    {
        LL n;
        scanf("%lld",&n);
        double m=n*log10(n)*1.0;
        m=m-(LL)m;
        m=pow(10,m);
        //cout<<m<<endl;
        printf("%d\n",(int)(floor(m)));
    }
	return 0;
}

 HDU-1250:

 

 

 思路:JAVA秒过题,模拟==掉分。

 

#include <iostream>
#include <cstdio>
#include <string>
#include <math.h>

using namespace std;


int main()
{
    int n;
    while(cin >> n){
        int num[5][2005] = {0};
        num[0][0] = 1;
        num[1][0] = 1;
        num[2][0] = 1;
        num[3][0] = 1;
        int sum, j;
        int len = 1;
        for(int i = 4; i < n; i++){
            sum = 0;
            for(j = 0; j < len; j++){
                sum += num[(i - 4) % 5][j] + num[(i - 3) % 5][j] + num[(i - 2) % 5][j] + num[(i - 1) % 5][j];
                num[i % 5][j] = sum % 10;
                sum /= 10;
            }
            while(sum){
                num[i % 5][j++] = sum % 10;
                sum /= 10;
            }
            len = j;
        }
        len--;
        for( ; len >= 0; len--){
            printf("%d", num[(n - 1) % 5][len]);
        }
        printf("\n");
    }
    return 0;
}

 HDU-1715:

 

和上题没咋变,把a[2],a[3]改改就可以了。

HDU-1753:

 

 

思路:带小数的大数加法题,依然JAVA秒过,带顺带能直接函数处理后缀0。

c++码:

#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;

int main()
{
	char a[1007],b[1007];
	int a1[1007],a2[1007],b1[1007],b2[1007],p1,p2,lena,lenb,i,j,point1,point2;
	while(scanf("%s%s",a,b)!=EOF)
	{
		memset(a1,0,sizeof(a1));
		memset(a2,0,sizeof(a2));
		memset(b1,0,sizeof(b1));
		memset(b2,0,sizeof(b2));
		lena=strlen(a);
		lenb=strlen(b);
		p1=lena;
		for(i=0;i<lena;i++){
			if(a[i]=='.'){
				p1=i;
				break;
			}
		}
		p2=lenb;
		for(i=0;i<lenb;i++){
			if(b[i]=='.'){
				p2=i;
				break;
			}
		}
		for(i=0;i<p1;i++){
			a1[p1-1-i]=a[i]-'0';
		}
		for(j=0,i=p1+1;i<lena;i++,j++){
			a2[j]=a[i]-'0';
		}
		for(i=0;i<p2;i++){
			b1[p2-1-i]=b[i]-'0';
		}
		for(j=0,i=p2+1;i<lenb;i++,j++){
			b2[j]=b[i]-'0';
		}
		for(i=400;i>0;i--){
			a2[i]=a2[i]+b2[i];
			if(a2[i]>=10){
				a2[i]-=10;
				a2[i-1]++;
			}
		}
		a2[i]=a2[i]+b2[i];
		if(a2[i]>=10){
			a2[i]-=10;
			a1[0]++;
		}
		point1=-1;
		for(i=400;i>=0;i--){
			if(a2[i]!=0){
				point1=i;
				break;
			}
		}
		lena=p1;lenb=p2;
		int len=lena>lenb?lena:lenb;
		for(i=0;i<len;i++){
			a1[i]+=b1[i];
			if(a1[i]>=10){
				a1[i]-=10;
				a1[i+1]++;
			}
		}
		point2=0;
		for(j=i;j>=0;j--){
			if(a1[j]!=0){
				point2=1;
			}
			if(point2){
				printf("%d",a1[j]);
			}
		}
		if(point2==0){
			printf("0");
		}
		if(point1!=-1){
			printf(".");
			for(i=0;i<=point1;i++){
				printf("%d",a2[i]);
			}

		}
		cout<<endl;

	}
	return 0;
}

 UVA 424:

和B题类似,累加就可以了。

 

 

#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;

char a[10007];
char b[10007];

int main()
{
    int ok=1;
    int cn=0;
    while(scanf("%s",a)!=EOF)
    {
        if(a[0]=='0') break;
        int l=strlen(a);

        if(ok)
        {
            for(int i=l-1;i>=0;i--)
            {
                a[i]-='0';
                b[cn]+=a[i];
                cn++;
            }
            ok=0;
        }

        //printf("%d\n",cn);
        else{
                for(int i=0;i<l;i++) a[i]-='0';
        if(cn>l)
        {
            int j=l-1;
            int i;
            int cot=0;
            for(i=0;i<=cn;i++)
            {
                if(l-1<0) a[l-1]=0;
                b[i]+=a[l-1]+cot;
                cot=0;
                if(b[i]>=10)
                {
                    cot=b[i]/10;
                    b[i]%=10;
                }
                //printf("b:%d\n",b[i]);
                l--;
            }
            if(cot)
            {
                b[i]++;
                cot=0;
            }
        }
        else
        {
            int i;
            int j=l-1;
            int cot=0;
            for(i=0;i<l;i++)
            {
                b[i]+=(a[j]+cot);
                cot=0;
                if(b[i]>=10)
                {
                    cot=b[i]/10;
                    b[i]%=10;
                }
                //printf("b:%d\n",b[i]);
                j--;
            }
            if(cot)
            {
                b[i]++;
                cn=max(i,cn);
                cot=0;
            }
        }
        }
        }
        for(int i=cn;i>=0;i--)
        {
            if(i==cn&&b[i]==0) continue;
            printf("%d",b[i]);
        }

        printf("\n");
    return 0;
}

 总结:

其他三题没过。(实在是模不动了

JAVA的签到题,c++的手速题。

posted @ 2019-07-17 16:27  Orangeko  阅读(312)  评论(0编辑  收藏  举报