提高题:
1、编写程序,随机生成一个1~10内的数,让对方猜3次。如果3次内能猜中则输出“恭喜你”;若3次内猜不中则输出正确答案。
C语言中提供生成随机数的函数rand()
用法:
①所需头文件:
#include<math.h>
#include<time.h>
②生成随机数种子:
srand(time(0));
③生成某范围内的随机数。例如生成1~100内的随机数
int a = rand()%100+1;//将这个数取余100,会得到一个0~99之间的数,将这个数+1即可得到1~100之间的数

 #if 0
、编写程序,随机生成一个1~10内的数,让对方猜3次。如果3次内能猜中则输出“恭喜你”;若3次内猜不中则输出正确答案。
C语言中提供生成随机数的函数rand()
用法:
①所需头文件: ②生成随机数种子:
#include<math.h>
#include<time.h>
//sleep(1);
srand(time()); ③生成某范围内的随机数。例如生成1~100内的随机数
#include<stdlib.h>
int a = rand()%+;//将这个数取余100,会得到一个0~99之间的数,将这个数+1即可得到1~100之间的数 解题思路:
一。生成随机数
二。三次循环判断,每次循环进行判等, 错误分析:
第一个方法问题: 第二个方法问题: #include<stdlib.h>
#include<time.h>
#include<math.h>
头文件互相冲突不能共存; #endif #include<stdio.h>
//#include<stdlib.h>
#include<time.h>
#include<math.h> int main(){
/*
int a ;
int i=0;
while(i!=3){
a = srand(time(0))%10+1;
printf("!!!!!!!!!!%d\t",a);
i++;
} int a ;
while(a!=3){
a = rand()%10+1;
printf("%d\t",a);
}
*/ int a ;
a = srand(time())%+;
int i=;
for(i=;i<;i++){
int b;
printf("\n输入猜测值:");
scanf("%d",&b);
if(a==b){
printf("888恭喜你!");
return ;
}
} printf("%d是正确答案: ",a); return ;
}

2、在上一题基础上,编写一个彩票程序。
彩票程序在后台随机生成1~35内的7个各不相同的数字。用户会输入一组7个数字,中奖规则:
猜中
7个500万
6个100万
5个1万
4个5000
3个500
0,1,2个没中奖
输出是否中奖及奖金。

 #if 0
、在上一题基础上,编写一个彩票程序。
彩票程序在后台随机生成1~35内的7个各不相同的数字。用户会输入一组7个数字,中奖规则:
猜中
7个500万
6个100万
5个1万
4个5000
3个500
,,2个没中奖
输出是否中奖及奖金。 解题思路:
如何高效的生成随机数;
#endif #include<stdio.h>
int main(){ return ;
}

3、判断一个矩阵中是否存在鞍点,若存在输出鞍点。鞍点是这样一个数字:在该行最大,在该列最小。例如:
1 2 6 4
5 6 7 8
9 10 11 12
则数字6(a[0][2])是鞍点。一个矩阵可能没有鞍点,可能拥有不止一个鞍点。

 #if 0
、判断一个矩阵中是否存在鞍点,若存在输出鞍点。鞍点是这样一个数字:在该行最大,在该列最小。例如: 则数字6(a[][])是鞍点。一个矩阵可能没有鞍点,可能拥有不止一个鞍点。 解题思路:
一。 寻找每行的最大值
二。判断最大值是否为所在列的最小值 #endif #include<stdio.h> int main(){
typedef struct an{
int max;
int i;
int j;
}an; int a[][]={
{ , , , },
{ , , ,},
{ , , ,}
}; int hang=,lie=;
int i=;
an andian; //遍历所有行
for(i=;i<hang;i++){
andian.max=a[i][];
andian.i=i;
andian.j=; int j;
//寻找这行里最大值
for(j=;j<lie;j++){
if(andian.max==a[i][j]){
break;
}
if(andian.max<a[i][j]){
andian.max=a[i][j];
//andian.i=i;
andian.j=j; }
//遍历完行最后一位且行中没有相等 取得行最大值;
if(j==(lie-)){
//遍历行最大值所在列,判断是否为最小值
int ii,jj=(andian.j);
for(ii=;ii<hang;ii++){
if(ii==i)continue;
if(a[ii][jj]<andian.max){
break;
}
if(ii==hang-){
printf("鞍点=%d ,行=%d 列=%d\n",andian.max,andian.i+,andian.j+);
}
} } } } return ;
}

4、使用1、2、3、4四个数字能组成多少个无重复数字的三位数?输出这些三位数。

 #if 0
、使用1、、、4四个数字能组成多少个无重复数字的三位数?输出这些三位数。 思路分析:
达成遍历的效果。 错误分析:
大o算法=n^ ,比较高; #endif
#include<stdio.h> int main(){
int a[]={,,,};
int i,j,k,len=;
for(i=;i<len;i++){ for(j=;j<len;j++){
if(i==j)continue;
for(k=;k<len;k++){
if((i==k)||(j==k))continue;
printf("%d \t",(a[i]*+a[j])*+a[k]);
}
}
} return ;
}

5、输入一个日期(年、月、日),计算该日期是这一年的第几天。注意判断闰年。

 #if 0
、输入一个日期(年、月、日),计算该日期是这一年的第几天。注意判断闰年
解题思路:
一。建立一个数组存贮每个月的天数
二。判断是否为闰年,若月份大于2则天数加一。 错误分析:
没有输入数据合法性分析。
认为最好的方法是创建两个月的数组,一个存储闰年。
#endif #include<stdio.h>
int runnian(int year){ if((year%)==){
printf("%d是闰年\n",year);return ;
}else if((year%)==){
printf("%d不是闰年\n",year);return ;
}else if((year%)==){
printf("%d是闰年\n",year);return ;
}else{
printf("%d不是闰年\n",year);return ;
}
return ;
} int main(){
int yueping[]={,,,,,,,,,,,,};
int nian,yue,ri;
printf("输入年 月 日:");
scanf("%d %d %d",&nian,&yue,&ri);
if(runnian(nian)&&(yue>)){
ri++;
}
int sum=;
int i;
for(i=;i<yue;i++){
sum+=yueping[i];
}
sum+=ri;
printf("%d:%d:%d一共有:%d 天。",nian,yue,ri,sum); return ;
}

6、输出9*9乘法口诀表
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
……

 #if 0
、输出9*9乘法口诀表
*=
*= *=
*= *= *=
…… 思路分析:
*
*
*
*
* 利用一个双重循环产生上图数据
#endif #include<stdio.h> int main(){
int len=;
int i=;
for(i=;i<=len;i++){
int j=;
for(j=;j<=i;j++){
printf("%d*%d=%d\t",i,j,(i*j));
}
printf("\n"); } return ;
}

7、输入2个正整数,求它们的最大公约数和最小公倍数

 #if 0
、输入2个正整数,求它们的最大公约数和最小公倍数
解题思路:
最大公约数:
n--, 第一个取余为零的数
n++,第一个取余为零的数
#endif #include<stdio.h> int main(){ int a,b,mix,max,yueshu,beishu;
printf("输入两个数:\n");
scanf("%d %d",&a,&b);
mix=a<b?a:b;
max=a>b?a:b; int i=;
//求最大公约数
for(i=mix;i>;i--){
if((mix%i==)&&(max%i==)){
yueshu=i;
break;
}
}
//求公倍数
for(i=max;i<=max*mix;i++){
if((i%mix==)&&(i%max==)){
beishu=i;
break;
}
}
printf("%d,%d的公约数%d;公倍数%d",mix,max,yueshu,beishu); }

8、楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编程序计算n阶台阶共有多少种不同的走法

 #if 0
、楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编程序计算n阶台阶共有多少种不同的走法
解题思路:
一。全部是一阶
二。有一个二阶
三。有两个二阶
四。以此类推到二阶最多的情况。
五。对每种情况进行全排序 .....
..
将2插入1看有多少情况
2插到2旁边是一样的。 #endif
#include<stdio.h> int main(){
int taijie;
printf("输入台阶数:\n");
scanf("%d",&taijie);
int liangjie=,sum=; while((taijie-*liangjie)>=){
int yijie=taijie-*liangjie;
int zoufa=;
//i等于2阶的个数,代表插入几次;
int i=liangjie;
while(i){
zoufa*=(yijie+); i--;
} printf("有%d步为两阶,走法%d种\n",liangjie,zoufa); sum+=zoufa;
++liangjie;
} printf("\n总共有%d种\n",sum);
return ;
}

9、协助破案。假设已经查清,有A、B、C、D、E五个犯罪嫌疑人可能参与作案,但是不知道哪(几)个是真正的案犯。不过有证据表明:
⒈如果A参与了作案,则B一定也参与
⒉B和C两人中只有一人参与了作案
⒊C和D要么都参与作案,要么都没有参与
⒋D和E两个人中至少有一人参与了作案
⒌如果E作案,则A和D必定协助作案。
编程找出谁是真正的案犯(可能不止一人)

 #if 0
、协助破案。假设已经查清,有a、b、c、d、e五个犯罪嫌疑人可能参与作案,但是不知道哪(几)个是真正的案犯。不过有证据表明: ⒈如果a参与了作案,则b一定也参与
⒉b和c两人中只有一人参与了作案
⒊c和d要么都参与作案,要么都没有参与
⒋d和e两个人中至少有一人参与了作案
⒌如果e作案,则a和d必定协助作案。
编程找出谁是真正的案犯(可能不止一人) 解题思路:
设计五个变量abcde;
如果abcde全部被判定,赋值则跳出循环。 如果D=;可以实现对a到e的判断;则值出现一次循环未改变 跳出循环
否则e=;再次循环 错误分析:
应该是我输入一个猜测,然后输出此猜测的结果。
根据题意有两种可能。
#endif #include<stdio.h> int main(){
int a=,b=,c=,d=,e=;
//判断有没有语句执行
int aa,bb,cc,dd,ee;
//假设d=1;看是不是能判断所有人,若果i=0时还不能判断所有人。在循环中改成c=1
d=;
while(a==||b==||c==||d==||e==){
aa=a;bb=b;cc=c;dd=d;ee=e;
//⒈如果a参与了作案,则b一定也参与
if(a==){
b=; }
//⒉b和c两人中只有一人参与了作案
if(b==){
c=; }else {
c=;
}
if(c==){
b=;
}else{
b=;
} //⒊c和d要么都参与作案,要么都没有参与
if(c==){
d=; }else if(d==){
c=; }
//⒌如果e作案,则a和d必定协助作案。
if(e==){
a=;
d=; }
printf("a=%d,b=%d,c=%d,d=%d,e=%d\n",a,b,c,d,e); //⒋d和e两个人中至少有一人参与了作案
if(a==aa && b==bb && c==cc && d==dd&& e==ee){
a=;b=;c=;d=;e=;
} }
printf("最终结果a=%d,b=%d,c=%d,d=%d,e=%d\n\n\n",a,b,c,d,e);
if(a==){
printf("a是罪犯\n");
}else{
printf("a不是罪犯\n");
}
if(b==){
printf("b是罪犯\n");
}else{
printf("b不是罪犯\n");
}
if(c==){
printf("c是罪犯\n");
}else{
printf("c不是罪犯\n");
}
if(d==){
printf("d是罪犯\n");
}else{
printf("d不是罪犯\n");
}
if(e==){
printf("e是罪犯\n");
}else{
printf("e不是罪犯\n");
} return ;
}

10、给定一个5位数,判断这个数字是否是回文数。例如12321是回文数,而12345就不是回文数。

 #if 0
、给定一个5位数,判断这个数字是否是回文数。例如12321是回文数,而12345就不是回文数。
解题思路:
因为是给定的五位数
可以将第一位和第五位比,第二位和第四位比。
#endif #include<stdio.h> int huiwen(int num){
if((num/)!=(num%)){
return ;
}
if((num/%)!=(num%/)){
return ;
}
return ;
} int main(){
printf("请输入一个五位数");
int num;
scanf("%d",&num);
int i=huiwen(num);
if(i){
printf("%d是回文数",num);
}else{
printf("%d不是回文数",num);
} return ;
}

11、自定义一个5*5矩阵,将这个矩阵转置。

 #if 0
、自定义一个5*5矩阵,将这个矩阵转置。
一。定义一个5* 的矩阵A;
二。新建一个5* 的矩阵B;
B[i][j]=a[j][i]; #endif #include<stdio.h> void my_scanf(int *a,int x,int y){
int i=,j=;
for(i=;i<x;i++){
//j不应该从零开始
for(j=;j<y;j++){
printf("请输入第 %d行%d 列的值:\n",i+,j+);
scanf("%d",&a[(i*(x+)+j)]); } } for(i=;i<x;i++){
for(j=;j<y;j++){
printf("a[%d][%d]=%d\t",i+,j+,a[(i*(x+)+j)]);
//printf("%d\n",(i*(x+1)+j)); } }
//printf(""\n\n\n); }
void zhuanzhi(int *b,int x,int y,int *a ){
int i=,j=;
for(i=;i<x;i++){
//j不应该从零开始
for(j=;j<y;j++){
//printf("请输入第 %d行%d 列的值:\n",i+1,j+1);
//scanf("%d",&a[(i*(x+1)+j)]);
b[(i*(x+)+j)]=a[(j*(x+)+i)];
} }
for(i=;i<x;i++){
for(j=;j<y;j++){
printf("b[%d][%d]=%d\t",i+,j+,b[(i*(x+)+j)]);
//printf("%d\n",(i*(x+1)+j)); } }
} int main(){
printf("创建矩阵A;\n");
int a[][]={};
my_scanf(a,,);
printf("创建转置矩阵B: \n");
int b[][]={};
zhuanzhi(b,,,a); return ;
}

12、约瑟夫环问题:
约瑟夫入狱,监狱内共有33个犯人。某日33名犯人围成一圈,从第一个犯人开始报数,报到数字7的犯人出列,被枪毙,下一名犯人重新从1开始报数。依次类推,直至剩下最后1名犯人可被赦免。聪明的约瑟夫在心里稍加计算,算出了最后枪毙的位置,他站在这个位置,最终避免了自己被枪毙,逃出升天。
问:约瑟夫算出的是哪个位置?

13、假设你收到了一行使用凯撒密码加密过的单词但不知道秘钥(偏移字母数),请破译这段密文。
密文:PELCGBTENCUL
提示:凯撒密码加密是一种字母替换加密算法,其加密原则是:将26个字母连接成环,明文的所有字母被后n位的字母替换得到密文。例如当n=3的时候替换规则是:
A--->D
B--->E
C--->F
……
X--->A
Y--->B
Z--->C
明文HELLO----->密文KHOOR

 #if 0
、假设你收到了一行使用凯撒密码加密过的单词但不知道秘钥(偏移字母数),请破译这段密文。
密文:PELCGBTENCUL
提示:凯撒密码加密是一种字母替换加密算法,其加密原则是:将26个字母连接成环,明文的所有字母被后n位的字母替换得到密文。例如当n=3的时候替换规则是:
A--->D
B--->E
C--->F
……
X--->A
Y--->B
Z--->C
明文HELLO----->密文KHOOR 解题思路:
一。输入一段密码和原文判断秘钥
二。根据秘钥解码密文 #endif #include<stdio.h>
#define len 20 void jiemi(char *kaisa,char *kaisayuanwen,int miyao){ while(*kaisa!='\0'){
*kaisayuanwen=*kaisa+miyao; *kaisa++;
*kaisayuanwen++;
}
*kaisayuanwen='\0'; }
int main(){
char mingwen[len],miwen[len],kaisa[len],kaisayuanwen[len];
printf("输入明文:\n");
scanf("%s",mingwen); printf("输入密文:\n");
scanf("%s",miwen); int miyao=mingwen[]-miwen[]; printf("输入凯撒密文\n");
scanf("%s",kaisa); jiemi(kaisa,kaisayuanwen,miyao);
printf("输入凯撒原文\n"); printf("%s\n",kaisayuanwen); return ;
}

14、棋子移动问题
有2n(n>=4)个棋子排成一行,其中黑棋B有n个,白棋W有n个,并留有两个空格。例如,当n=4时排列如下所示:(W为白棋,B为黑棋,0为空格)
W W W W B B B B 0 0
当n=5时排列如下所示:(W为白棋,B为黑棋,0为空格)
W W W W W B B B B B 0 0
现在需要移动棋子,移动规则如下:
⒈每次必须同时移动相邻的两个棋子
⒉每次移动必须跳过若干棋子
⒊不能随意调换任意两个棋子的位置
目标:将所有的棋子移动为黑白棋相间的形式,中间不能有空格。
例如:当n=4时移动步骤如下:
起始: W W W W B B B B 0 0
第一步:W W W 0 0 B B B W B
第二步:W W W B W B B 0 0 B
第三步:W 0 0 B W B B W W B
第四步:W B W B W B 0 0 W B
第五步:0 0 W B W B W B W B(完成)
编程实现:从键盘输入n(n>=4),求每一步的棋子移动

15、以下是对“快速排序算法”的算法描述,请读懂这段文字,编写出快速排序算法函数QSort。
提示:函数的原型是:void QSort(int A[], int left, int right)
快速排序由C. A. R. Hoare在1962年提出,是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
快速排序算法的文字描述是:
1)设置两个变量i、j,排序开始的时候:i=0,j=N-1;
2)以第一个数组元素作为关键数据,赋值给key,即key=A[0];
3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]和A[i]互换;
4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;
5)重复第3、4步,直到i=j;此时令循环结束。将key值赋值到i(或j)的位置。
6)递归操作数组A[]在key值左的左半部分。
7)递归操作数组A[]在key值右的右半部分。

C基础的练习集及测试答案(提高题)的更多相关文章

  1. C基础的练习集及测试答案(1-15)

    练习题:注:标有(课堂)字样的为课上练习,其他为课下练习基础题(50题)1.(课堂)编写程序,输出“XXX欢迎来到动物园!”(XXX是自己的名字). //1.(课堂)编写程序,输出“XXX欢迎来到动物 ...

  2. C基础的练习集及测试答案(40-50)

    40.(课堂)打印杨辉三角型前10行 #if 0 40.(课堂)打印杨辉三角型前10行 思路分析: 一.打印十行杨辉三角得第十行长度为十,所以建立一个长度为十的数组,作为每行的数据存储 二.按 0-9 ...

  3. C基础的练习集及测试答案(31-39)

    31.读懂以下程序,说明程序的功能#include<stdio.h>int main(){ int m,n,r,m1,m2; printf("请输入2个正整数:"); ...

  4. C基础的练习集及测试答案(16-30)

    16.(课堂)输入一个年份(正整数),判断这年是否是闰年.闰年判断标准:年份能被4整除:如若遇到100的倍数,则需判断年份能否被400整除.(逢4一闰,逢百不闰,逢400又闰) #if 0 .(课堂) ...

  5. ML基础 : 训练集,验证集,测试集关系及划分 Relation and Devision among training set, validation set and testing set

    首先三个概念存在于 有监督学习的范畴 Training set: A set of examples used for learning, which is to fit the parameters ...

  6. Python sklearn拆分训练集、测试集及预测导出评分 决策树

    机器学习入门 (注:无基础可快速入门,想提高准确率还得多下功夫,文中各名词不做过多解释) Python语言.pandas包.sklearn包   建议在Jupyter环境操作 操作步骤 1.panda ...

  7. zookeeper部署及集群测试

    zookeeper部署及集群测试 环境 三台测试机 操作系统: centos7 ; hostname: c1 ; ip: 192.168.1.80 操作系统: centos7 ; hostname: ...

  8. hdu 1829 基础并查集,查同性恋

    A Bug's Life Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  9. Dubbo入门实例 本地伪集群测试Demo

    1.   概述 Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案 Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提 ...

随机推荐

  1. Sharepoint商务智能学习笔记之Powerpivot Service Dmeo(八)

    1)在Excel上添加Powerpivot工具栏 第一步,在Excel中启用Powerpivot 工具栏,新建一个空白Excel文件,在左上角点击文件,然后点击选项 2)使用Powerpivot添加数 ...

  2. C# 原码与补码的转换

    /// <summary> /// 求一个16位数数的补码 /// </summary> /// <param name="OriginalCode" ...

  3. 【C#】截取字符串

    几个经常用到的字符串的截取 string str="123abc456"; int i=3; 1 取字符串的前i个字符 str=str.Substring(0,i); // or ...

  4. Codeforces - 102222A - Maximum Element In A Stack - 模拟

    https://codeforc.es/gym/102222/problem/F 注意到其实用unsigned long long不会溢出. #include<bits/stdc++.h> ...

  5. bzoj2502: 清理雪道(有源汇有上下界最小流)

    传送门 别说话,自己看,我不会->这里 我这里用的建图方法是先跑一次最大流,连上$(t,s,inf)$之后再跑一遍,然后答案就是之前连的那条边的反向边的流量 据说还有种方法是连上$(t,s,in ...

  6. DMZ主机

    DMZ称为"隔离区",也称"非军事化区".为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间的缓冲区.这个缓冲区位于 ...

  7. 如何使用JDBC Request跨数据库查询后引用查询的结果作为下一个JDBC Request的入参

    [前言] 今天来给大家介绍下如何使用JDBC Request跨数据库查询后引用查询的结果作为下一个JDBC Request的入参! 因为我现在所测的系统模块中部分表在不同的数据库中,所以在用JDBC ...

  8. 通过jQuery实现AJAX

    通过jQuery实现AJAX > 使用get和getJSON都会有缓存问题,并且使用get方法不能传送较多的数据. 问题: 在IE浏览器中,get请求使用ajax存在缓存问题,会使用上一次请求的 ...

  9. 让你的spring-boot应用日志随心所欲--spring boot日志深入分析

    1.spring boot日志概述 spring boot使用Commons Logging作为内部的日志系统,并且给Java Util Logging,Log4J2以及Logback都提供了默认的配 ...

  10. 关于dijkstra求最短路(模板)

    嗯....   dijkstra是求最短路的一种算法(废话,思维含量较低,   并且时间复杂度较为稳定,为O(n^2),   但是注意:!!!!         不能处理边权为负的情况(但SPFA可以 ...