解题思路:
:用全排列方法求出n=2,3...10的所有装法

2018-02-02 10-15-11屏幕截图.png
:根据图得到以下规律:

(1)sum4=(sum2+sum3)*(4-1)

(2)sum5=(sum3+sum4)*(5-1)

(3)sum6=(sum4+sum5)*(6-1)

(4)sum7=(sum5+sum6)*(7-1)

....................


:归纳总结得到:n个人信封装法数=(n-2个人的信封装法数+n-1个人的信封装法数 ) x  (n-1)


注意事项:
结果不能用整型变量存储,n超过11长度不够;

参考代码:

#include<stdio.h>

int main()
{

   int n,s=3;
   double T,x=1,y=2;

   while(scanf("%d",&n)!=EOF)
     {   
       x=1,y=2,s=3;   //x代表sum1,y代表sum2,s代表n-1
        if(n==2)
         printf("%.0lf\n",x);
           else
           if(n==3)
             printf("%.0lf\n",y);
             else
               {
                  for(int i=0;i<n-3;i++)  //根据规律循环次数为n-3,
                   {                    //也可以用while循环
                      T=(x+y)*(s++);  //等于下面注释部分
                      //T=(x+y)*s;
                      //s++;
                      x=y;
                      y=T;
                   }
                 printf("%.0lf\n",T);
               }

     }
     return 0;
}

全排列法:(不可提交)

#include<stdio.h>
#include<malloc.h>
void format(int *A,int N);
void pailie(int *A,int index,int length);
void swap(int *x,int *y);
void panduan(int *A,int N);
int sum=0;
int main()
{

 int N;
 int *A;
 while( scanf("%d",&N)!=EOF)
 {
    sum=0;
    A=(int *)malloc(N*sizeof(int));
    format(A,N);
    pailie(A,0,N);
    printf("sum%d=%d\n",N,sum);
 }
return 0;
}

/*===================================================*/
void format(int *A,int N)
{

   for(int i=0;i<N;i++)
      A[i]=i;
  return;
}
/*===================================================*/
void pailie(int *A,int index,int length)
{

   int i=0,j=0;

   if(index==length)
    {
      panduan(A,length);
    }
    else
     for(j = index;j < length; j++)
        {
            swap(&A[j],&A[index]);
            pailie(A,index+1,length);
            swap(&A[j],&A[index]);
        }
return ;
}

/*===================================================*/
void swap(int *x,int *y)
{
  int z=(*x);
  (*x)=(*y);
  (*y)=z;
return ;
}
/*===================================================*/
void panduan(int *A,int N)
{
  int i;
  for( i=0;i<N;i++)
     {
       if(A[i]==i)
        break;
     }
   if(i==N)
    sum++;
}

别忘点赞哦-.-

点赞(18)
 

0.0分

3 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 3 条评论

MySoul 3年前 回复TA
@heifeng 是void,作用是结束该函数,返回到调用该函数的位置,继续运行
foxnull2 4年前 回复TA
#include <stdio.h>

int main(void)
{
	int n = 0;
	while (1) {
		if (EOF == scanf("%d", &n))break;
		printf("%d\n", n-1);
	}
	return (0);
}这样也行,这是个坑
heifeng 5年前 回复TA
在函数viod末写return;有什么作用吗?