ZZUIL题解1161-1164

指针指向数组,利用循环便利的方法

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;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮皮皮皮皮皮卡乒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值