-
如果代码存在问题,麻烦大家指正 ~ ~
-
有帮助麻烦点个赞 ~ ~
编程练习4 - 数组Ⅱ(8~15)
- [7-8 2048游戏模拟(2)--向下移位合并(分数 15)](#7-8 2048游戏模拟(2)--向下移位合并(分数 15))
- [7-9 二进制数据转换成十进制数(分数 15)](#7-9 二进制数据转换成十进制数(分数 15))
- [7-10 英文单词排序(分数 15)](#7-10 英文单词排序(分数 15))
- [7-11 统计单词的长度(分数 15)](#7-11 统计单词的长度(分数 15))
- [7-12 来验证我们的身份证吧(分数 15)](#7-12 来验证我们的身份证吧(分数 15))
- [7-13 将整数按三位分节(分数 15)](#7-13 将整数按三位分节(分数 15))
- [7-14 求完全对称日(分数 10)](#7-14 求完全对称日(分数 10))
- [7-15 念数字(分数 10)](#7-15 念数字(分数 10))
7-8 2048游戏模拟(2)--向下移位合并(分数 15)
作者 李民
单位 武汉理工大学
本题模拟2048游戏的规则,提供4X4个格子,输入每个格子的初始值(空白格子值为0),玩家选择向下移动,所有数字向下靠拢,相同的数字相撞时会合并。移动结束后,输出合并后的数值。
输入格式:
分4行,每行输入4个整数,分别表示格子中的初值,数据之间用空格分隔。
输出格式:
分4行,输出移动合并后的数据,每个数之间有一个空格,行末无空格。
输入样例:
c
2 0 2 2
2 2 4 4
0 2 0 2
4 0 0 4
输出样例:
c
0 0 0 2
0 0 0 4
4 0 2 2
4 4 4 4
代码长度限制
16 KB
时间限制400 ms
内存限制64 MB
参考代码
c
#include <stdio.h>
int main()
{
int i, j, temp, k, count, a[4][4];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);
for(k=0;k<=3;k++)
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++)
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;
}
return 0;
}
7-9 二进制数据转换成十进制数(分数 15)
作者 汤练兵
单位 武汉理工大学
输入1个无符号二进制数串,编写程序将其转换成对应的十进制数,并输出。
输入格式:
输入1个二进制数串(至少1位且不超过16位)。
输出格式:
输出转换后的十进制数。
输入样例:
c
0110110001100
输出样例:
c
3468
代码长度限制
16 KB
时间限制400 ms
内存限制64 MB
参考代码
c
#include <stdio.h>
#include <math.h>
int main()
{
char a[17];
gets(a);
int i, n = strlen(a), k, sum=0;
for(i=n-1,k=0; i>=0; i--,k++)
sum += (a[i]-48)*pow(2,k);
printf("%d", sum);
return 0;
}
7-10 英文单词排序(分数 15)
作者 张泳
单位 浙大城市学院
本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。
输入格式:
输入为若干英文单词,每行一个,以#
作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。
输出格式:
输出为排序后的结果,每个单词后面都额外输出一个空格。
输入样例:
c
blue
red
yellow
green
purple
#
输出样例:
c
red blue green yellow purple
代码长度限制
16 KB
时间限制400 ms
内存限制64 MB
参考代码
c
#include<stdio.h>
#include<string.h>
int main(){
int i, j, k;
char a[30][20], temp[20];
for(i=0;i<20;i++) {
gets(a[i]);
if(a[i][0]=='#')
break;
}
for(k=0;k<i-1;k++)
for(j=0;j<i-k-1;j++)
if(strlen(a[j])>strlen(a[j+1])) {
strcpy(temp, a[j]);
strcpy(a[j], a[j+1]);
strcpy(a[j+1], temp);
}
for(j=0;j<i;j++)
printf("%s ", a[j]);
return 0;
}
7-11 统计单词的长度(分数 15)
作者 颜晖
单位 浙大城市学院
本题目要求编写程序,输入一行字符,统计每个单词的长度。所谓"单词"是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入格式:
输入给出一行字符。
输出格式:
在一行中输出每个单词的长度。每个数字后有一个空格。
输入样例:
c
How are you?
输出样例:
c
3 3 4
代码长度限制
16 KB
时间限制400 ms
内存限制64 MB
参考代码
c
#include<stdio.h>
int main()
{
int i=0, n=0;
char b;
scanf("%c", &b);
if(b!=' ') n++;
while(b != '\n') {
scanf("%c", &b);
if(b!=' ' &&b !='\n') n++;
if(n!=0 && b==' ' || b=='\n') {
if(n) {
printf("%d ", n);
i=1;
}
n=0;
}
}
if(i!=1)
printf("0 ");
return 0;
}
7-12 来验证我们的身份证吧(分数 15)
作者 孙骏
单位 武汉理工大学
咱们的身份证号码由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:
c
3
420106197107251007
310111196602231020
602402200311154723
输出样例 1:
c
全部正确!
输入样例 2:
c
2
42010619710725100X
220111196302231027
输出样例 2:
c
42010619710725100X
代码长度限制
16 KB
时间限制400 ms
内存限制64 MB
参考代码
c
#include <stdio.h>
int main(){
int sum, Z, n, i, count = 0, j, k, weight[] = { 7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2 }, wrong = 0;
char M[] = { '1','0','X','9','8','7','6','5','4','3','2' }, id[100][20];
scanf("%d", &n);
for(i = 0; i < n; i++) {
sum = 0;
scanf("%s", id[i]);
for(j = 0; j < 18; j++)
if(j < 17) {
if(id[i][j] >= '0' && id[i][j] <= '9')
sum += (id[i][j] - '0') * weight[j];
else {
wrong = 1;
break;
}
} else {
Z = sum % 11;
if (id[i][j] != M[Z])
wrong = 1;
}
if(wrong) {
printf("%s\n", id[i]);
count++;
wrong = 0;
}
}
if(count == 0) printf("全部正确!\n");
return 0;
}
7-13 将整数按三位分节(分数 15)
作者 李民
单位 武汉理工大学
编写一个程序,将某个位数不确定的非负整数进行三位分节后输出。程序保证数据是不超过4个字节的正整数。
输入格式:
输入一个非负整数,以回车结束输入。
输出格式:
将这个正整数每隔3位就用逗号分隔,然后输出。
输入样例:
c
1234567
输出样例:
c
1,234,567
代码长度限制
16 KB
时间限制400 ms
内存限制64 MB
参考代码
c
#include<stdio.h>
#include<string.h>
int main(){
char a[1000];
scanf("%s", a);
int i, t = strlen(a);
for(i=0; i<t; i++) {
printf("%c", a[i]);
if((t-i-1)%3==0 && i!=t-1)
printf(",");
}
printf("\n");
return 0;
}
7-14 求完全对称日(分数 10)
作者 李民
单位 武汉理工大学
刚进入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。每行输出一个完全对称日。
输入样例:
c
2011 2020
输出样例:
c
2011.11.02
2020.02.02
代码长度限制
16 KB
时间限制400 ms
内存限制64 MB
参考代码
c
#include <stdio.h>
int main()
{
int y, mm, day, m, n, result=0;
scanf("%d %d", &m, &n);
for(y=m;y<=n;y++)
for(mm=1;mm<=12;mm++) {
if(mm==1||mm==3||mm==5||mm==7||mm==8||mm==10||mm==12)
for(day=1;day<=31;day++)
if(y==day%10*1000+day/10*100+mm%10*10+mm/10) {
printf("%d.%02d.%02d\n",y,mm,day);
result=1;
}
if(mm==4||mm==6||mm==9||mm==11)
for(day=1;day<=30;day++)
if(y==day%10*1000+day/10*100+mm%10*10+mm/10) {
printf("%d.%02d.%02d\n", y, mm, day);
result=1;
}
if(mm==2) {
if((y%4==0&&y%100!=0)||(y%400==0)) {
for(day=1;day<=29;day++)
if(y==day%10*1000+day/10*100+mm%10*10+mm/10) {
printf("%d.%02d.%02d\n", y, mm, day);
result=1;
}
}
else
for(day=1;day<=28;day++)
if(y==day%10*1000+day/10*100+mm%10*10+mm/10) {
printf("%d.%02d.%02d\n", y, mm, day);
result=1;
}
}
}
if(result==0) printf("None");
return 0;
}
7-15 念数字(分数 10)
作者 翁恺
单位 浙江大学
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu
字。十个数字对应的拼音如下:
c
0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu
输入格式:
输入在一行中给出一个整数,如:1234
。
提示:整数包括负数、零和正数。
输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如
yi er san si
。
输入样例:
c
-600
输出样例:
c
fu liu ling ling
代码长度限制
16 KB
时间限制400 ms
内存限制64 MB
参考代码
c
#include<stdio.h>
#include<string.h>
int main()
{
char num[20];
scanf("%s", &num);
int i, n = strlen(num);
for(i=0; i<n; i++) {
switch(num[i]) {
case '-':printf("fu"); break;
case '0':printf("ling"); break;
case '1':printf("yi"); break;
case '2':printf("er"); break;
case '3':printf("san"); break;
case '4':printf("si"); break;
case '5':printf("wu"); break;
case '6':printf("liu"); break;
case '7':printf("qi"); break;
case '8':printf("ba"); break;
case '9':printf("jiu"); break;
default: break;
}
if(i<n-1) printf(" ");
}
return 0;
}