目录
7-1 矩阵运算
给定一个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
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
int n,i,j,sum;
sum=0;
int a[10][10];
scanf("%d",&n);
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%d",&a[i][j]);
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if((j+1)!=n&&(i+j)!=n-1&&(i+1)!=n){
sum=sum+a[i][j];
}
else continue;
}
}
printf("%d",sum);
return 0;
}
7-2 统计一行文本的单词个数
本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入格式:
输入给出一行字符。
输出格式:
在一行中输出单词个数。
输入样例:
Let's go to room 209.
输出样例:
5
#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
int n,len,i;
char str[10000],ch;
gets(str);
len=strlen(str);
if(str[0]==' ')n=0;
else n=1;
for(i=0;i<len-1;i++){
if(str[i]==' '&&str[i+1]!=' ')
n++;
}
printf("%d\n",n);
return 0;
}
7-3 螺旋方阵
所谓“螺旋方阵”,是指对任意给定的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
#include<stdio.h>
int main(){
int n,i=0,j,c=0;
scanf("%d",&n);
int k=0,l=n-1;
int a[n][n];
while(k<=l){
for( j=k ;j<=l;j++) a[k][j]=++c;
for(i=k+1;i<=l;i++) a[i][l]=++c;
for(j=l-1;j>=k;j--) a[l][j]=++c;
for(i=l-1;i>k ;i--) a[i][k]=++c;
k++;l--;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%3d",a[i][j]);
printf("\n");
}
}
7-4 删除重复字符
本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。
输入格式:
输入是一个以回车结束的非空字符串(少于80个字符)。
输出格式:
输出去重排序后的结果字符串。
输入样例:
ad2f3adjfeainzzzv
输出样例:
23adefijnvz
#include <stdio.h>
#include <string.h>
#define MAX 81
int main(){
char str[MAX], temp;
int i, j, len, minPos;
gets(str);
len = strlen(str);
for(i=0; i<len; i++){
//选择排序
minPos = i;
for(j=i+1; j<len; j++){
if(str[j]<str[minPos]){
minPos = j;
}
}
if(minPos!=i){
temp = str[i];
str[i] = str[minPos];
str[minPos] = temp;
}
}
printf("%c", str[0]);
for(i=1; i<len; i++){
if(str[i]!=str[i-1]){
printf("%c", str[i]);
}
}
return 0;
}
7-5 统计字符出现次数
本题要求编写程序,统计并输出某给定字符在给定字符串中出现的次数。
输入格式:
输入第一行给出一个以回车结束的字符串(少于80个字符);第二行输入一个字符。
输出格式:
在一行中输出给定字符在给定字符串中出现的次数。
输入样例:
programming is More fun!
m
输出样例:
2
#include<stdio.h>
int main(){
char str[80],ch,a;
int i=0,n=0,len;
gets(str);
len=strlen(str);
scanf("%c",&a);
for(i=0;i<len;i++){
if(a==str[i])n++;
}
printf("%d",n);
}
7-6 谷歌的招聘
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
#include <stdio.h>
#include <string.h>
int isPrime(int n)
{
int i;
if(n < 2) return 0;
if(n == 2) return 1;
if(n%2 == 0)return 0;
for(i=3; i*i<=n; i++)
if(n%i == 0)
return 0;
return 1;
}
int main()
{
int l,k,i;
long num=0;
char s[1001]="",res[10]="";
scanf("%d%d%s",&l,&k,s);
for(i=0; i<=l-k; i++)
{
strncpy(res,s+i,k);
sscanf(res,"%ld",&num);
if(isPrime(num))
{
puts(res);
return 0;
}
}
puts("404");
return 0;
}
7-7 凯撒密码
为了防止信息被别人轻易窃取,需要把电码明文通过加密方式变换成为密文。输入一个以回车符为结束标志的字符串(少于80个字符),再输入一个整数offset,用凯撒密码将其加密后输出。恺撒密码是一种简单的替换加密技术,将明文中的所有字母都在字母表上偏移offset位后被替换成密文,当offset大于零时,表示向后偏移;当offset小于零时,表示向前偏移。
输入格式:
输入第一行给出一个以回车结束的非空字符串(少于80个字符);第二行输入一个整数offset。
输出格式:
输出加密后的结果字符串。
输入样例1:
Hello Hangzhou
2
输出样例1:
Jgnnq Jcpibjqw
输入样例2:
a=x+y
-1
输出样例2:
z=w+x
#include<stdio.h>
#include<string.h>
int main(void)
{
char str[80];
int i,len,offset;
gets(str),len=strlen(str);
scanf("%d",&offset),offset=offset%26;
for(i=0;i<len;i++){
if('a'<=str[i]&&str[i]<='z')
{
if(0<=offset)str[i]=((str[i]-'a')+offset)%26+'a';
else str[i]=((str[i]-'a')+26+offset)%26+'a';
}
else if('A'<=str[i]&&str[i]<='Z')
{
if(0<=offset)str[i]=((str[i]-'A')+offset)%26+'A';
else str[i]=((str[i]-'A')+26+offset)%26+'A';
}
}
puts(str);
return 0;
}