题目链接
我起初绝对没有想到决定这个程序是否TLE的关竟是
(1)是否在程序的最初声明i,j,虽然这两个变量由于数组的关系多次用到,但是重新的声明会占用过多时间吗??现在自己还不清楚,,
(2)除此之外在这个题的大数处理过程中用到sort(a,a+n,cmp),我觉得对于有些自定义的排序规则自己还不是很熟悉,,感觉一些地方的写法对自己还是蛮有启发的
(1)如何做数组减法,
(2)如何避免0在最高位输出,
(3)及stract函数的用法
(4)这个题的算法也是在读代码的过程中才理解的,感觉很巧妙。。即排序函数的写法,这也是这个题的精髓之处。
(小结随感受写的,逻辑性较差)
参考代码链接
我的代码(其实非常像)
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
struct Node
{
char s[20];
}q[1010];
int cmp(Node a,Node b)
{
int lena=strlen(a.s);
int lenb=strlen(b.s);
int maxn=max(lena,lenb);
for(int i=0;i<maxn;i++)
{
if(a.s[i%lena]<b.s[i%lenb])
return 1;
else if(a.s[i%lena]>b.s[i%lenb])
return 0;
}
return 1;
}
int main()
{
int t,n,len,i,j;
int a1[20010],a2[20010];
char str[20010];
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s",q[i].s);
}
sort(q,q+n,cmp);
// for(int i=0;i<n;i++)
// printf("%s",q[i].s);
// printf("\n");
memset(str,0,sizeof(str));
for(i=0;i<n;i++)
{
strcat(str,q[i].s);
}
len=strlen(str);
for(j=0,i=0;i<len;i++)
a1[j++]=str[i]-'0';
// for(int i=0;i<len;i++)
// printf("%d",a1[i]);
// printf("\n");
memset(str,0,sizeof(str));
for(i=n-1;i>=0;i--)
strcat(str,q[i].s);
for(j=0,i=0;i<len;i++)
a2[j++]=str[i]-'0';
// for(int i=0;i<len;i++)
// printf("%d",a2[i]);
// printf("\n");
for(i=len-1;i>=0;i--)
{
a2[i]=a2[i]-a1[i];
if(a2[i]<0)
{
a2[i]+=10;
a2[i-1]-=1;
}
}
// for(int i=0;i<len;i++)
// printf("%d",a2[i]);
// printf("\n");
int k;
for(k=0;k<len;k++)
if(a2[k])break;
if(k==len)
printf("0");
for(;k<len;k++)
printf("%d",a2[k]);
printf("\n");
}
return 0;
}