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、滥用局部变量不好习惯 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |