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;
}