最近刷题学习到的知识点以及代码

readme

我是一个小白,所以都是很基础的知识点,题目是洛谷上的,会持续更新,里面还有道题目还没想明白
欢迎留言喔😊

学习的知识点

输出多行字符串

一共三种方法

字符串需要使用“”进行输入

方法一:cout搭配换行符\n或者endl

#include<iostream>
using namespace std;
int main() {
	cout << "                ********\n";
	cout << "               ************\n" ;
    cout << "                ********"<<endl;
    cout << "                ...........               #...#          #...#"<< endl;
	cout << "               ##*#######                 #.#.#          #.#.#"<< endl;
	...
    ...  
    ...
	return 0;
}

方法二:printf搭配\n

#include<stdio.h>
int main() {
	printf(
        "   ********\n"
        "               ************\n"
        "                ####....#.\n"
        "          %%%#@#**@*\n"
    ) 
	return 0;
}

演示案例:马里奥题号P1000

#include<iostream>
using namespace std;
int main() {
	cout << "                ********"<<endl;
	cout << "               ************" << endl;
	**cout** << "               ####....#."<< endl;
	cout << "             #..###.....##...." << endl;
	cout << "             ###.......######              ###            ###"<< endl;
	cout << "                ...........               #...#          #...#"<< endl;
	cout << "               ##*#######                 #.#.#          #.#.#"<< endl;
	cout << "            ####*******######             #.#.#          #.#.#"<< endl;
	cout << "           ...#***.****.*###....          #...#          #...#"<< endl;
	cout << "           ....**********##.....           ###            ###"<< endl;
	cout << "           ....****    *****...."<< endl;
	cout << "             ####        ####"<< endl;
	cout << "           ######        ######"<< endl;
	cout << "##############################################################"<< endl;
	cout << "#...#......#.##...#......#.##...#......#.##------------------#"<< endl;
	cout << "###########################################------------------#"<< endl;
	cout << "#..#....#....##..#....#....##..#....#....#####################"<< endl;
	cout << "##########################################    #----------#"<< endl;
	cout << "#.....#......##.....#......##.....#......#    #----------#"<< endl;
	cout << "##########################################    #----------#"<< endl;
	cout << "#.#..#....#..##.#..#....#..##.#..#....#..#    #----------#"<< endl;
	cout << "##########################################    ############"<<endl;
	return 0;
}

数组的运用及for循环批量填充数组

详情请见P1046题解

运用数学运算公式的方法 (幂,次方,开跟)

//首先是要用到math.h的库
#include<math.h>
using namespace std;
int main()
{
    pow(数字,数字的幂);//这个常用于计算幂,以及开高次根号(注意是高次根号)
   	sqrt(数字);//开平方根
}

P5707 上学迟到题 (时间运算问题) //TODO

问题描述:

yyy 的学校要求早上 8 点前到达。学校到 yyy 的家一共有 $$s(s\le 10000)$$米,而 yyy 可以以 $$v(v<10000)$$米每分钟的速度匀速走到学校。此外在上学路上它还要额外花 10 分钟时间进行垃圾分类。请问为了避免迟到 yyy 最晚什么时候出门?输出 HH:MM 的时间格式,不足两位时补零。由于路途遥远, yyy 可能不得不提前一天出发,不过不可能提前超过一天。

题目bug:

  1. 不知道踩点到校算不算, 如果是非踩点到学校必须提前一分钟

  2. 怎么个不超过一天法? 是早上八点倒退24小时还是倒退到前一天的0点?

参考代码,仍需改进

#include<cstdio>
#include<iostream>
int main()
{
	int S;//家到学校的距离 
	int V;//行走的速度 
	scanf("%d%d",&S,&V);
	int t;
	if(S%V==0)//因为后面是从07:59开始的,所以这里的时间少一分钟 
	{
		t=S/V;
		t+=9;//垃圾分类的时间 
	}
	else
	{
		t=S/V;//时间如果不能被速度整除,就要提前一分钟出发 
		t+=10;//垃圾分类的时间 
	}
	int H;//保存出发的小时,分钟 
	int M;
	H=7;
	M=59;
	while(t!=0) 
	{
		if(M!=0)
		{
			M--;
		}
		else
		{
			if(H!=0)
			{
				H--;
				M=59;
			}
			else
			{
				H=23;
				M=59;
			}
		}
		t--;
	}
	int h1,h2;//分开保存小时,分钟的十位,个位 
	int m1,m2;
	h1=H/10;
	h2=H-(10*(H/10)); 
	m1=M/10;
	m2=M-(10*(M/10)); 
	printf("%d%d:%d%d",h1,h2,m1,m2);
    return 0;
}

函数类题目

P5735 距离函数 (利用坐标求三角形周长, 自定义函数)

题目描述: 给出平面坐标上不在一条直线上三个点坐标$$ (x_1,y_1),(x_2,y_2),(x_3,y_3)$$,坐标值是实数,且的绝对值不超过 100.00,求围成的三角形周长。保留两位小数

对于平面上的两个点 $$(x_1,y_1),(x_2,y_2)$$,则这两个点之间的距离 $$dis=\sqrt{(x_2-x_1)2+(y_2-y_1)2}$$

要点: 因为是保留两位小数以及根号容易取不尽, 要使用double

代码如下

#include<iostream>
#include<math.h>
#include<bits/stdc++.h>
using namespace std;
double dis(double a1, double b1,double a2,double b2){//这一个部分就是函数如何定义的发方法
    return sqrt(pow((a1 - a2),2) + pow((b1 - b2),2));//经过测试,如果不屑return是不会给原函数返回数值的
    //所以返回值很重要
}

int main(){
    double x1, y1;
    double x2, y2;
    double x3, y3;
    cin >> x1 >> y1;
    cin >> x2 >> y2;
    cin >> x3 >> y3;
    
    double r = dis(x1, y1, x2, y2) + dis(x1, y1, x3, y3) + dis(x2, y2, x3, y3);
    cout << setprecision(2)<<fixed <<r << endl;

    return 0;
}

P1428 小鱼比可爱 (数组的注入与调用, for循环的运用)

题目描述:输入一个数字表示鱼儿总数,输入对应总数的鱼儿颜值,随后进行比较,全部为向左比较,输出每个鱼儿高于左边的鱼数

输入格式

6
4 3 0 5 1 2

输出

0 0 0 3 1 2

知识点:

这题要依次为数组中的每一位注入数值就需要用到for循环进行注入, 在比较环节也可以运用for循环进行比较

代码如下

#include<iostream>
using namespace std;
int main(){
    int fishnum;
    int a[101]={0};//一定要初始化数组,不然指针里会有数据残留,{0}就是初始化
    int b[101]={0};
    cin >> fishnum;
    for (int i = 1; i <= fishnum; i++)//运用for循环把a[1]到a[n]都注入想要输入的文字
    {
        cin >> a[i];//这里就可以直接输入数字了
    }
    
    for (int i = 1; i <= fishnum;i++)//这里照旧进行一次循环,起作用等于枚举(每一个都尝试)每一个a[i]值
    {
        for (int j = i; j >= 1;j--)//而这里则是在以i为起点向前(左)枚举每一个比a[i]小的数字
        {
            if(a[i] > a[j]){		//运用if判断左边与右边i的大小,成立则让对应的空数组
                b[i]++;				//位置b[i]自增,最终获得所有比自己小的数字
            }
        }
    }

    for (int i = 1; i <= fishnum;i++)	//用for循环打印
    {
        cout << b[i] << " ";
    }
    return 0;
}

P2181 对角线 (数学题)

题目描述:

对于一个 nn 个顶点的凸多边形,它的任何三条对角线都不会交于一点。请求出图形中对角线交点的个数。

例如,6边形:

解法一: 公式法

这个由计算公式

对于任意外凸多变形

n为边数

\[\Large边长数 = \frac{n(n-3)}{2} \]

\[\Large对角线数量 = \frac {n * (n-1) * (n-2) * (n-3) }{24} \]

代码

#include<bits/stdc++.h>
using namespace std;
unsigned long long n,ans;
int main()
{
    scanf("%lld",&n);
    ans=n * (n-1) / 2 * (n-2) / 3 * (n-3) / 4;
    printf("%lld\n",ans);
    return 0;
}

解法二: 数列法

有位大佬的题解, 非常神奇,做差值,发现是数列形式

边数 交点数 做差01 02 03
1 0
2 0
3 0 0
4 1 1 1
5 5 4 3 2
6 15 10 6 3
7 35 20 10 4
8 70 35 15 5

逐层表达出即可

//#include<cstdio>
#include<iostream>
//#include<cmath>
using namespace std;
long long a1[100000];//定义数组,长度100000
long long a2[100000];//longlong为64位长整型,最大可到2^64次方
long long a3[100000];//数组默认每个数字都是0
int main(){
    long long n;
    cin >> n;
    int t = 0;
    for(int i = 1; i <= n; i++)
    {
        a1[i] = a1[i - 1] + i;      //生成1,3,6,10序列
    }	//这里只有i-1才能让下一个运算中用上上一位的数字,不然会出现
        // a[3]=a[3]+i; 而a[3]还没定义默认是0
    for(int i=1; i<=n; i++)
    {
        a2[i] = a2[i - 1] + a1[i];  //生成1,4,10,20序列
        //本质就是让表格的 “02列” + 01列上减去下的插值,刚好等于01列
    }
    for (int i = 1; i <= n;i++)
    {
        a3[i] = a3[i - 1] + a2[i];  //生成1,5,15,35序列
        //同理得到交点数
    }
    cout << a3[n-3];
    return 0;
}

P5709 限定时间吃苹果 (向上取整)

题目: 八尾勇喜欢吃苹果。她现在有 。

\[m(m\le 100) 个苹果 \]

吃完一个苹果需要花费

\[t(0 \le t \le100)分钟 \]

吃完一个后立刻开始吃下一个。现在时间过去了

\[s(s\le 10000) 分钟 \]

请问她还有几个完整的苹果?

这个题目陷阱很多,首先是题目给的数字范围, 必须要考虑吃的速度为0个/分钟时的情况(约等于光速吃苹果),所以答案要写0

有时候太高估自己的代码了,其实漏洞百出

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int main(){
    int m , a , t, s;
    cin >> m >> t >> s;
    if ( t == 0 )
    {
        cout << 0 << endl;
        return 0; //等于中途暂停
    }
    a = m-ceil((double)s/t);//向上取整,ex:9.5取10
    if(a<=0)
    {
        cout << 0;
    }
    else cout << a;
    return 0;
}

P1421 算钱能买多少东西

问题描述

班主任给小玉一个任务,到文具店里买尽量多的签字笔。已知一只签字笔的价格是 11 元 99 角,而班主任给小玉的钱是 a元 b 角,小玉想知道,她最多能买多少只签字笔呢?

问题很简单, 就不过多解释了

#include<iostream>
#include<bits/stdc++.h>
#include<math.h>
using namespace std;
int main() {
	int a, b, c;
	cin >> a >> b;
	a *= 10;//将元转化为角
	c = a + b;
	int f = 19;
	cout << c / f;
	return 0;
}

P5708 三角形面积计算 (数学知识海伦公式, 代码强制转换)

题目描述

一个三角形的三边长分别是 a、b、c,那么它的面积为

\[\sqrt{p(p-a)(p-b)(p-c)} \]

,其中

\[p=\frac{1}{2}(a+b+c) \]

。输入这三个数字,计算三角形的面积,四舍五入精确到 1 位小数。

保证能构成三角形,

\[0\leq a,b,c\leq 1000 \]

每个边长输入时不超过2位小数。

#include<iostream>
#include<bits/stdc++.h>
#include<math.h>
using namespace std;
int main() {
	double a, b, c;
	double p;
	double s;
	cin >> a >> b >> c;
	p = 1.0*(a + b + c) / 2;
	cout << setprecision(1) << fixed << pow(1.0 * p * (p - a) * (p - b) * (p - c), 1.0 / 2) << endl;
	return 0;
}

显式强制转换,例如:

int a=65;规范化
char b=char(a);

执行该语句段后,a的值为65,而b的值是“a”。
隐式强制转换,例如:

int a;
double b=3.88;
a=b;

执行该语句段后,b的值为3.88,而a的值是 3。
这是为什么呢?

因为,在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分直接舍去。 若参与运算量的类型不同,则先转换成同一类型,然后进行运算。转换类型按以下几个顺序进行:

  1. 转换按数据长度增加的方向进行,以保证精度不降低。如intint型和longlon**g型运算时,先把intint量转成longlon**g型后再进行运算。
  2. 若两种类型的字节数不同,转换成字节数高的类型
  3. 若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型
  4. 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算
  5. char型和 short型参与运算时,必须先转换成int

P2433 综合题(数学根号,幂运算库math.h)

问题 1

请输出 I love Luogu!

问题 2

这里有 10 个苹果,小A 拿走了 2 个,Uim 拿走了 4 个,八尾勇拿走剩下的所有的苹果。我们想知道:

  1. 小A 和 Uim 两个人一共拿走多少苹果?
  2. 八尾勇能拿走多少苹果?

现在需要编写一个程序,输出两个数字作为答案,中间使用空格分开。

问题 3

现在有 14 个苹果。要均分给 4 名同学,分不掉的苹果放回冰箱。请问:

  1. 每位同学能分得几个苹果?

  2. 一共分出去多少苹果?

  3. 把几个苹果放回冰箱?

    现在需要编写一个程序,输出三个数字作为答案,每个数字一行。

问题 4

现在有 500 毫升的肥宅快乐水,要均分给 3 名同学,每位同学可以分到多少毫升?请输出一个数字作为输出。保留 6 位有效数字,且不使用科学计数法。

问题 5

甲列火车长 260 米,每秒行 12 米;乙列火车长 220 米,每秒行 20 米,两车相向而行,从两车车头相遇时开始计时,多长时间后两车车尾相离?已知答案是整数。

问题 6

一个长方形长宽分别是 6cm、9cm,求它的对角线长度(cm)。直接使用 cout 输出。

问题 7

Uim 银行账户里面有100元。经过了下面的操作:

  1. 往里面存了 10 元;

  2. 购物花掉了 20 元;

  3. 把里面的钱全部取出。

    请在每次操作后输出账户余额,并使用换行符隔开。

问题 8

当半径为 r=5,请输出圆的周长、面积和球体积。取 π=3.141593。请直接使用 cout 输出答案,每行一个数字。

问题 9

一只小猴买了若干个桃子。第一天他刚好吃了这些桃子的一半,又贪嘴多吃了一个;第二天他也刚好吃了剩余桃子的一半,贪嘴多吃了一个;第三天他又刚好吃了剩下的桃子的一半,并贪嘴多吃了一个。第四天起来一看,发现桃子只剩下一个了。请问小猴买了几个桃子?

问题 10 这是一道小学奥数题

洛谷的评测任务可以看作是均匀增加的。8 台评测机 30 分钟可以刚好把评测队列中的程序评测完毕(测试时间中任务也在增加),10 台评测机 6 分钟可以刚好把评测队列中的程序评测完毕,请问几台评测机可以在 10 分钟时刚好把评测队列中的程序评测完毕?

问题 11

小A跑步速度 5m/s,八尾勇跑步速度 8m/s,八尾勇在小A后面 100m,他们同时起跑,请问需要多长时间八尾勇可以追上小A?输出一个数字表示答案,使用 cout 直接输出。

问题 12

大家都知道有 26 个英文字母,其中A是第一个字母。现在请编程求出:

  1. M 是字母表中的第几个字母?
  2. 第 18 个字母是什么?

输出一个数字和一个字母,使用换行隔开。

int main()
{
    cout << 'M'-'A'+1 << endl;//单引号就可以直接调用字符的ascii码
	char c12 = ('A' + 17);//定义char就是用单引号,可以直接加上数
	cout << c12 << endl;
}

问题 13 求解高次开跟,直接用 pow() 函数即可配合分数幂

小 A 有两块球形橡皮泥,一个半径是 4,一个半径是 10。他想把这两块橡皮泥揉在一起,然后塑造成一个正方体,请问这个正方体的棱长是多少?如果结果不是整数,则舍去小数点之后的数字。取 Π = 3.141593π=3.141593。

这里答案写错了,不过无伤大雅,记得时4/3Π R^3即可

int main()
{
    double pai13 = 3.141593;
	double a13 = pai13 * pow(4, 2);
	double b13 = pai13 * pow(10, 2);
	double c13 = a13 + b13;
	cout << pow(c13,1.0/3) << endl;//这里记得一定要写成1.0不然就会舍掉小数部分
}

正确写法

int main()
{
    double pai13 = 3.141593;
	double a13 = 4.0/3*pai13 * pow(4, 3);
	double b13 = 4.0/3*pai13 * pow(10, 3);
	double c13 = a13 + b13;
	cout << pow(c13,1.0/3) << endl;//这里记得一定要写成1.0不然就会舍掉小数部分
}

问题 14

根据咕咕网校的预测,当课程定价为 110 元时,会有 10 人报名。如果课程价格每降低 1 元,就会多 1 名报名者(反之亦然)。如果希望总共能收到 3500 元学费的话,那么应该定价多少呢?已知本题有两个答案符合要求,则取较小的那一个。如果这个答案不是整数,则需四舍五入精确到整数。

这是一个解方程的题目,设减价x元

自己设计了一个算法用于枚举方程, 答案解决问题下面

已经解决的问题

得到方程(110 - x)(10 + x) = 3500,这里想用for循环枚举求解方程答案,但是失败了

解决方法:

  1. 首先得移项, x在左常数在右边, 语言本身没那么智能
  2. 得用==符号, 因为=符号常用于表示赋值
int main()
{   
    int x;
    for (int x = 1; x >= 100; x++)
    {
        if ((110 - x)(10 + x) = 3500)//表达式必须是可修改的左值?没看懂
        break;
    }
    cout << x << endl;
}

正确写法

#include<iostream>
#include<bits/stdc++.h>
#include<math.h>
using namespace std;
int main()
{
    int a14, b14;
    //设减价幅度为x
    for (int x = 1; x <= 100; x++)//运用for循环,把减价幅度x从1到100都试一遍
    {
        if (pow(x, 2) - 100 * x == -2400//化简成这个形式即可
        {
            //cout << x << endl;
            a14 = x;//注意:这里的外部定义内部赋值不能写成int a14 = x; 会被识别成新的int
            break;
        }

    }
    for (int y = 100; y >= 1; y--)
    {
        if (pow(y, 2) - 100 * y == -2400)
        {
            //cout << y << endl;
            b14 = y;//注意:这里的外部定义内部赋值不能写成int b14 = x; 会被识别成新的int
            break;
        }
    }
    if (110 - a14 > 110 - b14)//进行一次对比,如果减价方案一比减价方案二大,则选择减价方案二
    {
        cout << 110 - b14 << endl;
    }
    else//与前面的if反之
    {
        cout << 110 - a14 << endl;
    }
	return 0;
}

源代码

#include<iostream>
#include<bits/stdc++.h>
#include<math.h>
using namespace std;
int main()
{
	int T;
	cin >> T;
	if (T == 1)
	{
		cout << "I love Luogu!";
	}
	else if(T ==2)
	{
		int a = 10;
		int s1 = 2;
		int s2 = 4;
		int s3 = a - s1 - s2;
		cout << s1 + s2 << " " << s3;

	}
	else if (T == 3)
	{
		int a3 = 14;
		int s3 = 4;
		cout << a3 / s3 << endl << 4 * (a3 / s3) << endl << a3 % s3 << endl;

	}

	else if (T == 4)
	{
		double a4 = 500;
		int b4 = 5;
		cout << setprecision(6) << a4 / b4 << endl;
	}
	else if (T == 5)
	{
		int a5 = 260;
		int b5 = 220;
		int s5 = 12;
		int d5 = 20;
		cout << (a5 + b5) / (s5 + d5) << endl;
	}
	else if (T == 6) 
	{
		int a6 = pow(6,2);
		int b6 = pow(9,2);
		cout << sqrt(a6+b6) << endl;

	}
	else if (T == 7)
	{
		int a7 = 100;
		a7 += 10;
		cout << a7 <<endl;
		a7 -= 20;
		cout << a7 << endl;
		a7 -= 90;
		cout << a7 << endl;


	}
	else if (T == 8) 
	{
		double r = 5;
		double pai = 3.141593;
		cout << 2 * r * pai << endl;
		cout << pow(r, 2)*pai << endl;
		cout << 4.0 / 3.0 * pai * pow(r, 3) << endl;

	}
	else if (T == 9)
	{

		cout << (((((1+1)*2)+1)*2)+1)*2 << endl;

	}
	else if (T == 10) 
	{
		cout << "9" << endl;
	}
	else if (T == 11) 
	{
		cout << 100.0 / 3.0 << endl;
	}
	else if (T == 12)
	{
		cout << 'M'-'A'+1 << endl;
		char c12 = ('A' + 17);
		cout << c12 << endl;

	}
	else if (T == 13) 
	{
		/*double pai13 = 3.141593;
		double a13 = pai13 * pow(4, 2);
		double b13 = pai13 * pow(10, 2);
		double c13 = a13 + b13;
		cout << setprecision(0)<<fixed << pow(c13,1.0/3) << endl;*/
		double pai13 = 3.141593;
		cout << (int)(pow(4.0 / 3 * pai13 * (4 * 4 * 4 + 10 * 10 * 10), 1.0 * 1 / 3));

	}
	else if (T == 14)
	{
		int a14, b14;
		for (int x = 1; x <= 100; x++)
		{
			if (pow(x, 2) - 100 * x == -2400)
			{
				//cout << x << endl;
				a14 = x;
				break;
			}
	
		}
		for (int y = 100; y >= 1; y--)
		{
			if (pow(y, 2) - 100 * y == -2400)
			{
				//cout << y << endl;
				b14 = y;
				break;
			}
		}
		if (110 - a14 > 110 - b14)
		{
			cout << 110 - b14 << endl;
		}
		else
		{
			cout << 110 - a14 << endl;
		}
	

	}

	return 0;
}

P5706 分发快乐水(控制输出精度)

题目: 每个人分发快乐水, 一人两杯, 输入快乐水总量, 以及人数, 给出每个人能分到的快乐水总量以及需要的杯子数

setprecision(精度值) 设置输出精度(以数字左边为基准)

fixed 固定精度点为小数点处(可以用此配合上面的函数输出指定小数点后的位数)

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main() {
	double t;
	int n;
	cin >> t >> n;
	cout << setprecision(3) << fixed <<t / n << endl << 2 * n;
	return 0;
}

P1425 鱼儿游泳(时间运算)

题目: 这一天,小鱼给自己的游泳时间做了精确的计时(本题中的计时都按24小时制计算),它发现自己从

a时b分一直游泳到当天的c时d分,请你帮小鱼计算一下,它这天一共游了多少时间呢?

知识点: 涉及到时间运算的知识点, 原本构想是转换运算进制, 但这里其实只需要小时减去小时, 分钟减去分钟, 同时运用 if 进行借位相减即可

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main() {
	int a, b, c, d;
	cin >> a >> b >> c >> d;
	int q = c - a; int w = d - b;
	if (w < 0) {
		q--, w += 60;//小时数自减1,同时让小于0的分钟数加上60,
        			 //等于 60-一个复数,得到借位后的结果
	}
	cout << q << " " << w;
	return 0;
}

P5705 反转输入内容 (字符串知识)

发现两种写法,一种是正经写法,采用

STL库内函数

reverse( 数组名 .begin().begin() ,, 数组名 .end().end() )😉;

可实现直接反转

#include<iostream>
using namespace std;
int main()
{
	string a;
	cin >> a;
	reverse(a.begin(), a.end());
	cout << a;
	return 0;
}

方法1.5:

函数:str.size() 获取字符串长度

#include<iostream>
using namespace std;
string a;//先定义一个字符串
int main() {
	cin>>a;
    //下面的a.size()就可以获得这个字符串的长度
	for(int i=a.size()-1;i>=0;i--)//
        cout<<a[i];
	return 0;
}

未理解点

int main() {
    //这里size-1或者不减一结果都是一样的,但理论来说size-1
    //会导致第一个变成了“.xxx”挺奇怪的,可是实际结果却是一样的
	for(int i=a.size()-1;i>=0;i--)//
    for(int i=a.size();i>=0;i--)   
	return 0;
}

我的骚操作:直接输入一个double复数,乘于10变为整数赋值int

利用取余运算获取常量的个,十,百,千,位,在输出时调转。

注意s*10并不会改变s必须要有=某个数,第四行

int main() {
	double s;
	cin >> s;
	s *= 10;//s*10 = int c 才能赋值,如果要原地乘必须用*=
	int a = s;
	int b[5];
	b[1] = a % 1000 % 100 % 10;
	b[2] = a % 1000 % 100 / 10;
	b[3] = a % 1000 / 100;
	b[4] = a / 1000;
	cout << b[1] << b[2] << b[3] << "." << b[4];
	return 0;
}

P5704 大小写转换(ascii码调用)

这道题主要掌握的知识点是:类型转换并不会改变元数据,只会改变结果

代码注释部分有解释

a和A的ascii码分别是97,65

#include<iostream>
using namespace std;
int main() {
	//97  65
	char z;
	cin >> z;

	char a= (int)(z-32);

	cout << a;
	//转换类型只会体现在结果上,对原来的数据没有影响
	/*(int)(z - 32);
	cout << z;*/	//输出结果还是原来的式子

	return 0;
}

P1035 级数累加 (累加问题)

题目:

一个式子累加,1+ 1/2 + 1/3 + ... + 1/n 当n无穷大时理论上可以算出一切数,则输入一个数字,并找出刚好满足其的n的值,即刚好到达指定大小

思路:

设置一个while循环,配合自增运算符不断自增,同时兼顾复数所需要的运算形式,采用double运算(精度更高)

#include<iostream>
using namespace std;
//一个式子累加,1+ 1/2 + 1/3 + ... + 1/n  当n无穷大时理论上可以算出一切数,则输入一个数字,并找出刚好满足其的n的值
//即刚好到达指定大小

int main()
{
	int n = 1, k;
	double s = 0;//因为是复数,所以要运用到double
	cin >> k;
	while (s <= k) {
		s += 1.0 / n;
		n++;
	}
	cout << n - 1 << endl;
	return 0;
}

P1008 数字组合题 (枚举算法并设置条件判断)

题目:1,2,3,4,5,6,7,8,9排列组合成三个数,使得三个数呈1:2:3的比例且每个数中的元素不重复

#include<stdio.h>
#include<iostream>
using namespace std;
int main()
{
	//题目:1,2,3,4,5,6,7,8,9排列组合成三个数,使得三个数呈1:2:3的比例且每个数中的元素不重复
	for (int i = 123; i < 333; i++)//从最小的排列组合123开始自增循环,最大不超过333(超过333最后一个数字就超过1000了)
	{
		int a[4], b[4], c[4];//定义三个数组括号里写的是数组位数,习惯性会写10,因为会自动添加一个字符所以最少写4(三位数)
		a[1] = i % 100 % 10;//获取i的个位数,123%100=23  23%10=3 取余获得余数刚好是个位数
		a[2] = i % 100 / 10;//获取i的十位数 123%100=23  23/10=2  c++除法自动取整不会保留小数
		a[3] = i / 100;//获取i的百位数  123/100=1 获得百位
		b[1] = 2 * i % 100 % 10;//乘上2,按题目要求得到 比例为“2”的一组数
		b[2] = 2 * i % 100 / 10;
		b[3] = 2 * i / 100;
		c[1] = 3 * i % 100 % 10;//乘上3,同理
		c[2] = 3 * i % 100 / 10;
		c[3] = 3 * i / 100;
		if (a[1] * a[2] * a[3] * b[1] * b[2] * b[3] * c[1] * c[2] * c[3]==362880 && a[1] + a[2] + a[3] + b[1] + b[2] + b[3] + c[1] + c[2] + c[3]==45)
		//上面这一行是把所有1~9的数字乘起来加起来,如果不重复数字结果一定是固定的,乘起来362880 加起来45
		{
			cout << i << " " << i * 2 << " " << i * 3 << endl;//打印即可
		}
	}
	return 0;
}

P1046 摘苹果题 (设置数组并判断条件)

这道题运用了数组得知识点,填充数组并进行对比

#include<iostream>
using namespace std;
//题目:第一行输入每个苹果的高度,第二行输入摘苹果人的身高,附加条件是一把30cm高的椅子,求最后能摘下来的苹果的数量

int main()
{
	int arr[20];//定义一个数组

	int 椅子高 = 30;
	int TH;			//定义触碰的高度,但因为要后面输入指定数字所以没写,用cin输入
	int ans = 0;	//摘下的苹果数,在没有进行判断前,默认0

	//10个数组放10个苹果的高度
	for (int i = 0; i < 10; i++)
	{
		cin >> arr[i];//运用for循环填充每一个数组的内容
	}

	cin >> TH;//输入能够碰到的高度

	for (int i = 0; i < 10; i++) //运用for循环让每一个数组轮流出场,进行判断
	{
		if (arr[i] <= (椅子高 + TH))//判断数组(苹果高度)与椅子高度加触碰高度的大小,满足则ans自增1
			ans++;
	}
	//获取数据后输出ans的数字,即能够摸到苹果的数量
	cout << ans << endl;
	return 0;
}
posted @ 2021-12-05 16:05  TommyZeng  阅读(431)  评论(0)    收藏  举报