XJTU大计基例题分享(第10周)

个人水平有限,只是分享自己的想法与思路,希望大家多批评指正

1.

编写一个函数来判断一个正整数是否为回文数,若是则返回1,否则返回0。所谓回文数是指各位数字左右对称的数,例如1221、3553等。该函数的原型为: 

int ispalindrome(int n);  

其中参数n是待判断的正整数,该函数有返回结果。

使用该函数找出1000∽n (包括1000和n,1000 ≤ n <10000)之间的所有回文数,按从小到大的次序在屏幕上显示输出,每个数之间用一个空格分隔,最后一个数后面没有空格。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int n;
	do {
		scanf("%d", &n);
	} while (n < 1000 || n >= 10000);
	int a[4] = { 0 }; int t = 0;
	for (int i = 1000; i <= n; i++)
	{
		a[0] = i % 10;//按位储存
		a[1] = (i / 10) % 10;
		a[2] = (i / 100) % 10;
		a[3] = i / 1000;
		if (a[3] == a[0] && a[1] == a[2] && t == 0)//只是输出格式是否有空格的区别
		{
			printf("%d", i);
			t++;
		}
		else if (a[3] == a[0] && a[1] == a[2] && t != 0)
		{
			printf(" %d", i);
			t++;
		}

2.

输入一个可能带空格字符的字符串(长度不超过100),统计其中各个英文字母的出现次数,不区分大小写。输出字母a~z的出现次数,数据间以英文逗号分隔。非英文字母不统计。

   输入:可能带空格的字符串。

   输出:26个整数,以英文逗号分隔。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
//最笨的办法
int main()
{
	char ch[100];
	int q, w, e, r, t, y, u, i, o, p, a, s, d, f, g, h, j, k, l, z, x, c, v, b, n, m;
	gets(ch);
	q = w = e = r = t = y = u = i = o = p = a = s = d = f = g = h = j = k = l = z = x = c = v = b = n = m = 0;
	for (int I = 0; I < 100; I++)
	{
		switch (ch[I])
		{
		case 'q':q++; break;
		case 'w':w++; break;
		case 'e':e++; break;
		case'r':r++; break;
		case't':t++; break;
		case 'y':y++; break;
		case 'u':u++; break;
		case 'i':i++; break;
		case 'o':o++; break;
		case 'p':p++; break;
		case 'a':a++; break;
		case 's':s++; break;
		case 'd':d++; break;
		case 'f':f++; break;
		case 'g':g++; break;
		case 'h':h++; break;
		case 'j':j++; break;
		case 'k':k++; break;
		case 'l':l++; break;
		case 'm':m++; break;
		case 'n':n++; break;
		case 'b':b++; break;
		case 'v':v++; break;
		case 'c':c++; break;
		case 'x':x++; break;
		case 'z':z++; break;
            		case 'Q':q++; break;
		case 'W':w++; break;
		case 'E':e++; break;
		case'R':r++; break;
		case'T':t++; break;
		case 'Y':y++; break;
		case 'U':u++; break;
		case 'I':i++; break;
		case 'O':o++; break;
		case 'P':p++; break;
		case 'A':a++; break;
		case 'S':s++; break;
		case 'D':d++; break;
		case 'F':f++; break;
		case 'G':g++; break;
		case 'H':h++; break;
		case 'J':j++; break;
		case 'K':k++; break;
		case 'L':l++; break;
		case 'M':m++; break;
		case 'N':n++; break;
		case 'B':b++; break;
		case 'V':v++; break;
		case 'C':c++; break;
		case 'X':x++; break;
		case 'Z':z++; break;
		}
	}
	printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n", a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z);

	return 0;
}

当然还有简单的办法

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<string.h>

int main()
{
	char inputStr[200] = {0};
	gets_s(inputStr, 200);
	_strupr(inputStr); //转换为大写,前面下划线不要忘记
	int count[26] = {0};

	int i = 0;
	while (inputStr[i])
	{
		if (inputStr[i] >= 'A' && inputStr[i] <= 'Z')
		{
			count[inputStr[i] - 'A']++;
		}
		i++;
	}

	printf("%d", count[0]);
	for (i = 1; i < 26; i++)
	{
		printf(",%d", count[i]);
	}
	return 0;
}

3.

编写程序,要求在一个字符串中查找连续出现次数最多的一个字符,并显示其所在的开始下标和次数。(如果出现最多的字符不止一个,输出最靠前的字符)

输入:一个字符串(字符个数不超过100,无空格)

输出:出现最多的字符,次数,开

始索引(这三个值之间用空格分隔,末尾无空格)4

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
//for循环一个一个字符尝试
//定义新的函数来找每个字母出现次数
//比较次数跟序数

int main()
{
	char words[100], b[100][3], k = 1, pos = 0;
	gets(words);
	for (int i = 0; words[i] != '\0'; i++)
	{
		if (words[i] == words[i + 1])
		{
			k++;
			if (k == 2)
				pos = i;//开始下标
		}
		else
		{
			b[i][0] = words[i];//存放字母
			b[i][1] = k;//存放次数
			b[i][2] = pos;//存放位置
			k = 1;
		}
	}
	int max = b[0][1], p1 = 0;//找出最高次数
	for (int j = 0; words[j] != '\0'; j++)
	{
		if (max < b[j][1])
		{
			max = b[j][1];
			p1 = j;
		}
	}
	printf("%c %d %d", b[p1][0], max, b[p1][2] );
	return 0;
}

4.

闰年计算。程序输入一个正整数Y,以及另一个正整数N,以一个空格分隔。计算从Y年开始后的第N个闰年是哪一年(如果Y本身是闰年,则Y之后的第一个闰年是Y,闰年不超过6240年)。

输入格式:两个整数:Y和N。用空格分隔

输出个数:一个整数

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int y, n;
	scanf("%d %d", &y, &n);
	int run, t=0;
	for (y; y + 6240; y++)
	{
		run = y;
		if (run % 4 == 0 && run % 100 != 0 || run % 400 == 0)
			t++;//统计经过闰年数量
		if (t == n)
		{
			printf("%d\n", run);
			break;
		}
	}
	return 0;
}

 5.

编写程序,按下列规则倒序输出子字符串。先输出最后的一个字符,再输出最后两个字符串,在再出后面三个字符..., 最后输出整个字符串。输入的字符串长度不超过100。

输入:一个字符串(无空格,字符个数不超过100)

输出:空格隔开的子字符串,用一个空格间隔。

输入输出样例:

student

t nt ent dent udent tudent student

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

int main()
{
	char a[100];
	gets(a);
	int len = strlen(a);
	int i = 0;
	for (i; i<len ; i++)//倒序输出
	{
		if (i == 0)
			printf("%c", a[len-1]);
		else {
			printf(" ");
			for (int t = len - 1 - i; t < len; t++)
			{
				printf("%c", a[t]);
			}
		}
	}
	return 0;
}

6.

单词加密。输入一个字符串和一个非负整数k,对字符串中的每一个字母,用字母表中其后的第k个字母代替,不够k个时再从字母a循环计数。例如k=3是,a用d代替,A用D代替,x用a代替,y用b代替,保持大小写不变。字符串中的非字母字符不变。字符串的长度不超过100。

    输入:一个字符串(无空格)和非负整数k,之间用空格分隔

    输出:加密的字符串。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

char enc(char en, int k)//加密函数
{
	if ((en >= 'a' && en <= 'z' && en + k <= 'z') || en >= 'A' && en <= 'Z' && en + k <= 'Z')
		en = en + k;
	else if (en >= 'a' && en <= 'z' && en + k > 'z')
		en = en + k - 'z' + 'a'-1;//小写字母循环加密
	else if (en >= 'A' && en <= 'Z' && en + k > 'Z')
		en = en + k - 'Z' + 'A'-1;//大写字母循环加密
	return en;
}

int main()
{
	char a[100];
	int k;
	scanf("%s %d", a, &k);
	while (k >= 26)//26为一个周期
	{
		k = k - 26;
	}
	for (int i = 0; a[i] != '\0'; i++)
	{
		a[i] = enc(a[i], k);
	}
	printf("%s\n", a);
	return 0;
}

7.

编写程序,去掉字符串末尾多余的星号。输入带星号(*)的字符串和n,使字符串尾部的*号不得多于n个;若多于n个,则删除多余的*号;若少于或等于n个,则什么也不做,字符串中间和前面的*号不删除。字符串的长度不超过200。字符串中的星号是英文星号。 

    输入:一个字符串(无空格,字符串长度不超过100)和一个非负整数,中间用空格隔开。

    输出:去掉多余*号的字符串。

样例:

***street**music****  2

***street**music**

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

int main()
{
	char a[200];
	int n;
	scanf("%s %d", a, &n);
	int len = strlen(a);
	int t = 0;//计数变量,存放末尾‘*’个数
	for (int i = len - 1; a[i] == '*'; i--)//循环求末尾*个数
	{
		if (a[i] == '*')
			t++;
	}
	if (t <= n)
		printf("%s\n", a);
	else//删除多余*
	{
		for (int i = len + n - t; i < len; i++)
		{
			a[i] = '\0';
		}
		printf("%s\n", a);
	}
	return 0;
}

8.

查找一个字符在字符串中出现的第一个位置并输出这个位置。位置从0开始。

输入输出格式:

输入:待查找的字符串(字符个数不超过100)和需要查找的字符,字符串中可能含有空格。(输入时,待查找的字符串与所需查找的字符用*号隔开)如:“待查找字符串*需要查找的字符”

输出:字符的位置(如有多个相同的字符,只查找第一个,如果没有输出-1。)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

int main()
{
	char word[100], letter;
	gets(word);
	int len = strlen(word);
	letter = word[len - 1];
	word[len - 2] = word[len - 1] = '\0';//删除最后两位
	int pos = -1;
	for (int i = 0; i < len - 2; i++)
	{
		if (word[i] == letter)
		{
			pos = i;
			break;
		}
	}

	printf("%d\n", pos);
	return 0;
}

9.

统计选票。三个候选人分别是Li、Zhang和Wang, Li 的代号是1;Zhang的代号是2; Wang的代号是3。依次输入代表得票人代号的数字(即投票),直到输入-1则投票结束。然后统计每个人的得票数和废票数。不是-1,1,2,3的数字为废票。

输入:若干整数,最后一个数是-1。(输入的每个数之间有空格)

输出:四个整数,以空格隔开,代表三个人的Li、Zhang、Wang的得票数以及废票数。

输出格式:"%d %d %d %d\n"

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int data[100], i = 0;
	do
	{
		scanf("%d", &data[i]);
		i++;
	} while (data[i - 1] != -1);
	int Li, Zhang, Wang, waste;
	Li = Zhang = Wang = waste = 0;
	for (int t = 0; t < i; t++)
	{
		if (data[t] == 1)
		{
			Li++;
		}
		else if (data[t] == 2)
		{
			Zhang++;
		}
		else if (data[t] == 3)
		{
			Wang++;
		}
		else
		{
			waste++;
		}

	}
	waste--;//将-1排除
	printf("%d %d %d %d\n", Li, Zhang, Wang, waste);
	return 0;
}

也可以不设置数组,直接在输入的时候判定

10.输入一个字符串(长度不超过200,不包含空格,至少有1个字符),除首尾字符外,将其余的字符按ascii码降序排列,然后输出。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
char a[200];
void fun(char max, int len, int i, int pos);

int main()
{
	
	gets(a);
	int len = strlen(a);
	printf("%c", a[0]);//首字母输出
	a[0] = 'a';//将首字母变为ascii码最小的,不影响降序排列
	char last;
	last = a[len - 1];
	a[len - 1] = 'a';
	char max = a[0]; int pos = 0;
	for (int i = 1; i < len-1; i++)
	{
		fun(max,len,i,pos);
		max = a[0];
	}
	printf("%c\n", last);//尾字母输出
	return 0;
}

void fun(char max,int len,int i,int pos)//降序输出
{
	i = 0;
	for (i; i < len; i++)
	{
		if (max < a[i])
		{
			max = a[i];
			pos = i;
		}

	}printf("%c", max);
	a[pos] = 'a';
}

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值