swap(&a,&b)写为:
swap(&b,&a)也是对的。
8.代码填空
给定一个串,例如“aabbbcddddkkkmmmmaakkkk”咱们希望去掉持续的重复字母,得出串:
“abcdkmak”,下面代码实现了该功能,请完善之。
char*p="aabbbcddddkkkmmmmaakkkk";
charbuf[100];
char*q=p;
inti=0;
for(;*q;)
{
if(___________||*q!
=*(q-1))
{
buf[i++]=*q;
}
q++;
}
buf[i]='\0';
printf("%s\n",buf);
参考答案:
q==p
注意:
p==q也是正确的
9.代码填空
口袋中有5只红球,4只白球。
随机从口袋中掏出3个球,那么掏出1个红球2个白球的概率是多大?
类似如此的数学问题,在计算的时候往往十分复杂。
但如果是通过运算机模拟那个进程,比如进行100000次取球模拟,统计一下指定情形显现的次数对运算机来讲是方便且快速的。
一样,那个原理也适用于像天气预报如此复杂的系统进程。
以下的程序确实是用于解决取球概率问题的。
认真阅读代码,补全空白的部份。
srand((unsigned)time(NULL));
intn=0;
for(inti=0;i<100000;i++)
{
charx[]={1,1,1,1,1,2,2,2,2};
inta=0;//取到的红球的数量
intb=0;//取到的白球的数量
for(intj=0;j<3;j++)
{
intk=rand()%(9-j);
if(x[k]==1)
a++;
else
b++;
_______________________;
}
if(a==1&&b==2)n++;
}
printf("概率=%f\n",n/100000.0*100);
答案:
x[k]=x[9-j-1]
固然,9-1-j9-(j+1)9-(1+j)都是可能的写法。
10.代码填空
以下代码把一个二进制的串转换为整数。
请填写缺少的语句;
intn=0;
for(inti=0;i{
n=__________________;
}
printf("%d\n",n);
参考答案:
n*2+(p[i]-'0')
注意:
加法减法的顺序能够灵活,乘法能够互换,也能够n+n;
p[i]能够写为*(p+i)
'0'能够写为48
11.代码填空
数列:
Sn=1+1/2+1/3+…1/n被称为调和数列,它“恰好”是不收敛的。
那个数列和增加的速度是惊人缓慢的。
以下代码求出n至少为多大,才能保证Sn>m。
试完善之。
doublem=20;
doublex=1;
inti=2;
while(x{
x+=______________;
}
printf("%d",i);
参考答案:
1.0/i++
注意:
1.0错写为1那么扣除3分
1.0写为1d或1f或(double)1或(float)1都能够算正确
12.代码填空
仍一枚硬币,正面和反面向上的概率都是0.5,但多次仍硬币,总会显现持续多次同一面的情形。
咱们把每次的实验结果记录下来,形成一个串(0,1别离代表正面、反面向上)。
下面的程序统计出0或1最大持续显现的次数。
试完善之。
intlen=strlen(p);
intmax_k=1;
intk=1;
for(inti=1;i{
if(p[i]==p[i-1])
k++;
else
{
_________________________;
k=1;
}
}
printf("%d\n",max_k);
参考答案:
if(k>max_k)max_k=k
if(max_k13.代码填空
形如:
“abccba”,“abcba”的串称为回文串,以下代码判定一个串是不是为回文串。
请补充空白的部份。
charbuf[]="abcde11edcba";
intx=1;
for(inti=0;iif(___________________)
{
x=0;
break;
}
printf("%s\n",x?
"是":
"否");
参考答案:
buf[i]!
=buf[strlen(buf)-1-i]
注意:
!
=前后互换能够。
减法互换能够
buf[i]等价于*(buf+i)
A!
=B等价于!
(A==B)
14.代码填空
计算3个A,2个B能够组成多少种排列的问题(如:
AAABB,AABBA)是《组合数学》的研究领域。
但有些情形下,也能够利用运算机计算速度快的特点通过巧妙的推理来解决问题。
以下的程序计算了m个A,n个B能够组合成多少个不同排列的问题。
请完善它。
intf(intm,intn)
{
if(m==0||n==0)return1;
return_______________________;
}
答案:
f(m-1,n)+f(m,n-1)
固然,加法互换是能够的
15.代码填空
因数分解是十分大体的数学运算,应用普遍。
下面的程序对整数n(n>1)进行因数分解。
比如,n=60,那么输出:
2235。
请补充缺失的部份。
voidf(intn)
{
for(inti=2;i{
____________________
{
printf("%d",i);
n=n/i;
}
}
if(n>1)printf("%d\n",n);
}
参考答案:
while(n%i==0)
注意:
for(;n%i==0;)逻辑上也是正确的,但中间显现分号,与说明相违。
16.代码填空
以下代码实现把一个串“轮换”拷贝。
既是:
把"abcdef"拷贝为:
"bcdefa"。
请补充缺少的语句。
char*p="abcdef";
char*q=(char*)malloc(strlen(p)+1);
for(inti=0,intlen=strlen(p);iq[i]=p[i+1];
q[len-1]=p[0];
_____________________;
printf("%s\n",q);
参考答案:
q[len]='\0'
注意:
q[len]=0也是对的。
固然:
q[len]写为:
q[strlen(p)]也对
17.代码填空
穷举法是运算机解决某些问题的重要手腕。
为了估算可能性的数量,常常需要计算组合或排列的数量,下面的代码输出从m个物体中任掏出n个物体的不同方案的数量(此处假设:
m,n>1且m>=n)。
试完善之。
intf(intm,intn)
{
inta=1;
intm1=m;
______________
a*=m1--;
intb=1;
while(n>1)
b*=n--;
returna/b;
}
参考答案:
while(m1>m-n)
固然,while(m1>=m-n+1)也是对的。
18.代码填空
任意给定一个4位数(不能所有位都相同),比如:
3278,从头组合出最大数:
8723,再从头组合出最小数:
2378,相减,取得新的4位数(如不足那么补0),重复那个进程,最后必然取得一个数字:
6174。
那个现象被称为:
数字黑洞。
下面的函数实现由给定的4位整数求出下一个整数的功能。
请完善之。
intf(intn)
{
intN[4];
for(inti=0;i<4;i++)
{
N[3-i]=n%10;
___________________;
}
for(i=0;i<3;i++)
for(intj=0;j<3-i;j++)
if(N[j]>N[j+1])
{
intt=N[j+1];
N[j+1]=N[j];
N[j]=t;
}
intn_min=0;
for(i=0;i<4;i++)
n_min=n_min*10+N[i];
intn_max=0;
for(i=3;i>=0;i--)
n_max=n_max*10+N[i];
returnn_max-n_min;
}
参考答案:
n=n/10
注意:
也能够写成n/=10
19.代码填空
公交车票价为5角。
假设每位乘客只持有两种币值的货币:
5角、1元。
再假设持有5角的乘客有m人,持有1元的乘客有n人。
由于特殊情形,开始的时候,售票员没有零钱可找。
咱们想明白这m+n名乘客以什么样的顺序购票那么能够顺利完成购票进程。
显然,m=n的时候,有些情形也不行。
比如,第一个购票的乘客就持有1元。
下面的程序计算出这m+n名乘客所有可能顺利完成购票的不同情形的组合数量。
注意:
只关切5角和1元交替显现的顺序的不同排列,持有一样币值的两名乘客互换位置并非算做一种新的情形来计数。
//m:
持有5角币的人数
//n:
持有1元币的人数
//返回:
所有顺利完成购票进程的购票顺序的种类数
intf(intm,intn)
{
if(mif(n==0)return1;
return_______________________;
}
答案:
f(m-1,n)+f(m,n-1)
加法互换后也正确