大计基作业记录(3)

第八周作业记录

记录一下第八周作业。

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();
在这里插入图片描述

  • 15
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值