第八:信封
有n封信,求出完全装错情形的所有方式及和总数。如,输入n=3,完全装错的方式共有2种,分别是312和231。

程序代码:
/* Note:Your choice is C IDE */
#include "stdio.h"
#include "math.h"
int num[30]={0};
int add(int i,int n)//对数组进行+1处理,达到最大数向前进1,同时当前位置0.
{
num[i]++;
if(i==0&&num[i]>n)
{
printf("数据出错");
return 0;
}
else if (num[i]>=n)//大于n表示要向前进一位
{
num[i]=0;
return add(i-1,n);
}
return 1;
}
int camp(int n)//对各位数进行比较处理
{
int i,ok;
if(num[n]==n)//n位上等于n,信正确反回错
{
return 0;
}
if(n==0)
return 1;
else
{
ok=camp(n-1);
if (!ok)
return 0;
}
for (i=n-1;i>=0;i--)
{
if(num[i]==num[n])//有相同数,反回错
{
return 0;
}
}
return 1;
}
int main()
{
int n=1,n2,i,j,ok,count=0,p;
printf("请输入信封数:");
scanf("%d",&n);
while(n<=1)
{
printf("请输入一个大于1的整数:");
scanf("%d",&n);
}
n2=pow(n,n);
for(i=0;i<n2;i++)
{
add(n-1,n);
// for(p=0;p<n;p++)
// printf("%d",num[p]);
// printf("\n");
ok=camp(n-1);
if(ok)
{
count++;
for(j=0;j<n;j++)
{
printf("%d",num[j]+1);
}
printf(" ");
if(count%10==0)
printf("\n");
}
}
printf("\n最大全错数为:%d\n",count);
return 1;
}