第九周作业记录
q(≧▽≦q)、
1.判断一个正整数是否为回文数
代码示例
/*编写一个函数来判断一个正整数是否为回文数,若是则返回1,否则返回0。所谓回文数是指各位数字左右对称的数,例如1221、3553等。该函数的原型为:
int ispalindrome(int n);
其中参数n是待判断的正整数,该函数有返回结果。
编写主函数,对上述函数进行测试,并找出1000∽n (包括1000和n,1000 ≤ n <10000)之间的所有回文数,按从小到大的次序在屏幕上显示输出,每个数之间用一个空格分隔,最后一个数后面没有空格。
*/
//方法一:整数变成字符串,反转字符串法
//整数变字符串,加头文件#include<stdlib.h>,用char itoa(int num,char* str,int radix),radix是进制(如2,10,6)
//字符串变整数,同样的头文件,int atoi(const char *nptr),nptr是待转的整数字符串
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int ispalindrome(int n)
{
char a[10],b[10];
itoa(n, a, 10); //整数转字符串
strcpy(b, a);
strrev(a); //反转字符串,记为b
if (strcmp(a, b) == 0) //若反转前后一样,则是回文数
return 1;
else return 0;
}
int main()
{
int num, space = 0;
scanf("%d", &num);
for (int i = 1000; i <= num; i++)
if (ispalindrome(i) == 1)
{
if (space != 0)printf(" ");
printf("%d", i);
space++;
}
return 0;
}
//方法二,针对本题只有四位回文数,函数可以设简单许多
/*#include<stdio.h>
int ispalindrome(int n);
int main()
{
int num, space = 0;
scanf("%d", &num);
for (int i = 1000; i <= num; i++)
if (ispalindrome(i) == 1)
{
if (space != 0)printf(" ");
printf("%d", i);
space++;
}
return 0;
}
int ispalindrome(int n) //注意本题只有四位数字,所以只需判断四位回文数
{
if (n / 1000 % 10 == n % 10 && n / 100 % 10 == n / 10 % 10)return 1;
else return 0;
}*/
2.统计其中各个英文字母的出现次数
代码示例
#include<stdio.h>
int main()
{
char string[200];
int count = 0,douhao=0;
gets (string);
for (char j = 'A'; j <= 'Z'; j++) //从A/a开始,确定一个字母,一个个数有几个
{
for (int i = 0; string[i] != '\0'; i++) // 在字符串里一个一个数确定的字母个数
if (string[i] == j || string[i] == j + 32) count++;
if (douhao != 0)printf(","); //输出
printf("%d", count);
count = 0;
douhao++;
}
return 0;
}
3.找到出现最多的字符
代码示例
/*编写程序,要求在一个字符串中查找连续出现次数最多的一个字符,并显示其所在的开始下标和次数。(如果出现最多的字符不止一个,输出最靠前的字符)
输入:一个字符串(字符个数不超过100,无空格)
输出:出现最多的字符,次数,开始下标(这三个值之间用空格分隔,末尾无空格)*/
#include<stdio.h>
int main()
{
char input[100], cm;
int count = 1, countm = 0, subm, sub = 0,i; //在设变量时,我们就把最大次数和下标初始化
gets(input);
cm = input[0]; //先把第一个字符当成出现最多的
for (i = 1; input[i] != '\0'; i++) //我们从第二个字符开始找
{
if (input[i] == input[i - 1]) count++; //如果这个数和上一个相同,则计数加一
if (input[i] != input[i - 1]) //如果不同,则把已经计的数和最大计数比较,将最大的储存,并初始化计数,和下标开始记录下一个字符
{
if (count > countm)
{
countm = count;
cm = input[i - 1];
subm = sub;
}
count = 1; //初始化,开始记录下一个字符的个数和下标
sub = i;
}
}
//注意,上述for循环没有把最后一个数进行比较,所以还得单独比较一次
if (count > countm)
{
countm = count;
subm = sub;
cm = input[i - 1];
}
printf("%c %d %d", cm, countm, subm);
return 0;
}
4.闰年计算
代码示例
/*闰年计算。程序输入一个正整数Y,以及另一个正整数N,以一个空格分隔。计算从Y年开始后的第N个闰年是哪一年(如果Y本身是闰年,则Y之后的第一个闰年是Y)。
输入格式:两个整数:Y和N。用空格分隔
输出个数:一个整数*/
#include<stdio.h>
int leapyear(int n) //判断是否是闰年,若是则返回1,不是则返回0
{
if(!(n%4)&&(n%100)||(!(n%400)) )return 1;
else return 0;
}
int main()
{
int Y, N, n=0;
scanf("%d %d", &Y, &N);
while (n < N) //一年一年判断就好了
{
if (leapyear(Y) == 1) n++;
Y++;
}
printf("%d", --Y); //注意,最后一个while循环结束时多加了一年,要减掉。这里注意Y--和--Y的区别
return 0;
}
/*i++,先返回i的值,再给i加一
++i,先给i加一,再返回i的值*/
5.按规则输出倒序字符串
代码示例
/*编写程序,按下列规则倒序输出子字符串。先输出最后的一个字符,再输出最后两个字符串,在再出后面三个字符..., 最后输出整个字符串。输入的字符串长度不超过100。
输入:一个字符串(无空格,字符个数不超过100)
输出:空格隔开的子字符串,用一个空格间隔。
输入输出样例:
student
t nt ent dent udent tudent student*/
//可以用两层循环来输出
#include<stdio.h>
#include<string.h>
int main()
{
char a[100];
int len, space = 0;
gets(a);
len = strlen(a);
/*用for循环输出*/
for (int i = len - 1; i >= 0; i--) //从后往前调整每一组的第一个字符下标
{
if (space != 0)printf(" "); //在输出下一组前输出空格
for (int n = i; n < len; n++) //输出每一组字符
printf("%c", a[n]);
space++;
}
return 0;
}
6.单词加密问题
代码示例
/*单词加密。输入一个字符串和一个非负整数k,对字符串中的每一个字母,用字母表中其后的第k个字母代替,不够k个时再从字母a循环计数。例如k=3是,a用d代替,A用D代替,x用a代替,y用b代替,保持大小写不变。字符串中的非字母字符不变。字符串的长度不超过100。
输入:一个字符串(无空格)和非负整数k,之间用空格分隔
输出:加密的字符串.
*/
#include<stdio.h>
char enc(char en, int kn) //设一个加密函数,将每个字母按规则加密
{
char enm;
if (((en >= 'A' && en <= 'Z') && en + kn <= 'Z') || ((en >= 'a' && en <= 'z') && en + kn <= 'z')) enm = en + kn; //如果字母不越界,加kn后输出
else if ((en >= 'A' && en <= 'Z') && en + kn > 'Z') enm = 'A' + kn - 'Z' + en - 1; //大写字母循环加密
else if ((en >= 'a' && en <= 'z') && en + kn > 'z') enm = 'a' + kn - 'z' + en - 1; //小写字母循环加密
else enm = en; //如果不是字母,则不变
return enm;
}//注,函数中的else与上面三个if并列,所以所以if必须加else,否则最后那个else就变成了和最邻近的if并列了
int main()
{
char str[100];
int k;
scanf("%s %d",str, &k);
for (int i = 0; str[i] != '\0'; i++)
str[i]= enc(str[i], k);
printf("%s", str);
return 0;
}
7.按规则去掉字符串末尾多余的星号
代码示例
/*编写程序,去掉字符串末尾多余的星号。输入带星号(*)的字符串和n,使字符串尾部的*号不得多于n个;若多于n个,则删除多余的*号;若少于或等于n个,则什么也不做,字符串中间和前面的*号不删除。字符串的长度不超过200。字符串中的星号是英文星号。
输入:一个字符串(无空格,字符串长度不超过100)和一个非负整数,中间用空格隔开。
输出:去掉多余*号的字符串。
样例:
***street**music**** 2
***street**music**
*/
#include<stdio.h>
#include<string.h>
int main()
{
char st[100];
int n, num=0,j;
scanf("%s %d", st, &n);
strrev(st); //反转字符串
for (int i = 0; st[i] == '*'; i++) num++; //数原来字符串末尾*数量
if (num <= n)strrev(st); //如果小于等于n,则不做操作,反转回来
if (num > n) //如果大于n,则用切割字符串的方法(把后面的字符往前移),修改*数量
{
for (j = 0; st[j + num-n] != '\0'; j++) //每一项都变成它后面num-n项的数
st[j] = st[j + num-n];
st[j] = '\0';
strrev(st); //反转回来
}
printf("%s", st);
return 0;
}
8.字符串中查找字符位置
代码示例
/*查找一个字符在字符串中出现的第一个位置并输出这个位置。位置从0开始。
输入输出格式:
输入:待查找的字符串(字符个数不超过100)和需要查找的字符,字符串中可能含有空格。(输入时,待查找的字符串与所需查找的字符用*号隔开)如:“待查找字符串*需要查找的字符”
输出:字符的位置(如有多个相同的字符,只查找第一个,如果没有输出-1。)
*/
#include<stdio.h>
#include<string.h>
int main()
{
char st[102], seek;
int judge = 0;
gets(st); //由于gets的输入结束是回车键,为了满足题目要求,我们只能把*<seek>也放到字符串里
strrev(st);
seek = st[0]; //找到待查数是什么
strrev(st);
for (int i = 0; st[i] != '*'; i++) //一个一个找是否有待查找字符,注意这里找到*为止。
{
if (st[i] == seek) //若找到,则跳出循环,输出位置
{
judge = 1;
printf("%d", i);
break;
}
}
if (judge == 0)printf("-1"); //若没找到,输出-1
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"
*/
#include<stdio.h>
int main()
{
int vote[4]={0}, x = 0;
while (x != -1)
{
scanf("%d", &x); //输入
switch (x) //判断
{
case 1:vote[0]++;
break;
case 2:vote[1]++;
break;
case 3:vote[2]++;
break;
case -1:break;
default:vote[3]++;
}
}
printf("%d %d %d %d", vote[0], vote[1], vote[2], vote[3]);
return 0;
}
10.除首尾字符外降序排序
代码示例
/*输入一个字符串(长度不超过200,不包含空格,至少有1个字符),除首尾字符外,将其余的字符按ascii码降序排列,然后输出。
*/
//用冒泡法
#include<stdio.h>
#include<string.h>
void Bubble(char* s, int n) //类似冒泡排序的排序函数
{
for(int i = 1; i < n - 2; i++)
for (int j = n - 2; j > i; j--)
if(s[j]>s[j-1])
{
char temp = s[j];
s[j] = s[j - 1];
s[j - 1] = temp;
}
}
int main()
{
char st[201];
int len;
scanf("%s", st);
len = strlen(st);
Bubble(st,len);
printf("%s", st);
return 0;
}
总结
注意一些语法上的小问题,譬如if-else结构,还有冒泡算法;