XJTU大计基例题分享(第9周)

个人水平有限,只是和大家分享自己的想法和思路,希望大家多批评指正

1.

输入若干个整数,其值在0至4的范围内,统计每个整数的个数。

    输入:[0,4]内的整数组成的序列,用空格隔开,以-1终止。

    输出:0,1,2,3,4的统计个数,用一个空格隔开(最后一个输出后面没有空格)。

样例:

3 3 3 2 2 1 0 3 4 4 -1

1 1 2 4 2

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//最简单也是最笨的方法,一个一个比较
int main()
{
	int a[100]; int i = 0;
	do
	{
		scanf("%d", &a[i]);
		i++;

	} while (a[i-1] != -1);
	int zero = 0, one = 0, two = 0, three = 0, four = 0;
	for (int m = 0; m <= i; m++)
	{
		if (a[m] == 0)
			zero++;
		if (a[m] == 1)
			one++;
		if (a[m] == 2)
			two++;
		if (a[m] == 3)
			three++;
		if (a[m] == 4)
			four++;
	}
	printf("%d %d %d %d %d\n", zero, one, two, three, four);
	return 0;
}

2.

将一个大于4的正整数分解为连续的正整数之和,请显示全部分解结果。

如数字15,可以分解为:

15=1+2+3+4+5

15=4+5+6

15=7+8

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int x;
	do
	{
		scanf("%d", &x);
	} while (x <= 4);
	int i = 1;
	for (i; i < x; i++)//i为起点
	{
		int j = i, adds = 0, o = 0;//o储存已加数字个数
		do
		{
			adds = adds + j;
			j++;
			o++;
			if (adds == x)
			{
				if (o != 2)//o最少都要2个
				{
					printf("%d=%d", x, i);
					int t = i + 1;
					do
					{

						printf("+%d", t);
						t++;
					} while (t < j - 1);
					printf("+%d\n", j - 1);
				}
				else
					printf("%d=%d+%d\n", x, i, i + 1);
			}
		} while (j < x);
	}
	return 0;
}

3.求a+aa+aaa+aaaa+…+aa...a(n个),其中a为1~9之间的整数。
例如:当a = 1, n = 3时,求1+11+111之和为123;
输入:组成序列的数字a和求和项的数量n
输出:算式和结果。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
/*基本思路:类似于
aaaaaaaaaa
aaaaaaaaa
aaaaaaaa
aaaaaaa
aaaaaa
aaaaa
aaaa
aaa
aa
a
将其如此排列,可见其各数位个数呈递减趋势
可将其按个位n个,十位n-1个,百位n-2个···直到加完*/              
int main()
{
	int a, n, i = 1;
	scanf("%d%d", &a, &n);
	long long int sum=0;
	int t = n;
	do //计算和的值
	{
		sum = sum + t * i * a;//按位加和
		i = 10 * i;//i是个十百千万的位
		t = t - 1;//t标志还剩几位没加
	} while (t != 0);
	i = 1;
	printf("%d", a);
	if (n != 1)
	{
		for (int o = 2; o <= n; o++)
		{
			int middle = a;
			do //算中间值
			{

				i = 10 * i;
				
				middle = middle + i * a;

			} while (i != pow(10, o - 1));
			i = 1;
			printf("+%d", middle);
		}
	}
	printf("=%d\n", 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,用空格隔开。
    输出:若干水仙花数,用空格隔开(最后一位输出后面无空格)。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>

int main()
{
	int n, m;
	do {
		scanf("%d%d", &n, &m);
	} while (n < 100 || m >= 1000);
	int f, s, t;//分别存放三位数
	int daffodil[20];//存放水仙花数的数组
	int i = 0;//计数变量
	for (int x = n; x <= m; x++)
	{
		int a = x;
		t = a % 10;//个位
		a = a / 10;
		s = a % 10;//十位
		a = a / 10;
		f = a % 10;//百位
		if (x == pow(f, 3) + pow(s, 3) + pow(t, 3))
		{
			daffodil[i] = x;
			i++;
		}
	}
		int j = 0;
		if (i == 0)//如果没有daffodil输出-1
			printf("-1\n");

		else if (i != 1)
		{
			do//按顺序输出daffodil
			{
				printf("%d ", daffodil[j]);
				j++;
			} while (j < i - 1);
			printf("%d\n", daffodil[j]);
		}
		else
			printf("%d\n", daffodil[0]);
	return 0;
}

5.

求一组数(整数数组)中的最大值,然后统计该最大值在这组数中出现的次数。

  输入:元素个数n和n个整数。n<200。(要先输入个数n,然后再输入n个数)

  输出:最大值及出现的次数。数据间以一个逗号隔开。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int n;
	scanf("%d", &n);
	int figure[200];
	int i = 0;
	do//输入n个整数
	{
		scanf("%d", &figure[i]);
		i++;
	} while (i < n);
	int a = 0;
	int max = figure[a];
	for(a;a<n;a++)//寻找最大值
    {
      if(max<figure[a])
        max=figure[a];
    }
	

	int t = 0;
	i = 0;
	do//max出现次数
	{
		if (figure[i] == max)
			t++;
		i++;
	} while (i < n);
	printf("%d,%d\n", max, t);
	return 0;
}

6.

定义包含5个英文单词的字符数组(即二维字符数组),键盘输入5个单词(一个单词最多80个字符),按字典顺序寻找最大和最小单词并输出。

输入:5个单词

输出:最大和最小单词(按字典序)

如:

one two three four five
max:two min:five(注:max和min后是英文冒号)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

int main()
{
	int i = 0;
	char words[5][80];//二维字符串
	for (i = 0; i < 5; i++)
	{
		scanf("%s", &words[i]);
	}
	char max[80], min[80];
	strcpy(max, words[0]);//字符串复制函数
	strcpy(min, words[0]);
	i = 0;
	for (i; i < 5; i++)
	{
		if (strcmp(max, words[i]) < 0)/*字符串比较函数,相同返回0,前面更小返回负整数,前面更大返回负整数*/
			strcpy(max, words[i]);
		if (strcmp(min, words[i]) > 0)
		{
			strcpy(min, words[i]);
		}


	}
	printf("max:%s min:%s\n", max, min);
	return 0;
}

7.

将字符串首部的*号全部移到字符串的尾部,中间若有*号,保持中间的*号不动。字符串长度不超过200.

样例:

***street*****music***

street*****music******

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

int main()
{
	int len, i, n;
	char a[200] = { 0 };
	gets(a);//字符串输入函数
	len = strlen(a);
	i = 0;
	n = 0;
	do//确定头部*数量
	{
		if (a[i] == '*')
		{
			n++;
			i++;
		}

	} while (a[i] == '*');
	int t = n;
	while (n!=0)//删除头部*,当然还有其他做法
	{
		for (i = 0; i < len; i++)
		{
			a[i] = a[i + 1];
		}
		n--;
	}
	i = len - t;
	for(i;i<len;i++)//末尾加上**
	{
		a[i] = '*';
	}
	puts(a);
	return 0;

}

8.

从键盘输入一个正整数(>1),然后将该整数分解为1和各个质因子的相乘,如果输入的整数本身就是质数,则应分解为1和该数本身相乘。

如:

18

1*2*3*3

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int x;
	do
	{
		scanf("%d", &x);
	} while (x <= 1);
		
	
	printf("1");//质因子必有1
	int i = 2;//从小开始,因为小的质数为因子就不出现非质的更大的数为因子的情况
	for (i; i <= x; i++)//注意循环条件
	{
		if (x % i == 0)//若是因数
		{
			printf("*%d", i);
			x /= i;
			i--;//再次判断i是否为新x的因子
		}
	}
	return 0;
}

9.有一分数序列如下: 2/1, 3/2, 5/3, 8/5, 13/8, 21/13, … 即后一项的分母为前一项的分子,后项的分子为前一项分子与分母之和,求其前n项之和(从第1项算起)。
输入:项数n(整数)
输出:前n项之和(实数,注:保留4位小数)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int n;
	float sum=0;
	scanf("%d", &n);
	float s = 2, m = 1, temp;
	for (int i = 0; i < n; i++)
	{
		sum = sum + s/m;
		temp = s;
		s = m + s;//按题设要求改变分子分母
		m = temp;
	}
	printf("%.4f\n", sum);//%m.n表示占m格,小数点后保留n位
//%m是右对齐,左补空格;%-m是左对齐,右补空格
	return 0;
}

10.输入公元年份和月份,输出该月份的天数。
输入:年,月(逗号分隔)
输出:天数

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//注意闰年是年份能被4整除且不被100整除
//或者能被400整除的年份
int main()
{
	int year, month;
	scanf("%d,%d", &year, &month);
	int run = 0;//闰年的标志
	if (year % 4 == 0 && year % 100 != 0)
		run = 1;
	if (year % 400 == 0)
		run = 1;
	int i = month;
	if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)
		printf("31\n");
	else if (i == 2 && run == 1)
		printf("29\n");
	else if (i == 2 && run == 0)
		printf("28\n");
	else
		printf("30\n");
	return 0;
}

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值