7-1 矩阵运算 分数 20
给定一个n×n的方阵,本题要求计算该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。副对角线为从矩阵的右上角至左下角的连线。
输入格式:
输入第一行给出正整数n(1<n≤10);随后n行,每行给出n个整数,其间以空格分隔。
输出格式:
在一行中给出该矩阵除副对角线、最后一列和最后一行以外的所有元素之和。
输入样例:
4
2 3 4 1
5 6 1 1
7 1 8 1
1 1 1 1
输出样例:
35
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<stdio.h>
int main(){
int N, A[10][10];
int i,j, sum=0;
scanf("%d", &N);
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
scanf("%d", &A[i][j]);
for(i=0;i<N-1;i++)
for(j=0;j<N-1;j++)
if(j!=N-i-1)
sum+=A[i][j];
printf("%d", sum);
return 0;
}
7-2 查找指定字符 分数 15
本题要求编写程序,从给定字符串中查找某指定的字符。
输入格式:
输入的第一行是一个待查找的字符。第二行是一个以回车结束的非空字符串(不超过80个字符)。
输出格式:
如果找到,在一行内按照格式“index = 下标”输出该字符在字符串中所对应的最大下标(下标从0开始);否则输出"Not Found"。
输入样例1:
m
programming
输出样例1:
index = 7
输入样例2:
a
1234
输出样例2:
Not Found
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<stdio.h>
#include<string.h>
int main(){
char ch,A[82];
int i,r=1;
scanf("%c ", &ch);
gets(A);
for(i=strlen(A)-1;i>=0;i--)
if(A[i]==ch){
r=0;
break;
}
if(r)
puts("Not Found");
else
printf("index = %d", i);
return 0;
}
7-3 统计一行文本的单词个数 分数 15
本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入格式:
输入给出一行字符。
输出格式:
在一行中输出单词个数。
输入样例:
Let's go to room 209.
输出样例:
5
鸣谢用户 张麦麦 补充数据!
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<stdio.h>
int main(){
char A[500000];
int r=0;
while(scanf("%s", A)!=EOF)
r++;
printf("%d", r);
return 0;
}
7-4 字符串排序 分数 20
本题要求编写程序,读入5个字符串,按由小到大的顺序输出。
输入格式:
输入为由空格分隔的5个非空字符串,每个字符串不包括空格、制表符、换行符等空白字符,长度小于80。
输出格式:
按照以下格式输出排序后的结果:
After sorted:
每行一个字符串
输入样例:
red yellow blue black white
输出样例:
After sorted:
black
blue
red
white
yellow
鸣谢贵州民族大学张玉全老师修正数据!
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<stdio.h>
#include<string.h>
int main(){
int i,j,r;
char A[5][100];
char* C[5];
char* B;
for(i=0;i<5;i++)
scanf("%s", A[i]);
for(i=0;i<5;i++)
C[i]=A[i];
for(i=0;i<4;i++){
r=1;
for(j=0;j<4-i;j++)
if(strcmp(C[j], C[j+1])>0){
B=C[j];
C[j]=C[j+1];
C[j+1]=B;
r=0;
}
if(r)
break;
}
puts("After sorted:");
for(i=0;i<5;i++)
puts(C[i]);
return 0;
}
7-5 螺旋方阵 分数 20
所谓“螺旋方阵”,是指对任意给定的N,将1到N×N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入N×N的方阵里。本题要求构造这样的螺旋方阵。
输入格式:
输入在一行中给出一个正整数N(<10)。
输出格式:
输出N×N的螺旋方阵。每行N个数字,每个数字占3位。
输入样例:
5
输出样例:
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<stdio.h>
int main(){
int N,x=1, i,j;
scanf("%d", &N);
int left=0,right=N-1,up=0,down=N-1;
int A[9][9];
while(x<=N*N){
for(i=left;i<=right;i++)
A[up][i]=x++;
up++;
for(i=up;i<=down;i++)
A[i][right]=x++;
right--;
for(i=right;i>=left;i--)
A[down][i]=x++;
down--;
for(i=down;i>=up;i--)
A[i][left]=x++;
left++;
}
for(i=0;i<N;i++){
for(j=0;j<N;j++)
printf("%3d", A[i][j]);
putchar('\n');
}
return 0;
}
7-6 删除重复字符 分数 20
本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。
输入格式:
输入是一个以回车结束的非空字符串(少于80个字符)。
输出格式:
输出去重排序后的结果字符串。
输入样例:
ad2f3adjfeainzzzv
输出样例:
23adefijnvz
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<stdio.h>
#include<string.h>
void s_gets(char* , int);
void sort(char* st);
void del(char* st);
int main(){
int i;
char A[85];
s_gets(A, 80);
del(A);
sort(A);
printf("%s", A);
return 0;
}
void del(char* A){
char B[81];
int i,j,t=0,r;
for(i=0;i<strlen(A);i++){
r=1;
for(j=0;j<i;j++)
if(B[j]==A[i]){
r=0;
break;
}
if(r){
B[t]=A[i];
t++;
}
}
B[t]='\0';
strcpy(A, B);
}
void sort(char* A){
int i,j,r;
char t;
for(i=0;i<strlen(A)-1;i++){
r=1;
for(j=0;j<strlen(A)-1-i;j++)
if(A[j]>A[j+1]){
t=A[j];
A[j]=A[j+1];
A[j+1]=t;
r=0;
}
if(r)
break;
}
}
void s_gets(char* st, int n){
int i=0;
char* ret_val;
ret_val=fgets(st, n, stdin);
if(ret_val){
while(st[i]!='\n'&&st[i]!='\0')
i++;
if(st[i]=='\n')
st[i]='\0';
else
while(getchar()!='\n')
continue;
}
return ret_val;
}
7-7 统计字符出现次数 分数 20
本题要求编写程序,统计并输出某给定字符在给定字符串中出现的次数。
输入格式:
输入第一行给出一个以回车结束的字符串(少于80个字符);第二行输入一个字符。
输出格式:
在一行中输出给定字符在给定字符串中出现的次数。
输入样例:
programming is More fun!
m
输出样例:
2
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<stdio.h>
#include<string.h>
int main(){
int r=0;
char ch;
char S[82];
fgets(S, 81, stdin);
scanf("%c", &ch);
for(int i=0;i<strlen(S);i++)
if(ch==S[i])
r++;
printf("%d", r);
return 0;
}
7-8 谷歌的招聘 分数 20
2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘。内容超级简单,就是一个以 .com 结尾的网址,而前面的网址是一个 10 位素数,这个素数是自然常数 e 中最早出现的 10 位连续数字。能找出这个素数的人,就可以通过访问谷歌的这个网站进入招聘流程的下一步。
自然常数 e 是一个著名的超越数,前面若干位写出来是这样的:e = 2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921... 其中粗体标出的 10 位数就是答案。
本题要求你编程解决一个更通用的问题:从任一给定的长度为 L 的数字中,找出最早出现的 K 位连续数字所组成的素数。
输入格式:
输入在第一行给出 2 个正整数,分别是 L(不超过 1000 的正整数,为数字长度)和 K(小于 10 的正整数)。接下来一行给出一个长度为 L 的正整数 N。
输出格式:
在一行中输出 N 中最早出现的 K 位连续数字所组成的素数。如果这样的素数不存在,则输出 404
。注意,原始数字中的前导零也计算在位数之内。例如在 200236 中找 4 位素数,0023 算是解;但第一位 2 不能被当成 0002 输出,因为在原始数字中不存在这个 2 的前导零。
输入样例 1:
20 5
23654987725541023819
输出样例 1:
49877
输入样例 2:
10 3
2468001680
输出样例 2:
404
鸣谢用户 大冰 补充数据!
代码长度限制
16 KB
时间限制
200 ms
内存限制
64 MB
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int Prime(int);
int plus(int* , int);
int main(){
int L,K, i,j,k, R, r=1;
int* N, *S;
scanf("%d %d ", &L, &K);
N=(int*)malloc(L*sizeof(int));
S=(int*)calloc(K, sizeof(int));
for(int i=0;i<L;i++)
N[i]=getchar()-48;
for(i=0;i<L-K+1;i++){
for(j=i, k=0;j<K+i;j++,k++)
S[k]=N[j];
R=plus(S, K);
if(Prime(R)){
r=0;
break;
}
}
if(r)
printf("404");
else
for(j=i;j<i+K;j++)
printf("%d", N[j]);
return 0;
}
int plus(int* A, int r){
int sum=0,i,j;
for(i=0,j=r-1;i<r;i++,j--)
sum+=A[i]*pow(10, j);
return sum;
}
int Prime(int N){
if(N<2)
return 0;
for(int i=2;i*i<=N;i++)
if(N%i==0)
return 0;
return 1;
}
7-9 敲笨钟 分数 20
微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性,还会糟改几句古诗词。其糟改的方法为:去网上搜寻压“ong”韵的古诗词,把句尾的三个字换成“敲笨钟”。例如唐代诗人李贺有名句曰:“寻章摘句老雕虫,晓月当帘挂玉弓”,其中“虫”(chong)和“弓”(gong)都压了“ong”韵。于是这句诗就被糟改为“寻章摘句老雕虫,晓月当帘敲笨钟”。
现在给你一大堆古诗词句,要求你写个程序自动将压“ong”韵的句子糟改成“敲笨钟”。
输入格式:
输入首先在第一行给出一个不超过 20 的正整数 N。随后 N 行,每行用汉语拼音给出一句古诗词,分上下两半句,用逗号 ,
分隔,句号 .
结尾。相邻两字的拼音之间用一个空格分隔。题目保证每个字的拼音不超过 6 个字符,每行字符的总长度不超过 100,并且下半句诗至少有 3 个字。
输出格式:
对每一行诗句,判断其是否压“ong”韵。即上下两句末尾的字都是“ong”结尾。如果是压此韵的,就按题面方法糟改之后输出,输出格式同输入;否则输出 Skipped
,即跳过此句。
输入样例:
5
xun zhang zhai ju lao diao chong, xiao yue dang lian gua yu gong.
tian sheng wo cai bi you yong, qian jin san jin huan fu lai.
xue zhui rou zhi leng wei rong, an xiao chen jing shu wei long.
zuo ye xing chen zuo ye feng, hua lou xi pan gui tang dong.
ren xian gui hua luo, ye jing chun shan kong.
输出样例:
xun zhang zhai ju lao diao chong, xiao yue dang lian qiao ben zhong.
Skipped
xue zhui rou zhi leng wei rong, an xiao chen jing qiao ben zhong.
Skipped
Skipped
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<stdio.h>
#include<string.h>
#include<stdbool.h>
void s_gets(char*, int);
int main() {
int N, i, j, k, r, t, u, L;
char ch;
char S[] = "qiao ben zhong.";
char A[21][120];
scanf("%d ", &N);
for (i = 0; i < N; i++) {
bool P = false, Q = false;
s_gets(A[i], 101);
L = strlen(A[i]);
for (r = L - 1;; r--)//r为,位置
if (A[i][r] == ',')
break;
if (A[i][L - 2] == 'g' && A[i][L - 3] == 'n' && A[i][L - 4] == 'o')
P = true;
if (A[i][r - 1] == 'g' && A[i][r - 2] == 'n' && A[i][r - 3] == 'o')
Q = true;
if (P && Q) {
for (j = L - 1, t = 0; A[i][j] != ','; j--) {//j为空格位置(不足3空格为逗号位置)
if (A[i][j] == ' ')
t++;
if (t == 3)
break;
}
for (r = 0; r < j + 1; r++)
putchar(A[i][r]);
puts(S);
}
else
puts("Skipped");
}
return 0;
}
void s_gets(char* st, int n) {
int i = 0;
char* ret_val;
ret_val = fgets(st, n, stdin);
if (ret_val) {
while (st[i] != '\n' && st[i] != '\0')
i++;
if (st[i] == '\n')
st[i] = '\0';
else
while (getchar() != '\n')
continue;
}
}
7-10 凯撒密码 分数 20
为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个整数offset,用凯撒密码将其加密后输出。恺撒密码是一种简单的替换加密技术,将明文中的所有字母都在字母表上偏移offset位后被替换成密文,当offset大于零时,表示向后偏移;当offset小于零时,表示向前偏移。
输入格式:
输入第一行给出一个以回车结束的非空字符串(少于80个字符);第二行输入一个整数offset。
输出格式:
输出加密后的结果字符串。
输入样例1:
Hello Hangzhou
2
输出样例1:
Jgnnq Jcpibjqw
输入样例2:
a=x+y
-1
输出样例2:
z=w+x
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<stdio.h>
#include<string.h>
#include<ctype.h>
void s_gets(char*, int);
int main(){
int R,i;
char A[85];
s_gets(A, 81);
scanf("%d", &R);
R%=26;
for(i=0;i<strlen(A);i++){
if(isupper(A[i])){
if(A[i]+R>90)
A[i]=64+R-('Z'-A[i]);
else if(A[i]+R<65)
A[i]=91+R+(A[i]-'A');
else
A[i]+=R;
}
else if(islower(A[i])){
if(A[i]+R>122)
A[i]=96+R-('z'-A[i]);
else if(A[i]+R<97)
A[i]=123+R+(A[i]-'a');
else
A[i]+=R;
}
putchar(A[i]);
}
return 0;
}
void s_gets(char* st, int n){
int i=0;
char* ret_val;
ret_val=fgets(st, n, stdin);
if(ret_val){
while(st[i]!='\n'&&st[i]!='\0')
i++;
if(st[i]=='\n')
st[i]='\0';
else
while(getchar()!='\n')
continue;
}
return ret_val;
}