【题意】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、滥用局部变量不好习惯