2021-04-14

C语言OJ题—xjtu大计基作业第八周

/*输入若干个整数,其值在0至4的范围内,用-1作为输入结束的标志,统计每个整数的个数。
    输入:[0,4]内的整数组成的序列,最后是-1,用空格隔开。
    输出:0,1,2,3,4的统计个数,用一个空格隔开。*/
    #include<stdio.h>
int main()
{
	int a = 0, m = 0, n = 0, o = 0, p = 0, q = 0;
	do
	{
		scanf_s("%d", &a);
		if (a >= 0 && a <= 4)
		{
			switch (a)
			{
			case 0:
				m++;
				break;
			case 1:
				n++;
				break;
			case 2:
				o++;
				break;
			case 3:
				p++;
				break;
			case 4:
				q++;
				break;
		  }
		}
	} while (a != -1);
	printf("%d %d %d %d %d", m,n,o,p,q);
}
/*将一个大于4的正整数分解为连续的正整数之和,请显示全部分解结果。
如数字15,可以分解为:
15=1+2+3+4+5
15=4+5+6
15=7+8*/
#include<stdio.h>
int main()
{
	int num;
	scanf_s("%d", &num);
	int sum = 0;
	int d;
	for (int i = 1; i <= num/2; i++)
	{
		for (int j = 1;; j++)
		{
			sum = (j + 1) * (2 * i + j) / 2;
			if(sum>num)
				break;
			if (sum == num)
			{
				printf("%d=", num);
				for (int k = 0; k < j; k++)
				{
					d = i + k;
					printf("%d+", d);
				}
				printf("%d\n", i + j);
			}
		}
	}
	return 0;
}//这里用的循环次数较高;可以考虑优化算法减少复杂度;
/*求a+aa+aaa+aaaa+…+aa...a(n个),其中a为1~9之间的整数。
例如:当a = 1, n = 3时,求1+11+111之和为123;
输入:组成序列的数字a和求和项的数量n
输出:算式和结果。*/
#include<stdio.h>
int main()
{
	int s = 0, a, n, t;
	scanf_s("%d %d", &a, &n);
	t = a;
	while (n > 1)
	{
		printf("%d+", t);
		s += t;
		a = a * 10;
		t += a;
		n--;
	}
	printf("%d", t);
	s += t;
	a = a * 10;
	t += a;
	printf("=%d", s);
	return 0;
}
/*“水仙花数”是指一个三位正整数,其各位数字的立方和刚好等于该数本身,如:153=1^3+5^3+3^3 (其中^表示乘方,5^3表示5的3次方),则153是一个“水仙花数”。
    输入n, m,100<=n,m<1000, 求出[n,m]之间的水仙花数。若该区间没有水仙花数,输出-1.
    输入:n,m,用空格隔开。
    输出:若干水仙花数,用空格隔开。*/
#include<stdio.h>
#include<math.h>
int main()
{
    int a, b
    int c, d, e;
    int sum = 0;
    int f = -1;
    int flag = 1;
    scanf_s("%d%d", &a,&b);
    for (int i = a; i <= b; i++)
    {
        c= i / 100;
        d = i / 10 - c * 10;
        e = i % 10;
        if (c * c*c + d * d*d + e * e*e == i)
        {
            if (flag)
                flag = 0;
            else
            printf(" ");
            printf("%d", i);
            sum++;
        }
    }
    if (sum == 0)
        printf("%d",f);
	return 0;
}
/*求一组数中的最大值,然后统计该最大值在这组数中出现的次数。
  输入:元素个数n和n个整数。n<200。(要先输入个数n,然后再输入n个数)
  输出:最大值及出现的次数。数据间以一个逗号隔开。*/
#include<stdio.h>
#include<stdlib.h>
int main()
{
	int n;
	scanf_s("%d", &n);
	//getchar();
	int  *sz;
	sz = (int*)(malloc(n * sizeof(int)));
	int sum = 0;
	int max = 0;
	for (int i = 0; i < n; i++)
	{
		scanf_s("%d", &sz[i]);
		//getchar();
	}
	for (int i = 0; i <n; i++)
	{
		if (sz[i] >= max)
			max = sz[i];
	}
	for (int i = 0; i < n; i++)
	{
		if (sz[i] == max)
			sum++;
	}
	printf("%d,%d",max,sum);
	//free(sz);
		return 0;
}
/*定义包含5个英文单词的字符数组(即二维字符数组),键盘输入5个单词,按字典顺序寻找最大和最小单词并输出。
输入:5个单词
输出:最大和最小单词(按字典序)*/
#include<stdio.h>
#include<string.h>
int main() {
	char a[6][20];
	for (int i = 0; i < 5; i++)
	 scanf(" %s", a[i]);
	 //通过冒泡排序法将五个字母按照字典排序即可;
	for (int i=0;i<5;i++)
		for(int j=0;j<5-1-i;j++)
			if (strcmp(a[j], a[j + 1])>0) {
				strcpy(a[5], a[j]);
				strcpy(a[j], a[j+1]);
				strcpy(a[j+1], a[5]);
			}
	printf("max:%s min:%s", a[4], a[0]);
	return 0;
}


/*将字符串首部的*号全部移到字符串的尾部,中间若有*号,保持中间的*号不动。字符串长度不超过200.
样例:
***street*****music***
street*****music*******/
#include <stdio.h>
void main(){
   char c[81],*p;
   int n=0,i=0;
    p=c;
    gets(c);
 while(*p=='*'){
   n++; //统计字符串中前导*号的个数
   p++;
 }
 while(*p){
   c[i]=*p;  //把前导*号之后的字符全部前移
   i++;
   p++;
 }
 while(n!=0){ //把统计*号个数补到字符串的末尾
  c[i]='*';
  i++;n--;
 }
 c[i]='\0';
 puts(c);
}
/*从键盘输入一个正整数(>1),然后将该整数分解为1和各个质因子的相乘,如果输入的整数本身就是质数,则应分解为1和该数本身相乘。
如:
18
1*2*3*3*/
#include<stdio.h>
int main()
{
    int x, i;
    scanf_s("%d", &x);
    printf("1");
    for (i = 2; i * i <= x; i++)//当i*i大于x,明显不再是质因子;
        for (; x % i == 0; x /= i)//先判断i是否是x的质因子,再将x除以i的值赋予x;再输出质因子的乘积形式
            printf("*%d", i);
    if (x > 1)printf("*%d", x);//如果x不是质数的话,x最终值为1;
    printf("\n");
    return 0;
}

/*有一分数序列如下: 2/1, 3/2, 5/3, 8/5, 13/8, 21/13, … 即后一项的分母为前一项的分子,后项的分子为前一项分子与分母之和,求其前n项之和。
输入:项数n(整数)
输出:前n项之和(实数,注:保留4位小数)*/
#include <stdio.h>
int main()
{
	int i, n ;
	scanf_s("%d",&n);
	double a = 2, b = 1, s = 0, t;
	for (i = 1; i <= n; i++)
	{
		s = s + a / b;
		t = a,
			a = a + b,
			b = t;
	}
	printf("%.4f", s);
	return 0;
}


/*定义包含5个英文单词的字符数组(即二维字符数组),键盘输入5个单词,按字典顺序寻找最大和最小单词并输出。
输入:5个单词
输出:最大和最小单词(按字典序)
如:
one two three four five
max:two min:five(注:max和min后是英文冒号)
*/
/*输入公元年份和月份,输出该月份的天数。
输入:年,月(逗号分隔)
输出:天数
样例输入:
2018,8
样例输出:
31*/
#include<stdio.h>
int main()
{
	int year, month;
	scanf_s("%d,%d", &year,&month);
	if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
	{
		if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
		{
			printf("31");
		}
		else if (month == 2)
		{
			printf("29");
		}
		else if (month == 4 || month == 6 || month == 9 || month == 11)
		{
			printf("30");
		}
	}
	else
	{
		if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
		{
			printf("31");
		}
		else if ( month == 4 || month == 6 || month == 9 || month == 11)
		{
			printf("30");
		}
		else if (month == 2)
		{
			printf("28");
		}
	}
	return 0;
}//可以使用switch内部镶嵌一个if语句,简化结构;

希望大家有什么意见和纠正可以指出,好的解法也可以多多交流。

  • 44
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

树杰同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值