SOJ-1020大数取模

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

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

【难点】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=='\0')
					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=='\0')
                    break;
                next++;
            }
            if(i!=0)
            {
                printf(",%c",num_10);   
            }else{
                printf("%c",num_10);
            }
            /******核心计算部分********/
        }
        printf(")\n");
    }
    return 0;
}                                 

【收获】

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值