第八周作业记录
记录一下第八周作业。
1.统计整数个数
代码示例
/*输入若干个整数,其值在0至4的范围内,用-1作为输入结束的标志,统计每个整数的个数。
输入:[0,4]内的整数组成的序列,最后是-1,用空格隔开。
输出:0,1,2,3,4的统计个数,用一个空格隔开。
样例:
3 3 3 2 2 1 0 3 4 4 -1
1 1 2 4 2
*/
//边输边算,输入一连串数,代码可以写成一个一个输入,中间的空格相当于回车了
#include<stdio.h>
int main()
{
int a[5] = {0}, x=0,space=0; //用这个数组记录统计个数,注意要多一位存'\0';后边要直接对数组中数据直接操作,所以初始化数组
while (x != -1)
{
scanf("%d", &x);
if (x >= 0 && x <= 4)
{
a[x]++;
}
}
for (int i = 0; i <=4;i++)
{
if (space != 0)printf(" "); //printf输出的不要写错
printf("%d", a[i]);
space++;
}
return 0;
}
2.将一个大于4的正整数分解为连续的正整数之和
代码示例
/*将一个大于4的正整数分解为连续的正整数之和,请显示全部分解结果。
如数字15,可以分解为:
15=1+2+3+4+5
15=4+5+6
15=7+8*/
/*分析,因为由等差数列s=n(2a1+n-1)/2,所以只需要确定输入一个数s后,能够保证n和a1存在且为整数*/
#include<stdio.h>
int main()
{
int num;
scanf("%d", &num);
for (int n =num; n >= 2; n--) //其实也可以是for (int n = 2; 2 * num / n - n + 1 > 0; n++),但本体样例输出顺序不能反着来,所以只好修改,这个num/2是随意定的,只是刚好过样例而已
{
if (2 * num % n == 0 && (2 * num / n - n + 1) % 2 == 0) //保证n和a1存在且为整数,但这并不能保证a1大于0
{
int a1, plus = 0;
a1 = (2 * num / n - n + 1) / 2;
if (a1 <= 0)continue; //保证a1大于0
//输出满足条件的结果
printf("%d=", num);
for (int i = 1; i <= n; i++)
{
if (plus != 0)printf("+");
printf("%d", a1 + i - 1);
plus++;
}
printf("\n");
}
else continue; //不满足条件,n为正整数,a1为整数,进行下一循环
}
return 0;
}
/* 高级写法
#include <stdio.h>
#include <math.h>
int main() {
int a;
scanf("%d", &a);
for (int n = a / 2 + 2, m = 0; n >= 2 ; n--) {//n是几个数相加,m是有几种可能的组合
for (int i = 1; i <= a / n+1; i++) {
int b = (n*(i + i + n - 1) / 2 == a) ? 0 : -1;//判断,等差数列和
for (; b >= 0 && b < n; b++) {//输出等式,最后不能输出换行!
(b == 0) ? ((m == 0) ? printf("%d=%d", a, i), m = 1 : printf("\n%d=%d", a, i)) : printf("+%d", i + b);
}
}
}
return 0;
}
*/
3.求a+aa+aaa+aaaa+…+aa…a
代码示例
/*求a+aa+aaa+aaaa+…+aa...a(n个),其中a为1~9之间的整数。
例如:当a = 1, n = 3时,求1+11+111之和为123;
输入:组成序列的数字a和求和项的数量n
输出:算式和结果。
*/
//我们设一个函数求它
#include<stdio.h>
#include<math.h>
int main()
{
int a,n,sum = 0, at,plus=0;
scanf("%d %d", &a, &n);
at = a;
for (int i = 1; i <= n;i++) //注意判断这里的<=n
{
if (plus != 0)printf("+");
printf("%d", at);
sum = at + sum;
at = at + a * (int)pow(10, i);
plus++;
}
printf("=%d", sum);
return 0;
}
4.水仙花数
代码示例
/*“水仙花数”是指一个三位正整数,其各位数字的立方和刚好等于该数本身,如:153=1^3+5^3+3^3 (其中^表示乘方,5^3表示5的3次方),则153是一个“水仙花数”。
输入n, m,100<=n,m<1000, 求出[n,m]之间的水仙花数。若该区间没有水仙花数,输出-1.
输入:n,m,用空格隔开。
输出:若干水仙花数,用空格隔开。*/
//算法就是一个一个地判断是不是水仙花数,本题判断的数是100到999,不需要确定数字位数
#include<stdio.h>
int main()
{
int n,m,space=0;
scanf("%d %d",&n,&m);
for(int i=n;i<m;i++)
{
if((i/100)*(i/100)*(i/100)+(i/10%10)*(i/10%10)*(i/10%10)+(i%10)*(i%10)*(i%10)==i)
{if(space!=0)printf(" ");
printf("%d",i);
space++;
}
}
if(space==0)printf("-1");
return 0;
}
/*用函数做一下
#include<stdio.h>
int judge(int num)
{
int a, b, c;
a = (num / 100) * (num / 100)* (num / 100);
b = (num / 10 % 10) * (num / 10 % 10) * (num / 10 % 10);
c = (num % 10) * (num % 10) * (num % 10);
if (a + b + c ==num)return 1; //不要犯糊涂写成a*a*a,b*b*b,c*c*c
else return 0;
}
int main()
{
int n, m,space=0;
scanf("%d %d", &n, &m);
for (int i = n; i < m; i++)
{
if (judge(i) == 1)
{
if (space != 0)printf(" ");
printf("%d", i);
space++;
}
}
if (space == 0)printf("-1"); //借助space来判断有无水仙花数
return 0;
}
*/
5.求一组数中的最大值并统计出现次数
代码示例
/*求一组数中的最大值,然后统计该最大值在这组数中出现的次数。
输入:元素个数n和n个整数。n<200。(要先输入个数n,然后再输入n个数)
输出:最大值及出现的次数。数据间以一个逗号隔开。*/
//我们的代码写法看起来是输一个判断一个,但其实也可以解决输一系列,再判断,因为scanf遇到空格就停止读入
#include<stdio.h>
int main()
{
int n, count, x, max;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d", &x);
//先把第一个数记为最大值,并记录个数为1
if (i == 1)
{
max = x;
count = 1;
continue; //为了防止它进入第三个if,我们加continue
}
//输入后续数字,如果大于已经记录的最大值,则最大值重记,并记录个数重新为1
if (x > max)
{
max = x;
count = 1;
continue; //防止它进第三个if
}
//第二个数字起,如果等于最大值,记录个数加一
if (x == max)count++;
}
printf("%d,%d", max, count);
return 0;
}
/*方法二,先找最大的,再数他的个数(扫描法)*/
6.按字典顺序寻找最大和最小单词
代码示例
/*定义包含5个英文单词的字符数组(即二维字符数组),键盘输入5个单词,按字典顺序寻找最大和最小单词并输出。
输入:5个单词
输出:最大和最小单词(按字典序)
如:
one two three four five
max:two min:five(注:max和min后是英文冒号)*/
#include<stdio.h>
#include<string.h>
int main()
{
char input[5][15],max[15],min[15];
for (int i = 0; i <= 4; i++)
{
scanf("%s", input[i]);
if (i == 0) //先将max,min定为输入的第一个单词
{
strcpy(max, input[0]);
strcpy(min, input[0]);
continue;
}
//从输入的第二个单词开始,每一个都和max,min比较
if (strcmp(max, input[i]) < 0)strcpy(max, input[i]);
if (strcmp(min, input[i]) > 0)strcpy(min, input[i]);
}
printf("max:%s min:%s", max, min);
return 0;
}
7.将字符串首部的*号全部移到字符串的尾部
代码示例
/*将字符串首部的*号全部移到字符串的尾部,中间若有*号,保持中间的*号不动。字符串长度不超过200.
样例:
***street*****music***
street*****music******
*/
//这里我们用到strncat(s1,s2,n)
#include<stdio.h>
#include<string.h>
int main()
{
char string[200];
int x = 0,i;
scanf("%s", string);
while (string[x] == '*')x++; //计算字符串前的*数
strncat(string, string, x); //将字符串前的*拼接到后面去
for ( i = 0; string[i + x] != '\0'; i++)string[i] = string[i + x]; //通过全体向前移动x位,删除前面的*(注意这里的i在循环外还要用到,所以在前面就定义了)
string[i] ='\0'; //将多余的字符去掉,注意这里string下标是i,因为在进行了最后一次for循环后,i已经加1变成了需要终止符的那一位
printf("%s", string);
return 0;
}
8.该整数分解为1和各个质因子的相乘
代码示例
/*从键盘输入一个正整数(>1),然后将该整数分解为1和各个质因子的相乘,如果输入的整数本身就是质数,则应分解为1和该数本身相乘。
如:
18
1*2*3*3
*/
#include<stdio.h>
int main()
{
int num;
scanf("%d", &num);
printf("1");
for (int i = 2; i <= num; i++)
{
if (num % i==0) //判断是否有因子i,如果有,立刻跳出循环,判断是否还能被该因子整除
{
printf("*%d", i);
num /= i;
i--;
}
//不能被i整除后,判断下一个i+1;(注,不用再写i++了)
}
return 0;
}
9.输出分数序列前n项之和
代码示例
/*有一分数序列如下: 2/1, 3/2, 5/3, 8/5, 13/8, 21/13, … 即后一项的分母为前一项的分子,后项的分子为前一项分子与分母之和,求其前n项之和。
输入:项数n(整数)
输出:前n项之和(实数,注:保留4位小数)
*/
//找不到关于n的通项,就按定义规律的算
#include<stdio.h>
int main()
{
float x0 = 1, x1 = 2, sum = 0;
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
sum = x1 / x0 + sum;
x1 += x0;
x0 = x1 - x0;
}
printf("%.4f", sum);
return 0;
}
10.月份天数计算
代码示例
/*输入公元年份和月份,输出该月份的天数。
输入:年,月(逗号分隔)
输出:天数
*/
//闰年是能被4整除而不能被100整除,或能被400整除的年份
#include<stdio.h>
int main()
{
int year, month, day;
scanf("%d,%d", &year, &month);
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)day = 31;
if (month == 4 || month == 6 || month == 9 ||month == 11)day = 30;
if (month == 2)
{
if ((!(year % 4) && (year % 100)) || !(year % 400))day = 29;
else day = 28;
}
printf("%d", day);
return 0;
}
总结
几个字符串处理库函数
字符串复制:strcpy(a,b); strncpy(a,b,n);
字符串连接:strcat(a,b); strncat(a,b,n);
字符串比较:strcmp(a,b); 排序在前小于排序在后;
字符串求长度(不包括’\0’):strlen(a);
字符串小写变大写:strupr(a);
字符串大写变小写:strlwr(a);
反转字符串:strrev();