4-1 A - 计算组合数
#include <stdio.h>
int f(int n,int m)
{
int y;
if(m==0) y=1;
else if(n==1) y=1;
else if(m==n) y=1;
else y=f(n-1,m-1)+f(n-1,m);
return y;
}
int main()
{
int t,n,m,y;
scanf("%d",&t);
while(t>0)
{
scanf("%d %d",&n,&m);
y=f(n,m);
printf("%d\n",y);
t--;
}
return 0;
}//递归就是写函数,差不多意思
4-2 B - 神奇的函数
#include <stdio.h>
int f(int n,int m)
{
int y;
if(m==1||n==1) y=1;
else y=f(n-1,m)+f(n,m-1);
return y;
}
int main()
{
int t,n,m,y;
scanf("%d",&t);
while(t>0)
{
scanf("%d %d",&n,&m);
y=f(n,m);
printf("%d\n",y);
t--;
}
return 0;
}
4-3 C - 喵帕斯之天才算数少女
#include <stdio.h>
int f(int m,int n)
{
int y;
if(m==0) y=n+1;
if(m>0&&n==0) y=f(m-1,1);
if(m>0&&n>0) y=f(m-1,f(m,n-1));
return y;
}
int main()
{
int t,n,m,y;
scanf("%d",&t);
while(t>0)
{
scanf("%d %d",&m,&n);
printf("%d\n",f(m,n));
t--;
}
return 0;
}
4-4 D - 汉诺塔
#include <stdio.h>
void moves(int n,char a,char b)
{
printf("Move disk %d from %c to %c\n",n,a, b);
}
void hanoi(int n,char o, char t, char d)
{
if(n==1)
moves(n,o,d);
else
{
hanoi(n-1,o,d,t);
moves(n,o,d);
hanoi(n-1,t,o,d);
}
}
int main()
{
int n;
scanf("%d",&n);
hanoi(n,'A','B','C');
return 0;
}//逻辑问题,想象一下就很好解决
4-5 E - 青蛙过河
#include <stdio.h>
int f(int s,int y)
{
if(s==0)
return y+1;
else
return 2*f(s-1,y);
}
int main()
{
int s,y,t,i;
scanf("%d",&t);
for(i=0; i<t; i++)
{
scanf("%d %d",&s,&y);
printf("%d\n",f(s,y));
}
return 0;
}
4-6 F - 数据结构实验之排序八:快速排序
#include<stdio.h>
void f(int a[],int left,int right)
{
int x=a[left],i=left,j=right;
if(i>=j) return;
while(i<j)
{
while(i<j&&a[j]>=x) j--;
a[i]=a[j];
while(i<j&&a[i]<=x) i++;
a[j]=a[i];//这边有个好记的方法,j--在前,i++在后,顺序不能变
}
a[i]=x;
f(a,left,i-1);
f(a,i+1,right);//上面的快排一次后,继续重新定义x重复快排
}//快速排序法
int main()
{
int n,a[100010],i;
while(~scanf("%d",&n))
{
for (i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
f(a,0,n-1);
for (i=0;i<n;i++)
{
if(i==n-1)
printf("%d\n",a[i]);
else
printf("%d ",a[i]);
}
}
return 0;
}
4-7 G - 第X大的数
#include <stdio.h>
void sqort(int a[],int l,int r)//顺序快排
{
int key=a[l];
int i=l,j=r;
if(l>=r)
return ;
while(i<j)
{
while(i<j&&a[j]<=key)j--;
a[i]=a[j];
while(i<j&&a[i]>=key)i++;
a[j]=a[i];
}
a[i]=key;
sqort(a,l,i-1);
sqort(a,i+1,r);
}
int main()
{
int n,i;
int a[100110];
int m,x;
while(~scanf("%d",&n))
{
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&m);
sqort(a,0,n-1);
for(i=0;i<m;i++)
{
scanf("%d",&x);
printf("%d\n",a[x-1]);
}//找数
}
return 0;
}
4-8 H - M--二分查找
#include <stdio.h>
int a[3000010];
int f(int a[],int l,int r,int x)
{
int m;
if(l<=r)
{
m=(l+r)/2;//取中间值为固定点
if(a[m]==x)
return m;
if(a[m]>x)
return f(a,l,m-1,x);
else
return f(a,m+1,r,x);
}//不断二分查找
return -1;
}
int main()
{
int n,i,x,q;
scanf("%d",&n);
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&q);
for(i=1; i<=q; i++)
{
scanf("%d",&x);
printf("%d\n",f(a,1,n,x));
}
return 0;
}
4-9 I - 第k小的数
#include <stdio.h>
int a[900110];
void sqort(int a[],int l,int r)
{
int key=a[l];
int i=l,j=r;
if(l>=r)
return ;
while(i<j)
{
while(i<j&&a[j]>=key)j--;
a[i]=a[j];
while(i<j&&a[i]<=key)i++;
a[j]=a[i];
}
a[i]=key;
sqort(a,l,i-1);
sqort(a,i+1,r);
}//还是快排
int main()
{
int n,k,i;
scanf("%d %d",&n,&k);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sqort(a,0,n-1);
printf("%d",a[k-1]);
return 0;
}
4-10 J - 全排列问题
#include <stdio.h>
void swap(int *q,int *p)
{
int t;
t = *q;
*q = *p;
*p = t;
}
void circular_right(int a[],int left,int right)
{
int tmp,i;
if(left>=right)
return;
tmp=a[right];
for(i=right;i>left;i--)
a[i]=a[i-1];
a[left]=tmp;
}
void circular_left(int a[],int left,int right)
{
int tmp,i;
if(left>=right)
return;
tmp=a[left];
for(i=left;i<right;i++)
a[i]=a[i+1];
a[right]=tmp;
}
void f(int a[],int k,int m)
{
int i;
if(k==m)
{
for(i=0; i<=m; i++)
{
if(i==0)
printf("%d",a[i]);
else printf(",%d",a[i]);
}
printf("\n");
}
else
{
for(i=k; i<=m; i++)
{
swap(&a[k],&a[i]);
circular_right(a,k+1,i);
f(a,k+1,m);
circular_left(a,k+1,i);
swap(&a[k],&a[i]);
}
}
}
int main ()
{
int array[11],i,t,n;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%d",&array[i]);
}
f(array,0,n-1);
return 0;
}
加油加油加油!!!