zoukankan      html  css  js  c++  java
  • 大数练习【训练】

    这种大数题以后还是不要用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:
    ",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
    ",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
    ",k,b[i],cot);
                    b[i]+=(k+cot);
                    cot=0;
                    //printf("b:%d
    ",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("
    ");
    
            if(t!=0) printf("
    ");
        }
        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
    ",(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("
    ");
        }
        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
    ",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
    ",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
    ",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("
    ");
        return 0;
    }
    

     总结:

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

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

  • 相关阅读:
    linux之iptable案例
    nginx常用命令参数
    laravel中的多对多关系详解
    MySql计算时间差函数
    总结下Mysql分表分库的策略及应用
    swoole扩展实现真正的数据库连接池
    linux常用命令整理
    innodb mvcc实现机制
    mysqlslap 压力测试使用总结
    mysql索引总结
  • 原文地址:https://www.cnblogs.com/orangeko/p/11201789.html
Copyright © 2011-2022 走看看