水题使我快乐_(:зゝ∠)_
半个暑假过去了,是时候刷点水题恢复一下了,哈哈哈。
题目地址
总结:1~9,12~13水题;10大数乘法,11希尔排序或归并排序等(除快速排序)
6-1
void PrintN(int N)
{
int x=1;
while(x<=N)
printf("%d\n",x++);
}
6-2
double f( int n, double a[], double x )
{
double ans = 0.0;
int z = 0;
double y = 1.0;
for(;z<=n;z++,y*=x)
ans += a[z]*y;
return ans;
}
6-3
int Sum ( int List[], int N )
{
int x=0;
int sum=0;
while(x<N)
sum+=List[x++];
return sum;
}
6-4
ElementType Average( ElementType S[], int N )
{
ElementType sum = 0;
int x=N;
while(N)
sum+=S[--N];
return sum/x;
}
6-5
ElementType Max( ElementType S[], int N )
{
ElementType M=S[N-1];
#define Max(a,b) (a>b?a:b)
while(N--)
M=Max(S[N],M);
#undef Max(a,b)
return M;
}
6-6
int FactorialSum( List L )
{
int sum=0;
while(L!=NULL)
{
int x,y;
for(x=1,y=1;x<=L->Data;x++)
y*=x;
sum+=y;
L=L->Next;
}
return sum;
}
6-7
int IsTheNumber ( const int N )
{
#include<math.h>
double sq=sqrt(N);
if(sq-(int)sq)
return 0;
else
{
int num=N;
int dig[10]={0};
while(num)
{
int x=num%10;
num/=10;
dig[x]++;
if(dig[x]>1)
return 1;
}
}
return 0;
}
6-8
int Factorial( const int N )
{
if(!N)
return 1;
if(N<0)
return 0;
int x=N,y=N;
while(--y)
x*=y;
return x;
}
6-9
int Count_Digit ( const int N, const int D )
{
if(!N&&!D)
return 1;
int num = abs(N),cnt = 0;
while(num)
{
int x = num%10;
num/=10;
if(x==D)
cnt++;
}
return cnt;
}
特殊情况:N和D都是0的时候,输出应为1。
6-10
void Big_multiplication(int* a,int* b,int *result);
void Print_Factorial ( const int N )
{
if(!N||N==1)
{
printf("1\n");
return;
}
if(N<0)
{
printf("Invalid input\n");
return;
}
int num1[10]={1,1};
int num2[3000]={1,2};
int mul[3000];
Big_multiplication(num1,num2,mul);
int i;
for(i=3;i<=N;i++)
{
int x=i,y=1,j;
while(x)
{
num1[y]=x%10;
x/=10;
y++;
}
num1[0]=y-1;
for(j=0;j<=mul[0];j++)
num2[j]=mul[j];
Big_multiplication(num1,num2,mul);
}
for(i=mul[0];i>=1;i--)
printf("%d",mul[i]);
printf("\n");
return;
}
void Big_multiplication(int* a,int* b,int *result)
{
for(int i=0;i<3000;i++)
result[i]=0;
int i=1;
while(i<=b[0])
{
int j=1;
while(j<=a[0])
{
result[i+j-1]+=a[j]*b[i];
j++;
}
i++;
}
i=1;
while(result[i]||i<=b[0]+a[0]-1)
{
result[i+1]+=result[i]/10;
result[i]=result[i]%10;
i++;
}
result[0]=i-1;
}
这是个大数乘法题,1000的阶乘位数达到两千多位,必须用数组存储结果。
这里用的是模拟乘法运算的方法,数组【0】存放此数组数的总位数,先不管是否进位,计算出结果每一位,最后从最低位往高位逐位进位处理。
注意特殊情况:负数时输出Invalid input,0时输出1。
6-11
这道题用冒泡、选择和插入排序都是不行的,最后一个测试点时间超限。于是测试了快速排序、希尔排序和归并排序。
期望很高的快速排序竟然也超时了,然而希尔排序和归并排序都成功通过测试。我想最后一个测试点应该卡的就是快速排序的最坏情况。
ElementType Median( ElementType A[], int N )
{
int i,j,x;
ElementType temp;
for(x=N/2;x>0;x/=2)
{
for(i=x;i<N;i++)
{
temp=A[i];
for(j=i;j>=x;j-=x)
if(temp<A[j-x])
A[j]=A[j-x];
else
break;
A[j]=temp;
}
}
return A[N/2];
}
采用希尔排序,最后一个测试点能通过(36ms左右)。
#include<stdlib.h>
void merge(ElementType A[],ElementType temp[],int lops,int rops,int rightend)
{
int i,leftend,sum,tempos;
leftend=rops-1;
tempos=lops;
sum=rightend-lops+1;
while(lops<=leftend&&rops<=rightend)
if(A[lops]<=A[rops])
temp[tempos++]=A[lops++];
else
temp[tempos++]=A[rops++];
while(lops<=leftend)
temp[tempos++]=A[lops++];
while(rops<=rightend)
temp[tempos++]=A[rops++];
for(i=0;i<sum;i++,rightend--)
A[rightend]=temp[rightend];
}
void mersort(ElementType A[],ElementType temp[],int left,int right)
{
if(left<right)
{
int x=(left+right)/2;
mersort(A,temp,left,x);
mersort(A,temp,x+1,right);
merge(A,temp,left,x+1,right);
}
}
ElementType Median( ElementType A[], int N )
{
ElementType* temp;
temp=(ElementType*)malloc(N*sizeof(ElementType));
mersort(A,temp,0,N-1);
free(temp);
return A[N/2];
}
采用归并排序,最后一个测试点能通过(39ms左右)。
6-12
int even( int n )
{
if(n%2)
return 0;
return 1;
}
6-13
int Search_Bin(SSTable T, KeyType k)
{
int left,right;
left=1,right=T.length;
while(left<right)
{
KeyType x = T.R[(left+right)/2].key;
if(x==k)
return (left+right)/2;
if(x>k)
right=(left+right)/2-1;
else
left=(left+right)/2+1;
}
return 0;
}
简单的二分查找