个人水平有限,只是分享自己的想法与思路,希望大家多批评指正
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';
}