7-1 冒泡法排序
将N个整数按从小到大排序的冒泡排序法是这样工作的:从头到尾比较相邻两个元素,如果前面的元素大于其紧随的后面元素,则交换它们。通过一遍扫描,则最后一个元素必定是最大的元素。然后用同样的方法对前N−1个元素进行第二遍扫描。依此类推,最后只需处理两个元素,就完成了对N个数的排序。
本题要求对任意给定的K(<N),输出扫描完第K遍后的中间结果数列。
输入格式:
输入在第1行中给出N和K(1≤K<N≤100),在第2行中给出N个待排序的整数,数字间以空格分隔。
输出格式:
在一行中输出冒泡排序法扫描完第K遍后的中间结果数列,数字间以空格分隔,但末尾不得有多余空格。
输入样例:
6 2
2 3 5 1 6 4
输出样例:
2 1 3 4 5 6
代码段:
#include <stdio.h>
#include <stdlib.h>
#define N 100
int main()
{
int n,k,arr[N],i,j,t;
scanf("%d%d",&n,&k);
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
for(j=0;j<k;j++)
{
for(i=0;i<n-1;i++)
{
if(arr[i]>arr[i+1])
{
t=arr[i];
arr[i]=arr[i+1];
arr[i+1]=t;
}
}
}
for(i=0;i<n-1;i++)
{
printf("%d ",arr[i]);
}
printf("%d",arr[n-1]);
}
7-2 评委打分.
班级里要搞智力竞赛啦!同学们都踊跃参加。进入最后决赛的是10个同学,随着一道道题目的出示,有时是1号选手得分,有时是5号选手得分,每次答对者得10分,最后结果如何呢?
输入格式:
第一行有十个整数,表示十位同学的初始分。第二行一个整数n,表示有n道题竞赛。
接下去有n行,每行有一个数字x,x表示本次可以加分的选手序号(每次答对者得10分)。
输出格式:
10个同学最终的得分值,每两位同学之间有一个空格。
输入样例:
10 0 0 0 10 10 0 0 0 10
3
1
10
1
输出样例:
30 0 0 0 10 10 0 0 0 20
代码段:
#include <stdio.h>
int main()
{
int a[10];
int n,i,temp;
for(i=0;i<=9;i++)
scanf("%d ",&a[i]);
scanf("\n%d\n",&n);
for(i=1;i<=n;i++)
{
scanf("%d\n",&temp);
a[temp-1]=a[temp-1]+10;
}
for(i=0;i<=8;i++)
printf("%d ",a[i]);
printf("%d",a[9]);
}
7-3 组合数的和
给定 N 个非 0 的个位数字,用其中任意 2 个数字都可以组合成 1 个 2 位的数字。要求所有可能组合出来的 2 位数字的和。例如给定 2、5、8,则可以组合出:25、28、52、58、82、85,它们的和为330。
输入格式:
输入在一行中先给出 N(1 < N < 10),随后一行给出 N 个不同的非 0 个位数字。数字间以空格分隔。
输出格式:
输出所有可能组合出来的2位数字的和。
输入样例:
3
2 8 5
输出样例:
330
代码段:
#include <stdio.h>
int main()
{
int a[10],i,j,sum,n;
scanf("%d ",&n);
for(i=0;i<n;i++)
scanf("%d ",&a[i]);
for(i=0;i<=n-1;i++)
for(j=i+1;j<=n-1;j++)
{
sum=sum+a[i]*10+a[j];
}
for(i=n-1;i>=0;i--)
for(j=i-1;j>=0;j--)
{
sum=sum+a[i]*10+a[j];
}
printf("%d",sum);
}
7-4 找不同
这是一个签到题,非常简单。一群网友在网上在玩游戏,看谁是最与众不同的,每一个人都单独写一个数字,然后依次上交,谁的数据没有和其他人重复,谁就赢了,如果有很多人都与众不同,那么第一个做到的才是真正的与众不同。
输入格式:
输入是一个测试用例,首先给出网友个数N,之后依次给出N个正整数,给出的正整数和N都不超过10的5次方。
输出格式:
对每一组输入,输出与众不同的那个数,如果没有,输出None
。
输入样例1:
在这里给出一组输入。例如:
8 1 2 3 4 4 5 3 1
输出样例1:
在这里给出相应的输出。例如:
2
输入样例2:
在这里给出一组输入。例如:
8 1 2 3 4 4 3 2 1
输出样例2:
在这里给出相应的输出。例如:
None
代码段:
#include<stdio.h>
int main()
{
int a[100000];
int n;
scanf("%d", &n);
int z = 0;
int count = 0;
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (a[i] != a[j])
{
z += 1;
}
}
if (z == n - 1)
{
printf("%d", a[i]);
count += 1;
break;
}
z = 0;
}
if (count == 0) printf("None");
return 0;
}
7-5 利用二分查找搜寻所有待查找数据
利用二分法在一个有N(N≤20)个元素的有序数列中查找指定值y。找到y后,先输出查找次数,再输出其在数组中对应的下标。若数列中存在多个y,将所有y的位置按下标序号顺序输出;
否则输出“not found”.
输入格式:
输入在第1行中给出1个不大于20的数N。在第2行给出N个数(升序),以空格分隔。最后在第3行给出待查找数据y。
输出格式:
若数列中存在y:先输出查询次数,在其后每行以格式“位置:k”,输出一个位置值。
若数列中没有y:输出“not found”。
输入样例 1:
10
34 56 78 87 87 87 87 112 520 888
87
输出样例 1:
查找次数1
位置:3
位置:4
位置:5
位置:6
输入样例 2:
10
34 56 78 87 87 87 87 112 520 888
80
输出样例 2:
not found
代码段:
#include <stdio.h>
int main()
{
int n,a[20],i,num,count1=0,count2=1,left,right,mid;
scanf("%d\n",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
scanf("\n%d",&num);
for(i=0;i<n;i++)
{
if(num!=a[i])
count1++;
}
if(count1==n)
printf("not found");
if(count1!=n)
{
left=0;
right=n-1;
while(left<=right)
{
mid=(left+right)/2;
if(num<a[mid])
{
count2++;
right=mid-1;
continue;
}
if(num>a[mid])
{
count2++;
left=mid+1;
continue;
}
else
{
printf("查找次数%d\n",count2);
for(i=0;i<n;i++)
{
if(a[i]==num)
printf("位置:%d\n",i);
}
break;
}
}
}
}
7-6 判断上三角矩阵
上三角矩阵指主对角线以下的元素都为0的矩阵;主对角线为从矩阵的左上角至右下角的连线。
本题要求编写程序,判断一个给定的方阵是否上三角矩阵。
输入格式:
输入第一行给出一个正整数T,为待测矩阵的个数。接下来给出T个矩阵的信息:每个矩阵信息的第一行给出一个不超过10的正整数n。随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。
输入样例:
3
3
1 2 3
0 4 5
0 0 6
2
1 0
-8 2
3
1 2 3
1 4 5
0 -1 6
输出样例:
YES
NO
NO
代码段:
#include <stdio.h>
int main()
{
int T, n, i = 0, j = 0;
scanf("%d", &T);
for (i = 0; i < T; i++)
{
scanf("%d", &n);
int matix[n][n], flag = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
{
scanf("%d", &matix[i][j]);
if ((i > j) && matix[i][j] != 0)
flag = 1;
}
if (flag)
printf("NO\n");
else printf("YES\n");
}
return 0;
}
7-7 方阵循环右移
本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。
输入格式:
输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。
输出格式:
按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。
输入样例:
2 3
1 2 3
4 5 6
7 8 9
输出样例:
2 3 1
5 6 4
8 9 7
代码段:
#include <stdio.h>
int main()
{
int m,n,i,j,step,count;
scanf("%d %d\n",&m,&n);
for(i=0;i<n;i++)
{
int a[n][n];
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
m=m%n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
printf("%d ",a[i][(n - m + j) % n]);
count++;
if(count==n)
{
printf("\n");
count=0;
}
}
}
}
7-8 TicTacToe游戏--胜负判定
井字棋是一种在3x3格子上进行的连珠游戏,和五子棋比较类似,由于棋盘一般不画边框,格线排成井字故得名。
游戏规则:由分别代表O和X的两个游戏者轮流在格子里留下标记。由最先在任意一条直线上成功连接三个标记的一方获胜。(摘抄自百度百科)
读入一个3X3的二维数组,数组元素为'X'表示下X,元素为'O'表示下O,数组元素为'.'(英文符号“点”)表示未下棋,现编写程序进行当前胜负的判断,如果X方胜,则显示"X win!",如果O方胜,则显示"O win!",如果无人获胜,则显示"No one win!"。
输入格式:
读入一个3X3的二维数组,数组元素为'X'表示下X,元素为'O'表示下O,数组元素为'.'(英文符号“点”)表示未下棋。
输出格式:
若X方胜,则显示"X win!";若O方胜,则显示"O win!";若无人获胜,则显示"No one win!"。
输入样例1:
X.O
OX.
O.X
输出样例2:
X win!
输入样例2:
O.O
XX.
X..
输出样例2:
No one win!
代码段:
#include<stdio.h>
int main()
{
char a[4][4];
int i,xflag=0,oflag=0;
for(i=0;i<3;i++)
{
scanf("%s",a[i]);
}
for(i=0;i<3;i++)
{
if((a[i][0]==a[i][1])&&(a[i][1]==a[i][2])&&(a[i][0]==a[i][2]))//判断行是否三个相同
{
if(a[i][0]!='.')
{
if(a[i][0]=='X')
xflag=1;
else
oflag=1;
}
}
}
for(i=0;i<3;i++)
{
if((a[0][i]==a[1][i])&&(a[1][i]==a[2][i])&&(a[0][i]==a[2][i]))
{
if(a[0][i]!='.')
{
if(a[0][i]=='X')
xflag=1;
else
oflag=1;
}
}
}
if(((a[0][0]==a[1][1])&&(a[1][1]==a[2][2])&&(a[0][0]==a[2][2]))||((a[0][2]==a[1][1])&&(a[1][1]==a[2][0])&&(a[0][2]==a[2][0])))
{
if(a[1][1]!='.')
{
if(a[1][1]=='X')
xflag=1;
else
oflag=1;
}
}
if((xflag==1)&&(oflag==0))
printf("X win!\n");//xwin
else if((xflag==0)&&(oflag==1))
printf("O win!\n");//owin
else
printf("No one win!\n");
return 0;
}
7-9 2048游戏模拟(2)--向下移位合并
本题模拟2048游戏的规则,提供4X4个格子,输入每个格子的初始值(空白格子值为0),玩家选择向下移动,所有数字向下靠拢,相同的数字相撞时会合并。移动结束后,输出合并后的数值。
输入格式:
分4行,每行输入4个整数,分别表示格子中的初值,数据之间用空格分隔。
输出格式:
分4行,输出移动合并后的数据,每个数之间有一个空格,行末无空格。
输入样例:
2 0 2 2
2 2 4 4
0 2 0 2
4 0 0 4
输出样例:
0 0 0 2
0 0 0 4
4 0 2 2
4 4 4 4
代码段:
#include <stdio.h>
int main()
{
int i,j,a[4][4],temp,k,count;
for(i=0;i<4;i++) //2048数组初始输入
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);
for(k=0;k<=3;k++) //把0与非0元素交换
{
for(j=0;j<=3;j++)
{
for(i=0;i<=3-j;i++)
{
if(a[i][k]==0&&i-1>=0)
{
temp=a[i][k];
a[i][k]=a[i-1][k];
a[i-1][k]=temp;
}
}
}
}
for(k=0;k<=3;k++) //将相同元素合并
{
for(i=3;i>=0;i--)
{
if(a[i][k]==a[i-1][k])
{
a[i][k]+=a[i-1][k];
a[i-1][k]=0;
}
}
}
for(k=0;k<=3;k++) //把0与非0元素交换
{
for(j=0;j<=3;j++)
{
for(i=0;i<=3-j;i++)
{
if(a[i][k]==0&&i-1>=0)
{
temp=a[i-1][k];
a[i-1][k]=a[i][k];
a[i][k]=temp;
}
}
}
}
for(k=0;k<=3;k++) //输出
{
for(i=0;i<=3;i++)
{
if(count!=3)
{
printf("%d ",a[k][i]);
count++;
}
else
{
printf("%d\n",a[k][i]);
count=0;
}
}
}
}
7-10 二进制数据转换成十进制数
输入1个无符号二进制数串,编写程序将其转换成对应的十进制数,并输出。
输入格式:
输入1个二进制数串(至少1位且不超过16位)。
输出格式:
输出转换后的十进制数。
输入样例:
0110110001100
输出样例:
3468
代码段:
#include <stdio.h>
#include <math.h>
#include <string.h>
int main()
{
char a[17];
gets(a);
int n,sum=0;
n=strlen(a);
for(int i=n-1,k=0;i>=0;i--,k++){
sum+=(a[i]-48)*pow(2,k);
}
printf("%d",sum);
return 0;
}
7-11 英文单词排序
本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。
输入格式:
输入为若干英文单词,每行一个,以#
作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。
输出格式:
输出为排序后的结果,每个单词后面都额外输出一个空格。
输入样例:
blue
red
yellow
green
purple
#
输出样例:
red blue green yellow purple
代码段:
#include<stdio.h>
#include<string.h>
int main(void)
{
char str[20][11];
int i=0;
while (1)
{
scanf("%s",str[i]);
if (str[i][0]=='#')
break;
i++;
}
int len=i;
int j,k;
char temp[11];
for (j=0; j<=len-1; j++)
{
for (k=0; k<len-j; k++)
{
if (strlen(str[k-1])>strlen(str[k]))
{
strcpy(temp,str[k]);
strcpy(str[k],str[k-1]);
strcpy(str[k-1],temp);
}
}
}
for (j=0; j<=len-1; j++)
{
printf("%s ",str[j]);
}
return 0;
}
7-12 统计单词的长度
本题目要求编写程序,输入一行字符,统计每个单词的长度。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入格式:
输入给出一行字符。
输出格式:
在一行中输出每个单词的长度。每个数字后有一个空格。
输入样例:
How are you?
输出样例:
3 3 4
代码段:
#include<stdio.h>
int main()
{
char ch;
int len=0,isword=0,allspace=1;
while((ch=getchar())!='\n')
{
if(ch==' ')
{
if(isword)
{
printf("%d ",len);
isword=0;
len=0;
}
}
else
{
if(!isword)
{
isword=1;
}
len++;
allspace=0;
}
}
if(isword)printf("%d ",len);
if(allspace)printf("0 ");
return 0;
}
7-13 来验证我们的身份证吧
咱们的身份证号码由18位字符组成,其中17位为地区、日期编号和顺序编号,最后1位为校验码。
校验码的计算规则如下:
- 首先求出前17位数字的加权和S,权重分配按顺序为:{ 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
- 然后将计算的和S对11取模得到值Z;
- 最后按照以下关系对应Z值与校验码M的值:
Z: 0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
例如:对于身份证号420111200001014148,按权重累加和S为:
4×7+2×9+0×10+1×5+......+4×8+1×4+4×2=125
由此计算 Z=S % 11=4
对应的M值为 8 ,即校验位值为8,与输入的身份证号最后一位相同,故上述身份证号正确。若M值与身份证最后一位不同,则身份证号有问题。
本题给出一些身份证号码,请你验证校验码是否正确。若身份证号有问题,则输出该号码。
输入格式:
第1行输入需判断的身份证号码条数N(0<N<=10)。从第2行开始,每行输入一条身份证号。
输出格式:
每行输出一条不正确的身份证号。
若全部正确,输出"全部正确!"。
输入样例 1:
3
420106197107251007
310111196602231020
602402200311154723
输出样例 1:
全部正确!
输入样例 2:
2
42010619710725100X
220111196302231027
输出样例 2:
42010619710725100X
代码段:
#include <stdio.h>
#include <stdlib.h>
#define ID_Len 18
int main()
{
int N;
scanf("%d",&N);
int weight[17]= {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char ID[19];
char M[11]= {'1','0','X','9','8','7','6','5','4','3','2'};
int flag=1;
for(int i=0; i<N; i++)
{
int sum=0;
scanf("%s",ID);
for(int j=0; j<17; j++)
{
sum+=(ID[j]-'0')*weight[j];
}
sum=sum%11;
if(M[sum]!=ID[17])
{
flag=0;
printf("%s\n",ID);
}
}
if(flag==1)
{
printf("全部正确!");
}
}
7-14 将整数按三位分节
编写一个程序,将某个位数不确定的非负整数进行三位分节后输出。程序保证数据是不超过4个字节的正整数。
输入格式:
输入一个非负整数,以回车结束输入。
输出格式:
将这个正整数每隔3位就用逗号分隔,然后输出。
输入样例:
1234567
输出样例:
1,234,567
代码段:
#include <stdio.h>
int main()
{
int a,i;
char s[30] = "";
scanf("%d",&a);
i = 0;
while(1)
{
s[i] = a%10 + '0';
a = a/10;
if(a==0)
{
break;
}
i++;
}
printf("%c",s[i--]);
for(i;i>=0;i--)
{
if((i+1)%3== 0) /* i+1是是单个数字在数字字符串的位置,因为上面i是从0开始的*/
{
printf(",%c",s[i]);
}
else
{
printf("%c",s[i]);
}
}
return 0;
}
7-15 求完全对称日
刚进入2020年,网上就流传着2020.02.02是“千年一遇”的对称日(正着读反着读都一样),很多情侣准备选择这一天去登记结婚。事实上,像这样的完全对称日还有很多。
现在来编写一个程序,输入2个年份M、N(1000<=M<=N<=9999),输出M和N之间(包含M、N)的所有完全对称日。如果没有完全对称日,则输出"None"。
输入格式:
输入2个年份M、N(1000<=M<=N<=9999)。
输出格式:
按“年.月.日”的格式输出该年所有的完全对称日。其中年按4位输出,月、日均按2位输出,位数不足则加前导0。每行输出一个完全对称日。
输入样例:
2011 2020
输出样例:
2011.11.02
2020.02.02
代码段:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
long int A[1000]={0},B[1000]={0},C,D,E,sum=0,real=0,A1;
int m,n;
scanf("%d %d",&m,&n);
for(int q=m;q<=n;q++)
{
for(int w=1;w<=12;w++)
{
if(w==1||w==3||w==5||w==7||w==8||w==10||w==12)
{
for(int e=1;e<=31;e++)
{
A1=q*10000;
if(w<10)
A1=A1+w*100;
if(w>=10)
A1=A1+w*100;
A1=A1+e;
C=A1;
for(int o=1;;o++)
{
A[o]=C%10;
C=C/10;
D=o;
if(C==0)
break;
}
E=D;
for(int o=1;o<=D;o++)
{
for(int t=(E-o);t>0;t--)
{
A[o]=A[o]*10;
}
real=real+A[o];
}
if(real==A1)
{
sum=sum+1;
printf("%d.%02d.%02d\n",q,w,e);
}
real=0;
}
}
else
{ int z=30;
if(q%4!=0&&w==2)
z=28;
for(int e=1;e<=z;e++)
{
A1=q*10000;
if(w<10)
A1=A1+w*100;
if(w>=10)
A1=A1+w*100;
A1=A1+e;
C=A1;
for(int o=1;;o++)
{
A[o]=C%10;
C=C/10;
D=o;
if(C==0)
break;
}
E=D;
for(int o=1;o<=D;o++)
{
for(int t=(E-o);t>0;t--)
{
A[o]=A[o]*10;
}
real=real+A[o];
}
if(real==A1)
{
sum=sum+1;
printf("%d.%02d.%02d\n",q,w,e);
}
real=0;
}
}
}
}
if(sum==0)
printf("None");
return 0;
}