2010-11-13 00:04:24
题目地址:http://acm.fzu.edu.cn/problem.php?pid=1571
通过这道题学会了使用 __int64,不过还是有一些不理解的
AC不了的代码:
#include<stdio.h>
int factorial(int n)
{
if(n==1) return 1;
else return(factorial(n-1)*n);
}
int bubble(int *p,int n)
{
int *p1,*p2,temp;
for(p1=p;p1<p+n;p1++)
for(p2=p+n-1;p2>p1;p2--)
if(*p2<*(p2-1)) { temp=*p2; *p2=*p1 ; *p1 =temp;}
return 0;
}
int main()
{
int i,j,k , n ,a[13],temp;
__int64 sum;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++) scanf("%d",&a[i]);
sum=0;
for(i=0;i<n-1;i++)
{
k=a[i]-1;
for(j=0;j<i;j++)
if(a[i]>a[j]) k--;
sum+=k*factorial(n-i-1);
}
for(i=n-1;i>0;i--)
if(a[i]>a[i-1]) break;
temp=a[i-1]; a[i-1]=a[n-1]; a[n-1]=temp;
bubble(&a[i],n-i);
printf("%d/n",sum);
for(i=0;i<n;i++)
{
if(i!=0) printf(" ");
printf("%d",a[i]);
}
printf("/n");
}
return 0;
}
有三处错误,一个是本应该是*(p2-1),写成了*p1;
第二个是把k, 设置成int型,得不到正确答案,只能得设置成__int64型
第三个是考虑不当,并没有正确找到应该对换的两个数
AC代码:
#include<stdio.h>
__int64 factorial(__int64 n)
{
if(n==1) return 1;
else return(factorial(n-1)*n);
}
int bubble(int *p,int n)
{
int *p1,*p2,temp;
for(p1=p;p1<p+n;p1++)
for(p2=p+n-1;p2>p1;p2--)
if(*p2<*(p2-1)) { temp=*p2; *p2=*(p2-1) ; *(p2-1)=temp;}
return 0;
}
int main()
{
int i,j,n,a[13],temp;
__int64 k,sum;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++) scanf("%d",&a[i]);
sum=0;
for(i=0;i<n-1;i++)
{
k=a[i]-1;
for(j=0;j<i;j++)
if(a[i]>a[j]) k--;
sum+=k*factorial(n-i-1);
}
for(i=n-1;i>0;i--)
if(a[i]>a[i-1]) break;
for(j=n-1;j>i-1;j--)
if(a[j]>a[i-1]) break;
temp=a[j];a[j]=a[i-1];a[i-1]=temp;
bubble(&a[i],n-i);
printf("%I64d/n",sum);
for(i=0;i<n;i++)
{
if(i!=0) printf(" ");
printf("%d",a[i]);
}
printf("/n");
}
return 0;
}