加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

SOJ-1020大数取模

发布时间:2020-12-14 02:58:56 所属栏目:大数据 来源:网络整理
导读:【题意】1020题目意思很简单,给出1个大数(位数=1000)和n个个位除数,输出每个取模的结果。 【分析】根据题意,我们都知道即使是long long这样的整型也存不下,只能选择字符串来存储。记为BigInteger[1...N],取模的过程和我们做除法的过程一样,从高位开

【题意】1020题目意思很简单,给出1个大数(位数<=1000)和n个个位除数,输出每个取模的结果。

【分析】根据题意,我们都知道即使是long long这样的整型也存不下,只能选择字符串来存储。记为BigInteger[1...N],取模的过程和我们做除法的过程一样,从高位开始,依次得到的个位余数作为下一次除数的十位,依此类推直到字符串遇到结束符''

【难点】1、构建字符串表示大整数 ? 2、从高位开始取余数时整型和字符型的转化 ?3、控制流程防止Time Out

【代码实现-V1】

#include<stdio.h>
int main()
{
	int N,T;
	char BigInteger[100][1001];
	int num[100];
	int divNum[100][100];
	scanf("%d",&T);
	for(N = 0 ; N < T ; N++)
	{
		int i;
		scanf("%d",&num[N]);
		for(i = 0 ; i < num[N] ; i++)
		{
			scanf("%d",&divNum[N][i]);
		}
		fflush(stdin);
		gets(BigInteger[N]);
	}
	for(N = 0 ; N < T ; N++)
	{
		char* BigInt = BigInteger[N];	        //大整数
		int i,total = num[N];			//除数个数
		for(i = 0 ; i < num[N] ; i++)
		{
			int div = divNum[N][i];		//除数
			/******核心计算部分********/
			int next = 2;<span style="white-space:pre">			</span>//初始化
			char num_10 = BigInt[0],num_1=BigInt[1];
			while(1)
			{
				num_10 = (((num_10-48)*10+(num_1-48))%div)+'0';//计算余数作为下一个被除数的十位上的数字
				num_1 = BigInt[next];      //取个位数
				if(num_1=='')
					break;
				next++;
			}
			if(i==0)
			{
				printf("(%c",num_10);
			}else if(i==num[N]-1){
				printf(",%c)n",num_10);
			}else{
				printf(",%c",num_10);
			}
			/******核心计算部分********/
		}
	}
	return 0;
}
? ? ? ? ? ? ?这段代码没有通过,是因为 Time Limit Exceeded,这跟很久没有写OJ代码有关系,包括局部变量重复浪费这些问题都没有考虑,于是认真分析了一遍还有哪些可以改进的:

1、输入部分没有可改进的

2、如果可用全部变量变量就不用局部变量

3、最后发现,时间耗费最大的内循环无法改变,只有外循环还有一次合并的机会,也就是说每次得到输入后立刻执行计算处理过程。

【代码实现-V2】(AC):

#include<stdio.h>
int main()
{
    int N,T;
    char BigInteger[50][1001];
    int num[50];
    int num_10,num_1,div,next,i,divNum[50][100];//使用全局变量
    scanf("%d",&T);
    for(N = 0 ; N < T ; N++)
    {
        int i;
        scanf("%d",&num[N]);
        for(i = 0 ; i < num[N] ; i++)
        {
            scanf("%d",&divNum[N][i]);
        }
        fflush(stdin);
        gets(BigInteger[N]);
 	printf("(");
        for(i = 0 ; i < num[N] ; i++)
        {
            div = divNum[N][i];//除数
            /******核心计算部分********/
            next = 2;
            num_10 = BigInteger[N][0];
            num_1=BigInteger[N][1];
            while(1)
            {
                num_10 = (((num_10-48)*10+(num_1-48))%div)+'0';
                num_1 = BigInteger[N][next];
                if(num_1=='')
                    break;
                next++;
            }
            if(i!=0)
            {
                printf(",num_10);   
            }else{
                printf("%c",num_10);
            }
            /******核心计算部分********/
        }
        printf(")n");
    }
    return 0;
}                                 

【收获】

1、重新熟悉了一下fflush(stdin)、gets函数

2、整型转字符型+'0',字符型转整型(数字类的根据ASCII码-48)

3、滥用局部变量不好习惯

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读