for( ; *sp!='\0'; sp++){
printf("%d ", *sp);
}
1161: 字符串长度(指针专题)
1162: 循环移动(指针专题)
1163: 亲和串(字符串)
1164: 字符串加密
1161: 字符串长度(指针专题)
题目描述编写一函数len,求一个字符串的长度,注意该长度不计空格。要求用字符指针实现。在主函数中输入字符串,调用该len函数后输出其长度。
int len(char *sp)
{
//实现sp所指串的长度,不计空格。
}
输入
输入一个字符串,以回车结束,长度不超过100。
输出
输出一个整数,单独占一行。
样例输入 Copy
What day is today?
样例输出 Copy
15
来源/分类
AC代码:
#include<stdio.h>
#include<string.h>
int len1(char *sp)
{
//实现sp所指串的长度,不计空格。
int l=0;
for( ; *sp!='\0'; sp++){
if(*sp!=' ')
l++;
}
return l;
}
int main(){
char str[101];
int i;
gets(str);
int l=len1(str);
printf("%d\n", l);
return 0;
}
1162: 循环移动(指针专题)
题目描述有n个整数,使前面各数顺序向后移动k个位置,移出的数再从开头移入。输出移动后的数组元素。
题目没有告诉你n的范围,希望你读入n之后用malloc()函数动态申请内存空间,不要提前定义数组的大小。不要偷懒哦。
另外要求定义并使用函数ringShift()
void ringShift(int *a, int n, int k)
{
//循环移动后的数值仍然存入数组a中
}
输入
输入分3行,第一行是一个整数n,第二行是n个整数,用空格隔开。第三行是一个整数k。
输出
输出n个整数,由空格隔开。输出占一行。
样例输入 Copy
6
1 2 3 4 5 6
2
样例输出 Copy
5 6 1 2 3 4
来源/分类
AC代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void ringShift(int *a, int n, int k)
{
//循环移动后的数值仍然存入数组a中
int *b=NULL,i;
b=(int *)malloc(n*sizeof(int));
for(i=0; i<n; i++){
if(i+k<n)
b[i+k]=a[i];
else
b[i+k-n]=a[i];
}
for(i=0; i<n; i++)
printf("%d ", b[i]);
}
int main(){
int i,n,k;
scanf("%d", &n);
int *a=NULL;
a=(int *)malloc(n*sizeof(int));
for(i=0; i<n; i++)
scanf("%d", &a[i]);
scanf("%d", &k);
ringShift(a,n,k);
return 0;
}
1163: 亲和串(字符串)
题目描述判断亲和串。亲和串的定义是这样的:给定两个字符串s1和s2,如果能通过s1循环移位,使s2包含在s1中,那么我们就说s2 是s1的亲和串。
输入
本题有多组测试数据,每组数据的第一行包含输入字符串s1,第二行包含输入字符串s2,s1与s2的长度均小于100000。
输出
如果s2是s1的亲和串,则输出"yes",反之,输出"no"。每组测试的输出占一行。
样例输入 Copy
AABCD
CDAA
ASD
ASDF
ab
aba
样例输出 Copy
yes
no
no
来源/分类
AC代码:
#include<stdio.h>
#include<string.h>
char s1[200002],s2[100002];
int main()
{
int i,j,len1,len2,flag;
while(scanf("%s %s", s1,s2)!=EOF)
{
len1=strlen(s1);
len2=strlen(s2);
if(len1<len2)
printf("no\n");
else
{
for(i=0; i<len1; i++)
s1[i+len1]=s1[i];
if(strstr(s1,s2))
printf("yes\n");
else
printf("no\n");
}
}
return 0;
}
1164: 字符串加密
题目描述输入一串字符(长度不超过100)和一个正整数k,将其中的英文字母加密并输出加密后的字符串,非英文字母不变。加密思想:将每个字母c加一个序数k,即用它后面的第k个字母代替,变换公式:c=c+k。如果字母为z,则后一个字母是a,也就是字母字符形成一个圆。
输入
输入第一行是若干字符,以回车结束。输入第二行是一个整数k,k是int范围内的正整数;
输出
输出加密后的字符串。
样例输入 Copy
12kjsdZjk
280
样例输出 Copy
12edmxTde
提示
注意,即使通过模运算把k控制在小于26的范围内,依然要考虑char类型溢出的问题,如’z’ + 10也会超出char的表示范围。但庆幸的是,我们只需要考虑向内存存储时的char类型溢出,而在计算过程中不会溢出,因为计算过程中char会被提升为int类型。
来源/分类
AC代码:
#include<stdio.h>
char s1[200002];
int main()
{
int i,j,k,t,a;
gets(s1);
scanf("%d", &k);
k=k%26;
for(i=0; s1[i]!='\0'; i++)
{
if((s1[i]>='a'&&s1[i]<='z')||(s1[i]>='A'&&s1[i]<='Z'))
{
if(s1[i]>='a'&&s1[i]<='z'&&(s1[i]+k)<='z')
s1[i]+=k;
else if(s1[i]>='A'&&s1[i]<='Z'&&(s1[i]+k)<='Z')
s1[i]+=k;
else
s1[i]=s1[i]+k-26;
}
}
puts(s1);
return 0;
}