自己的碎碎念集合
- 2023-09-07 c++叠加三目运算符闰年计算法
- 2023-08-13 一个小题目 A+B problem
- 一、问题及解答
- 关碍
- 总结
- 2023-07-26 C的2至36进制转换函数
- 一、itoa()函数的示例代码
- 总结
- 2023-07-19 平面坐标下判断三角形以及输出周长和面积
- 一. 基本知识
- 总结
- 2023-06-25 达芬奇去除白背景水印
- 一、具体步骤
- 总结
- 2023-06-20 将Libreoffice PPT 文档转换为txt文字
- 2023-05-19 C语言非流输入
- 一、windows平台
- 二、linux平台
- 总结
- 2023-05-11 字符与数组的运用小练习_C语言
- 一、代码
- 总结
2023-09-07 c++叠加三目运算符闰年计算法
原文连接:
c++叠加三目运算符怎么看
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int x;
cin>>x;
cout<<(x%400==0?"YES":(x%4==0?(x%100!=0?"YES":"NO"):"No"));
return 0;
}
2023-08-13 一个小题目 A+B problem
一个小算法问题, 记录一下
一、问题及解答
A+B problem( A+B problem )
描述
小明有一个很大的数字,现在他想要在这个数字中间插入一个+号,来求出这个数的结果,并且他还想知道,这些数中哪个数末尾0最多。
输入
第一行一个整数T(t<=100)表示数据组数
接下来有T行,每行一个数字字符(长度在10^5,最高位不为0)
输出
T行,每行一个整数,表示0最多有多少个
输入
2
2017
44445555
输出
0
3
关碍
条件是数字字符长度在10^5, 内置int类型不可能满足, 意味着可能用到高精度, 但本题不用.
因为只是求末尾0, 意味着算法简单很多.
如果最后一个字符数字是x, 只需在数字串中的其它部分找到的10-x, 如果x为0, 只需找到其它的0的个数即可.
#include <iostream>
#include <string>
auto getLastChar(char num) -> char
{
char res = static_cast<char>('9' + '1' - num);
return (res == '9' + 1) ? '0' : res;
}
auto countZero(const std::string &str) -> int
{
char chr = getLastChar(str.back());
int cnt = 0;
for (const auto &i : str)
{
if (i == chr)
{
cnt++;
}
}
return (chr == '5' || chr == '0') ? cnt - 1 : cnt;
}
auto main() -> int
{
int T = 0;
std::cin >> T;
std::vector<std::string> vecStr;
vecStr.reserve(T);
std::string str;
for (int i = 0; i != T; ++i)
{
std::cin >> str;
vecStr.push_back(str);
}
for (int i = 0; i != T; ++i)
{
std::cout << countZero(vecStr[i]) << '\n';
}
return 0;
}
总结
算法不难, 但需要绕个小弯儿.
2023-07-26 C的2至36进制转换函数
有一些C语言初学者学语言的时候比较囫囵吞枣, 最简单的整数转2至36进制函数, 根本没听说过, 还有自己造轮子, 关键还写不对, 其实多看看书, 多查查资料, 有时候可以省很多时间.
一、itoa()函数的示例代码
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
char digStr[64];
int main()
{
SetConsoleOutputCP(65001);
int number = 123456;
itoa(number, digStr, 2);
printf("数字:%d 转换后的字符串为:%s\n", number, digStr);
number = -123456;
itoa(number, digStr, 2);
printf("数字:%d 转换后的字符串为:%s\n", number, digStr);
return 0;
}
总结
代码简单, 函数语义清晰, 简单记录一下.
2023-07-19 平面坐标下判断三角形以及输出周长和面积
平面坐标下判断三角形以及输出周长和面积, 用线性代数的简单知识.
一. 基本知识
在平面坐标, 三个点就是三个向量, 可以通过两个向量同时减去第三个向量, 形成一个顶点在原点的三角形.
我们发现, 只有一种情况三角形不能成立, 就是从原点出发的两个向量在一条直线上
我们可以简单的用向量叉乘判断三角型是否成立, 同时, 向量叉乘的结果是向量形成的平行四边形面积
平行四边形面积的一半就是三角形面积
而三角型的周长, 可以根据勾股定理得出三条边的长度, 相加得出.
以下是代码:
#include <math.h>
#include <stdio.h>
// 定义向量结构体
typedef struct
{
double x;
double y;
} Vector;
// 计算向量的差
Vector sub(Vector vecA, Vector vecB)
{
return (Vector){vecA.x - vecB.x, vecA.y - vecB.y};
}
// 计算向量的叉积
double cross(Vector vecA, Vector vecB)
{
return vecA.x * vecB.y - vecA.y * vecB.x;
}
// 计算两点之间的距离
double distance(Vector pointA, Vector pointB)
{
Vector subAB = sub(pointA, pointB);
return sqrt(subAB.x * subAB.x + subAB.y * subAB.y);
}
// 计算三角形的周长
double triPer(Vector pointA, Vector pointB, Vector pointC)
{
return distance(pointB, pointC) + distance(pointA, pointC) +
distance(pointA, pointB);
}
// 返回三角形面积, 向量叉积的二分之一的绝对值
double triArea(Vector vecA, Vector vecB, Vector vecC)
{
return fabs(cross(sub(vecB, vecA), sub(vecC, vecA))) / 2.0;
}
int main()
{
Vector pointA;
Vector pointB;
Vector pointC;
scanf("%lf %lf %lf %lf %lf %lf", &pointA.x, &pointA.y, &pointB.x, &pointB.y,
&pointC.x, &pointC.y);
double rest = triArea(pointA, pointB, pointC);
// 判断平面三点是否可构成三角形, 即叉积不为零
if (rest)
{
printf("L = %.2lf, A = %.2lf", triPer(pointA, pointB, pointC), rest);
}
else
{
printf("Impossible");
}
return 0;
}
总结
近期在学OpenGL, 顺便学点图形学, 顺便也就学点线性代数, 这就是另外一个世界了.
2023-06-25 达芬奇去除白背景水印
录视频不小心整了个水印, 当时想了几个方法, 重录, ffmpeg命令搞一下, 一张一张幻灯片导成PNG然后一张一张换, 实在是太费劲了.
于是想到这点小玩意达芬奇这么专业的软件一定有办法, 试了试, 还真行
一、具体步骤
- 进入调色界面
- 将所有片段选中, 鼠标右键, 添加到当前群组
- 在节点区域, 选择片段前群组
- 在下方的调整区, 选择窗口, 四边形, 调整大小和位置, 将水印覆盖
- 调色区选一级校色条, 亮部的亮度拉满, 水印消失
总结
没有用到收费的功能, 但只能用于白底或黑底之上的水印, 不是智能去除.
2023-06-20 将Libreoffice PPT 文档转换为txt文字
有时候需要把ppt的文字内容抓出来, 想了一些办法, 没有成功, 后来发现直接用软件的内置功能即可:
文件: 在浏览器中预览
2023-05-19 C语言非流输入
一个有意思的问题c语言的输入输出问题, 网上很多答案, 总结一下.
一、windows平台
vs需要将getch()更改为_getch()
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
char chrArr[32];
int main()
{
int i = 0;
while ((chrArr[i] = getch()) && (chrArr[i] != '\r'))
{
++i;
}
char *num;
int lhs = strtol(chrArr, &num, 10);
int rhs = atoi(num);
printf("%d %d %d", lhs, rhs, lhs + rhs);
}
二、linux平台
#include <stdio.h>
#include <stdlib.h>
#include <termio.h>
#include <stdbool.h>
int getch(void)
{
return getchar();
}
void setio(bool bl)
{
static struct termios tm, tm_old;
if (bl)
{
tcgetattr(0, &tm);
tm_old = tm;
cfmakeraw(&tm); // 更改终端设置为原始模式,该模式下所有的输入数据以字节为单位被处理
tcsetattr(0, TCSANOW, &tm);
}
else
{
tcsetattr(0, TCSANOW, &tm_old);
}
}
char chrArr[32];
int main()
{
setio(true);
int i = 0;
while ((chrArr[i] = getch()) && (chrArr[i] != '\r'))
{
++i;
}
setio(false);
char *num;
int lhs = strtol(chrArr, &num, 10);
int rhs = atoi(num);
printf("%d %d %d\n", lhs, rhs, lhs + rhs);
}
总结
vs要用 _getch(), mingw和clang用getch(), linux平台需要自己实现, 这不是标准库中的东西, 所以不可移植…
2023-05-11 字符与数组的运用小练习_C语言
一个问答题: 字符与数组的运用 , 考察知识点: scanf的使用, 字符串数组, 字符在C语言本质是整数, 循环, 分支.
一、代码
一道小题目, 考的知识点包括了C语言输入输出, 字符类的本质, 循环, 分支, 挺好的.
#include <stdio.h>
#include <string.h>
char strArr[100][100];
void encrypted(char *chr);
int main()
{
int index = 0;
// INT DOUBLE FOR WHILE
// RETURN
while (scanf("%s", strArr[index]) != EOF)
{
for (int i = 0; i != strlen(strArr[index]); i++)
{
encrypted(strArr[index] + i);
}
index++;
}
for (int i = 0; i != index; i++)
{
printf("%s\n", strArr[i]);
}
return 0;
}
void encrypted(char *chr)
{
switch (*chr)
{
case 'A':
*chr = 'N';
break;
case 'B':
*chr = 'O';
break;
case 'C':
*chr = 'P';
break;
case 'D':
*chr = 'Q';
break;
case 'E':
*chr = 'R';
break;
case 'F':
*chr = 'S';
break;
case 'G':
*chr = 'T';
break;
case 'H':
*chr = 'U';
break;
case 'I':
*chr = 'V';
break;
case 'J':
*chr = 'W';
break;
case 'K':
*chr = 'X';
break;
case 'L':
*chr = 'Y';
break;
case 'M':
*chr = 'Z';
break;
case 'N':
*chr = 'A';
break;
case 'O':
*chr = 'B';
break;
case 'P':
*chr = 'C';
break;
case 'Q':
*chr = 'D';
break;
case 'R':
*chr = 'E';
break;
case 'S':
*chr = 'F';
break;
case 'T':
*chr = 'G';
break;
case 'U':
*chr = 'H';
break;
case 'V':
*chr = 'I';
break;
case 'W':
*chr = 'J';
break;
case 'X':
*chr = 'K';
break;
case 'Y':
*chr = 'L';
break;
case 'Z':
*chr = 'M';
break;
}
}
总结
出这道题的老师挺有水平.