洛谷刷题C语言:数列求和、求极差/最大跨度值、求三角形、冰雹猜想、旗鼓相当的对手

记录洛谷刷题C语言,一些不太优雅的代码


一、【深基4.例11】数列求和

题目描述

计算 1 + 2 + 3 + ⋯ + ( n − 1 ) + n 1+2+3+\cdots+(n-1)+n 1+2+3++(n1)+n 的值,其中正整数 n n n 不大于 100。由于你没有高斯聪明,所以你不被允许使用等差数列求和公式直接求出答案。

输入格式

输入一个正整数 n n n

输出格式

输出一个正整数,表示最后求和的答案。

样例 #1

样例输入 #1

100

样例输出 #1

5050

提示

数据保证, 1 ≤ n ≤ 100 1 \leq n \leq 100 1n100

代码如下

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
 
int main()
{
	int n;
	scanf("%d",&n);
	
	int sum = 0;
	for(int i = 1;i <= n;i++)
	{
		sum = sum + i;
	}
	
	printf("%d",sum);
	return 0;	
} 

二、【深基4.习5】求极差 / 最大跨度值

题目描述

给出 n n n n n n 个整数 a i a_i ai,求这 n n n 个整数中的极差是什么。极差的意思是一组数中的最大值减去最小值的差。

输入格式

第一行输入一个正整数 n n n,表示整数个数。

第二行输入 n n n 个整数 a 1 , a 2 … a n a_1,a_2 \dots a_n a1,a2an,以空格隔开。

输出格式

输出一个整数,表示这 n n n 个整数的极差。

样例 #1

样例输入 #1

6
1 1 4 5 1 4

样例输出 #1

4

提示

数据保证, 1 ≤ n ≤ 100 1 \leq n\leq 100 1n100 0 ≤ a i ≤ 1000 0\le a_i \le 1000 0ai1000

代码如下

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
 
int main()
{
	int n;
	scanf("%d",&n);
	
	int min = 1000, max = 1;
	
	for(int i = 1;i <= n;i++)
	{
		int num;
		scanf("%d",&num);
		if(num < min)
		{
			min = num;
		}
		if(num > max)
		{
			max = num;
		}
	}
	
	printf("%d",max - min);	
	return 0;	
} 

三、【深基4.习8】求三角形

题目描述

模仿例题,打印出不同方向的正方形,然后打印三角形矩阵。中间有个空行。

输入格式

输入矩阵的规模,不超过 9 9 9

输出格式

输出矩形和正方形

样例 #1

样例输入 #1

4

样例输出 #1

01020304
05060708
09101112
13141516

      01
    0203
  040506
07080910

代码如下

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
 
int main()
{
	int n;
	scanf("%d",&n);
	
	int x = 1; 
	for(int i = 1;i <= n;i++)
	{
		for(int j = 1;j <= n;j++)
		{
			if(x < 10)
			{
				printf("0%d",x);
				x++;
			}
			else
			{
				printf("%d",x);
				x++;
			}
		}
		printf("\n");
	}
	
	printf("\n");
	int m = 1;
	for(int i = n-1;i >= 0;i--)
	{
		for(int j = 0;j < i;j++)
		{
			printf("  ");
		}
		for(int t = i;t <= n-1;t++)
		{
			if(m < 10)
			{
				printf("0%d",m);
				m++;
			}
			else 
			{
				printf("%d",m);
				m++;
			}
		}
		printf("\n");
	}
	return 0;	
} 

四、【深基5.例3】冰雹猜想

题目描述

给出一个正整数 n n n,然后对这个数字一直进行下面的操作:如果这个数字是奇数,那么将其乘 3 3 3 再加 1 1 1,否则除以 2 2 2。经过若干次循环后,最终都会回到 1 1 1。经过验证很大的数字( 7 × 1 0 11 7\times10^{11} 7×1011)都可以按照这样的方式比变成 1 1 1,所以被称为“冰雹猜想”。例如当 n n n 20 20 20,变化的过程是 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 20\to 10\to 5\to 16\to 8\to 4\to 2\to 1 20105168421

根据给定的数字,验证这个猜想,并从最后的 1 1 1 开始,倒序输出整个变化序列。

输入格式

输入一个正整数 n n n

输出格式

输出若干个由空格隔开的正整数,表示从最后的 1 1 1 开始倒序的变化数列。

样例 #1

样例输入 #1

20

样例输出 #1

1 2 4 8 16 5 10 20

提示

数据保证, 1 ≤ n ≤ 100 1 \le n\le 100 1n100

代码如下

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
 
int main()
{	
	int n;
	scanf("%d",&n);
	
	int num[100000];
	int i = 0; 
	int m = n;
	while(m != 1)
	{
		if(m % 2 ==0)
		{
			m = m/2;
			num[i] = m;
			i++;
		}
		else
		{
			m = m*3 + 1;
			num[i] = m;
			i++;
		}
	}
	
	for(int j = i - 1;j >= 0;j--)
	{
		printf("%d ",num[j]);
	}
	printf("%d\n",n);
	return 0;	
} 

五、【深基5.例5】旗鼓相当的对手

题目描述

现有 N N N 名同学参加了期末考试,并且获得了每名同学的信息:语文、数学、英语成绩(均为不超过 150 150 150 的自然数)。如果某对学生 < i , j > \text{<}i,j\text{>} <i,j> 的每一科成绩的分差都不大于 5 5 5,且总分分差不大于 10 10 10,那么这对学生就是“旗鼓相当的对手”。现在想知道这些同学中,有几对“旗鼓相当的对手”?同样一个人可能会和其他好几名同学结对。

输入格式

第一行一个正整数 N N N

接下来 N N N 行,每行三个整数,其中第 i i i 行表示第 i i i 名同学的语文、数学、英语成绩。最先读入的同学编号为 1 1 1

输出格式

输出一个整数,表示“旗鼓相当的对手”的对数。

样例 #1

样例输入 #1

3
90 90 90
85 95 90
80 100 91

样例输出 #1

2

提示

数据保证, 2 ≤ N ≤ 1000 2 \le N\le 1000 2N1000 且每科成绩为不超过 150 150 150 的自然数。

代码如下

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
 
int main()
{	
	int n;
	scanf("%d",&n);
	
	int C[n], M[n], E[n];
	for(int i = 0;i < n;i++)
	{
		scanf("%d%d%d",&C[i],&M[i],&E[i]);
	}
	
	int couple = 0;
	for(int i = 0;i < n;i++)
	{
		for(int j = i+1;j < n;j++)
		{
			int num = C[i] + M[i] + E[i];
			int sum = C[j] + M[j] + E[j];
			if(abs(C[i]-C[j]) <= 5&&abs(M[i]-M[j]) <= 5&&abs(E[i]-E[j])<= 5&&abs(num-sum) <= 10)
			{
				couple ++;
			}
		}
	}
	
	printf("%d\n",couple);
	return 0;	
} 
  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值