一.1,2,3AC合集.预习

目录

一.快排

 二.二分

三.高精度


一.快排

边界问题参考https://blog.csdn.net/SHU15121856/article/details/109839618​​​​​​

(25条消息) 【算法学习笔记】8:快速排序中的边界问题_快速排序边界问题_LauZyHou的博客-CSDN博客

 

 

 二.二分

(2)实数二分,二次方

 #include<iostream>
 using namespace std;
 int main(){
     double x;
     cin>>x;
     
     double l=0,r=x;
     for(int i=0;i<100;i++){
         double mid=(l+r)/2;
         if(mid*mid>=x)r=mid;
         else l=mid;
     }
     printf("%lf\n",l);
     return 0;
 }
三.高精度

  1. 为了避免这种情况,只能使用字符串形式输入数据,因为字符串没有数值大小的限制。
  2.  同样是用字符串形式去输入,如果你要用整型的就会出错,几百位的数都爆掉了,所以只能用字符串的形式去输入。

(一)

for (int i = 0; i < str1.size(); i ++)
    a[i] = str1[str1.size()-1-i] - '0'; // 反转123
for (int i = 0; i < str2.size(); i ++)
    b[i] = str2[str2.size()-1-i] - '0'; // 反转24

这段代码是对字符串 `str1` 的一个字符进行处理,其中 `i` 是一个循环变量。具体解释如下:

1. `str1.size()` 表示字符串 `str1` 的长度。
2. `str1.size() - 1 - i` 表示从字符串末尾开始,第 `i` 个字符的位置。[3]的序号为2
3. `str1[str1.size() - 1 - i]` 表示字符串 `str1` 中第 `i` 个字符。
4. `'0'` 是字符型的数字 0,它是 ASCII 码表中的第 48 个字符。
5. `str1[str1.size() - 1 - i] - '0'` 表示将字符串中的数字字符转换为对应的数字值。例如,字符 `'5'` 转换为数字 5。

321

43

=89

13-4=9,11-3=8 

sout 8

sout 9

反转的时候我们顺便转化为整型,因为肯定不能用字符串去做减法是吧。

(三)

for (int i = 0; i < len; i ++) {
if (a[i] < b[i]) {//从小位开始看//不满足则直接减
a[i+1] -= 1; a[i] += 10;
}
c[i] = a[i] - b[i]; }
  • 从这里看出来,当前面的数不够也就是a[i] 不够被减,所以就要先前借一位,
    所以就有a[i+1] -= 1,相当于借了10,所以当前的数就要加10,就有a[i] += 10
  • 最后就是相减了c[i] = a[i] - b[i]

 (四)

while (c[len-1] == 0 && len > 1)
	len --;

这段代码的作用是去除一个数组 c 的末尾的 0,直到数组的最后一个元素不为 0 或者数组长度为 1。具体解释如下:

1. `c[len-1]` 表示数组 c 的最后一个元素,`len-1` 表示数组最后一个元素的下标。
2. `c[len-1] == 0` 表示数组最后一个元素是否为 0。
3. `len > 1` 表示数组长度是否大于 1。
4. `&&` 表示逻辑与运算符,当两个条件都为真时,整个表达式的值才为真。
5. `len--` 表示将数组长度减 1。

while (c[len-1] == 0 && len > 1)
    len --;

因此,这段代码的意思是,当数组 c 的最后一个元素为 0 且数组长度大于 1 时,将数组长度减 1,直到最后一个元素不为 0 或者数组长度为 1。这样可以去除数组末尾的 0,使得数组更加紧凑。

例:假设数组 c 为 {1, 2, 3, 0, 0, 0},则数组长度为 6,最后三个元素为 0。执行该段代码后,数组长度减 3,变为 3,数组变为 {1, 2, 3},去除了末尾的 0。

 #include<iostream>
#include<string>
using namespace std;
const int N = 10090;
int a[N], b[N], c[N];
int flag = 0;
int main()
{
    string str1;
    string str2;
    cin >> str1;
    cin >> str2;
    if ((atoi(str1.c_str()) < atoi(str2.c_str()) && str1.size() == str2.size()) || str1.size() < str2.size()){
        swap(str1, str2);
        flag = 1;
    }
    for (int i = 0; i < str1.size(); i ++)
        a[str1.size()-1-i] = str1[i] - '0';
    for (int i = 0; i < str2.size(); i ++)
        b[str2.size()-i-1] = str2[i] - '0';
    int ans = max(str1.size(), str2.size());
    for (int i = 0; i < ans; i ++){
        if (a[i] < b[i]){
            a[i+1] -= 1; // 向前位借一位
            a[i] += 10;  // 后一位就得加10
        }c[i] = a[i] - b[i];  // 之后就是正常减法了
    }
    while (c[ans-1] == 0 && ans > 1)
        ans -= 1;
    if (flag == 1)
        cout << "-";
    for (int i = 0; i < ans; i ++)
        cout << c[ans-1-i];
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

白天的我最菜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值