1.1. 代码填空(满分3分)
假设a,b,c是3个互不相等的整数。下列代码取出它们中居中的数值,记录在m中。其中的swap()函数可以交换两个变量的值。请完善代码。
if(a>b) swap(&a, &b);
if(b>c) swap(&b, &c);
if(a>b) swap(&a, &b);
int m = b;
因为经过第二次交换后b的值不一定大于a了
1.2. 代码填空(满分5分)
计算3个A,2个B可以组成多少种排列的问题(如:AAABB, AABBA)是《组合数学》的研究领域。但有些情况下,也可以利用计算机计算速度快的特点通过巧妙的推理来解决问题。下列的程序计算了m个A,n个B可以组合成多少个不同排列的问题。请完善它。
int f(int m, int n)
{
if(m==0 || n==0) return 1;
return f(n-1,m) + f(n,m-1);
}
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cmath>
using namespace std;
/*
递推求解
(m+n)!/(m!n!) = (m+n)(m+n-1)(m+n-2)!/(m-1)!/(n-1)!
*/
int f(int m, int n)
{
/*
需要把 f(m-1,n-1)提到前面相乘,不能 ((m+n)*(m+n-1))/(m*n)*f(m-1,n-1),
因为可能前面的除不尽,或者把mn改为double,或者按下面的这样
*/
if(m==0 || n==0) return 1;
return ((m+n)*(m+n-1)*f(m-1,n-1))/(m*n);
}
int main()
{
int i,j,k;
cout<<f(2,7)<<endl;
while(1);
return 0;
}
1.3. 代码填空(满分6分)
此段代码的意图是把一个缓冲区中的整数重新排列,使得所有负数都在正数的左边。请分析其工作流程,补充缺失的代码。
void reorder(int *pData, int len)
{
if(pData == NULL || len == 0) return;
int *pBegin = pData;
int *pEnd =pData+len-1;
while(pBegin < pEnd)
{
if(*pBegin<0)
{
pBegin ++;
if(pEnd<=pBegin) break;
}
if(*pEnd>=0)
{
pEnd --;
if(pEnd<=pBegin) break;
}
int temp = *pBegin;
*pBegin = *pEnd;
*pEnd = temp;
}
}
int main(int argc, char **argv)
{
int a[] = {1,2,3,-5,-4,5,9,-8,-1};
reorder(a, 9);
for(int i=0; i<9; i++) printf("%d ", a[i]);
printf("\n");
return 0;
}
1.4. 代码填空(满分9分)
给定一个字符串,其含有的字符各不相同。程序输出该字符串的所有排列(全排列)情形。例如:给定字符串“xyz”,则程序输出:
xyz
xzy
yxz
yzx
zyx
zxy
试完善程序中空缺的部分。
void f(char *str, int len, int n)
{
int i;
char tmp;
char *p = (char *)malloc(len+1);
if(n==len-1){
printf("%s\n",str);
}else{
for(i=n;i<len;i++){
strcpy(p,str);
tmp = *(str+n);
*(str+n) = *(str+i);
*(str+i) = tmp;
f(str,len,n+1);
strcpy(str,p);
}
}
free(p);
}
int main(int argc, char **argv)
{
char str[] = "xyz";
f(str,3,0);
printf("\n");
return 0;
}
2011 模拟 c语言 高职
1.5. 程序设计(满分 20 分)
任意一个5位数,比如:34256,把它的各位数字打乱,重新排列,可以得到一个最大的数:65432,一个最小的数23456。求这两个数字的差,得:41976,把这个数字再次重复上述过程(如果不足5位,则前边补0)。如此往复,数字会落入某个循环圈(称为数字黑洞)。
比如,刚才的数字会落入:[82962, 75933, 63954, 61974] 这个循环圈。
请编写程序,找到5位数所有可能的循环圈,并输出,每个循环圈占1行。其中5位数全都相同则循环圈为 [0],这个可以不考虑。循环圈的输出格式仿照:
[82962, 75933, 63954, 61974]
其中数字的先后顺序可以不考虑。
解:这道题很不理解题意