编程51-60

文章讲述了C语言中处理字符串的各种操作,包括删除多余空格、格式化输出、字符顺序颠倒、去除重复字符、查找特定字符串、字符串出现次数统计、IP地址转换、孪生素数计算以及点滴计时等技术应用。
摘要由CSDN通过智能技术生成

51.输出删掉空格后的字符串

编写函数, 去掉一个字符串中除头部和尾部空格外的所有空格 ,并编写主函数进行调用测试。
输入: 占一行(注:输入的字符串长度不会超过80
输出: 占一行
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <string.h>
int find_begin(char* str){
	int i = 0;
	for (; str[i] == ' '; i++);
	return i;
}
int find_end(char* str){
	int i = strlen(str) - 1;
	for (; str[i] == ' '; i--);
	return i;
}
int main(){
	char str[100] = { 0 };
	gets(str);
	int begin = find_begin(str), end = find_end(str);
	for (int i = 0; i < strlen(str); i++){
		if (i < begin || i > end){
			printf(" ");
		}
		else if (str[i] != ' '){
			printf("%c", str[i]);
		}
	}
	return 0;
}

52.正整数的三位分节格式

写出正整数的三位分节格式。如,当用户输入 82668634 时,程序应该输出 82,668,634
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
	char a[100];
	scanf("%s", a);
	int b = strlen(a) % 3;
	for (int i = 0; i < strlen(a); i++) {
		printf("%c", a[i]);
		if ((i + 1 - b) % 3 == 0 && i != strlen(a) - 1) {
			printf(",");
		}
	}
	return 0;
}

53.颠倒特定字符

将字符串中 奇数下标(从 0 开始 ) 的字符顺序颠倒。如字符 12345678 ,结果为 18365472
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
	char a[100];
	scanf("%s", a);
	int len = strlen(a);           //0123  01234
	for (int i = 0; i < len; i++) {//1234  12345
		if (len % 2) {//奇数
			if (i % 2) {
				printf("%c", a[len - 1 - i]);
			}
			else printf("%c", a[i]);
		}
		else {
			if (i % 2) {
				printf("%c", a[len - i]);
			}
			else printf("%c", a[i]);
		}
	}
	return 0;
}
输出代码改进:利用k
#include<string.h>
int main() {
	char a[100];
	scanf("%s", a);
	int len = strlen(a);  
	int k = len % 2;
	for (int i = 0; i < len; i++) {//1234  12345
		if (i % 2) {
			printf("%c", a[len - k - i]);
		}
		else printf("%c", a[i]);
	}
	return 0;
}

54.删去重复字符

输入一个长度不超过 100 的字符串,删除串中的重复字符。
小知识:见到break直接跳出循环了,没有执行这个子循环下面的程序。如:
for (int i = 0; i < strlen(a); i++) {
	int flag = 1;
	for (int j = 0; j < i; j++) {
		if (a[j] == a[i]) {
			break;//见到break直接跳出循环了,没有执行这个子循环下面的程序flag=0;
			flag = 0;
		}
	}
}

方法一:检索前面字符是否重复

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
	char a[100];
	gets(a);
	for (int i = 0; i < strlen(a); i++) {
		int flag = 1;
		for (int j = 0; j < i; j++) {
			if (a[j] == a[i]) {
				flag = 0;
				break;//见到break直接跳出循环了,没有执行这个子循环下面的程序
			}
		}
		if (flag) {
			printf("%c", a[i]);//易错:在这里用 地址a+i 是不对(没有意义)的
		}
	}
	return 0;
}

方法二:利用ASCII编码范围为0~255

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main(){
	char str[100] = { '\0' };
	gets(str);
	//由于ASCII编码范围为0~255,设置变量flag[256]={0}
	//flag[i]=0意为编码为i的字符未出现过,1为出现过
	int len = strlen(str), flag[256] = { 0 };
	for (int i = 0; i < len; i++) {
		//str[i]没出现过,输出str[i]
		//将flag[str[i]]更改为1,这样之后再次遇到该字符时不输出
		!flag[str[i]] ? printf("%c", str[i]), flag[str[i]] = 1 : 0;
	}
	return 0;
}

55.删去特定字符串

注意:一个关于输出的小问题

连续输入:abcd"回车" 时,将 abcd 付给 a[] , 将 "回车" 赋给 x

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
	char a[100];
	char x;
	scanf("%s", a);
	scanf("\n");//如果不把"回车"吃掉,会将其赋给 字符变量x
	scanf("%c", &x);
	int flag = 1;
	for (int i = 0; i < strlen(a); i++) {
		if (x == a[i]) {
			flag = 0;
		}
	}
	if (flag) {
		printf("NotFound");
	}
	else {
		for (int i = 0; i < strlen(a); i++) {
			if (x != a[i]) {
				printf("%c", a[i]);
			}
		}
	}
	return 0;
}

56.统计字符串出现次数

输入两个字符串,统计第 2 个字符串( 至少含 2 字符 )在第 1 个字符串中出现的次数。没有出现,
次数为 0.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
	char a[100];
	char x[100];
	scanf("%s %s", a, x);
	int count = 0;
	for (int i = 0; i < strlen(a); i++) {
		int flag = 1;
		for (int j = 0; j < strlen(x); j++) {
			if ((i + j) >= strlen(a) || a[i + j] != x[j]) {
				flag = 0;
				break;
			}
		}
		if (flag) {
			count++;
		}
	}
	printf("%d", count);
	return 0;
}

57.去掉首尾星号

输入字符串,字符串中有若干星号 *, 去掉字符串首尾的星号( * ), 保留中间的星号 。 字符串长度
不大于 200
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
	char a[200];
	scanf("%s", a);
	int begin = 0, end = strlen(a) - 1;
	for (; a[begin] == '*' && begin < strlen(a); begin++);
	for (; a[end] == '*' && end >= 0; end--);
	if (end < begin) {
		printf("%s", a);
	}
	else {
		for (int i = begin; i <= end; i++) {
			printf("%c", *(a + i));
		}
	}
	return 0;
}

58.孪生素数

所谓孪生素数是指间隔为 2 相邻素数 ,例如最小的孪生素数是 3 5,5 7 也是孪生数。
编写程序,求给定区间 [m,n] 中的孪生数的数量。例如 [2,10] 中的孪生数有 (3,5) (5,7) ,则 [2,10]
孪生数的数量为 2.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int IsPrime(int a) {
	for (int i = 2; i < sqrt(a) + 1; i++) {
		if (a % i == 0) {
			return 0;
		}
	}
	return 1;
}
int main() {
	int m, n;
	scanf("%d%d", &m, &n);
	int count = 0;
	for (int i = m; i + 2 < n + 1; i++) {
		if (IsPrime(i) && IsPrime(i + 2)) {
			count++;
		}
	}
	printf("%d", count);
	return 0;
}

59.输出分点IP地址

从键盘输入一个 32 位的二进制形式的 IP 地址,将其转换为点分十进制的表示,如果输入的字符串
中含有 1 0 以外的字符,则输出 该字符串不是正确的 IP 地址
输入格式:
0 1 二进制序列,不会超过 32 位,位数不足时 程序自动在前面补0。

C语言各数据类型大小

注意:
这里如果用int类型的话,会超出其范围。
在VS中,int和long int都是32字节;long long int是64字节。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
void Supplepos(char x[]) {
	int len = strlen(x);
	if (len < 32) {
		int l = 32 - len;
		for (int i = 31; i > l - 1; i--) {
			x[i] = x[i - l];
		}
		for (int i = 0; i < l; i++) {
			x[i] = '0';
		}
	}
}
int Trans(char* x) {//向后走八位
	int sum = 0; int i = 0;
	for (int j = 7; j >= 0; j--) {
		sum += (*(x+i) == '1') ? pow(2, j) : 0;
		i++;
	}
	return sum;
}
int main() {
	char a[33];
	scanf("%s", a);
	Supplepos(a);
	for (int i = 0; i < 32; i += 8) {
		(i == 0)? printf("%d", Trans(a)): printf(".%d", Trans(a + i));
	}
	return 0;
}
//查看int类型变量的字节数
/*#include<stdio.h>
int main(void)
{
	printf("int:bytes %d;bit %d", sizeof(long long int), sizeof(long long int) * 8);
	return 0;
}*/

60.医院大点滴

在医院打点滴(吊针)的时候,如果滴起来有规律,先是滴一滴,停一下;然后滴二滴,停一
下;再滴三滴,停一下 ... ,现在有一个问题:这瓶盐水一共有 v 毫升,每一滴是 d 毫升,每一滴的
速度是一秒( 假设最后一滴不到 d 毫升,则花费的时间也算一秒 ),停一下的时间也是一秒,这
瓶水什么时候能滴完呢?( 0 < d < v <6000)
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <math.h>
int main(){
	double d, v;
	scanf("%lf %lf", &d, &v);
	int drop = ceil(v / d), time = 0;
	//ceil为向上取整的函数,使用头文件<math.h>
	for (int i = 1; drop != 0; i++){
		if (drop > i){
				time += i + 1;
			drop -= i;
		}
		else{
			time += drop;
			drop = 0;
		}
	}
	printf("%d", time);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值