洛谷题单-高精度

# 洛谷题单-高精度
### 加法
![在这里插入图片描述](https://img-blog.csdnimg.cn/96f8a0b754fd425186cdcbe2a1e9dd08.png)
[传送门](https://www.luogu.com.cn/problem/P1601)
```cpp
#include <bits/stdc++.h>
using namespace std;
// https://www.luogu.com.cn/problem/P1601
char n1[10000], n2[10000];
int num1[10000], num2[10000];
int ans[10000];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    cin >> n1;
    cin >> n2;
    int len1 = strlen(n1);
    int len2 = strlen(n2);
    memset(num1, 0, sizeof(num1));
    memset(num2, 0, sizeof(num2));
    memset(ans, 0, sizeof(ans));
    for (int i = 1; i <= len1; i++)
    {
        num1[i] = n1[len1 - i] - '0';
        // cout << num1[i];
    }
    // cout << endl;
    for (int i = 1; i <= len2; i++)
    {
        num2[i] = n2[len2 - i] - '0';
        // cout << num2[i];
    }
    // cout << endl;
    int lenc = 1;
    int mod1 = 0;
    while (lenc <= len1 || lenc <= len2)
    {
        ans[lenc] = num1[lenc] + num2[lenc] + mod1;
        mod1 = ans[lenc] / 10;
        ans[lenc] %= 10;
        lenc++;
    }
    ans[lenc] = mod1;
    if (ans[lenc] == 0)
        lenc--; //防止上一位0
    for (int i = lenc; i > 0; i--)
    {
        cout << ans[i];
    }
    return 0;
}
```
### 减法
![在这里插入图片描述](https://img-blog.csdnimg.cn/a561b69937f249d7bc39336087fc8516.png)
[传送门](https://www.luogu.com.cn/problem/P2142)
```cpp
#include <bits/stdc++.h>
using namespace std;
// https://www.luogu.com.cn/problem/P2142
char n1[1000000], n2[1000000];
char remp[1000000];
int num1[1000000], num2[1000000];
int ans[1000000];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    cin >> n1 >> n2;
    if (strlen(n1) < strlen(n2) || (strlen(n1) == strlen(n2) && strcmp(n1, n2) < 0))
    {
        //当被减数小于减数时,两者交换,且加上“-”
        strcpy(remp, n1);
        strcpy(n1, n2);
        strcpy(n2, remp);
        cout << "-";
    }
    int len1 = strlen(n1);
    int len2 = strlen(n2);
    for (int i = 1; i <= len1; i++)
    {
        num1[i] = n1[len1 - i] - '0';
    }
    for (int i = 1; i <= len2; i++)
    {
        num2[i] = n2[len2 - i] - '0';
    }

    int lenc = 1;
    while (lenc <= len1 || lenc <= len2)
    {
        if (num1[lenc] < num2[lenc])
        {
            num1[lenc] += 10;
            num1[lenc + 1]--;
        }
        ans[lenc] = num1[lenc] - num2[lenc];
        // cout << num1[lenc] << " " << num2[lenc] << " " << ans[lenc] << " " << lenc << endl;
        lenc++;
    }
    while (ans[lenc] == 0 && lenc > 1) // lenc大于1不是大于等于!
    {
        lenc--;
    }
    for (int i = lenc; i >= 1; i--)
    {
        cout << ans[i];
    }
}
```
### 乘法
![在这里插入图片描述](https://img-blog.csdnimg.cn/ee49fb78746842e69576df8e70efca78.png)
[传送门](https://www.luogu.com.cn/problem/P1303)
```cpp
#include <bits/stdc++.h>
using namespace std;
char n1[1000000], n2[1000000];
int num1[1000000], num2[1000000], ans[1000000];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    cin >> n1;
    cin >> n2;
    int len1 = strlen(n1);
    int len2 = strlen(n2);
    for (int i = 1; i <= len1; i++)
    {
        num1[i] = n1[len1 - i] - '0';
    }
    for (int i = 1; i <= len2; i++)
    {
        num2[i] = n2[len2 - i] - '0';
    }
    for (int i = 1; i <= len1; i++)
    {
        int mod1 = 0; //用来进位
        for (int j = 1; j <= len2; j++)
        {
            ans[i + j - 1] += num1[i] * num2[j] + mod1;
            mod1 = ans[i + j - 1] / 10;
            ans[i + j - 1] %= 10;
        }
        ans[i + len2] = mod1;
    }
    int lenc = len1 + len2;
    while (lenc > 1 && ans[lenc] == 0)
        lenc--;
    for (int i = lenc; i > 0; i--)
        cout << ans[i];
    return 0;
}
```
### 除法
![在这里插入图片描述](https://img-blog.csdnimg.cn/1ddcd9fe9a1344478e0100891be328f7.png)
[传送门](https://www.luogu.com.cn/problem/P1480)
```cpp
#include <bits/stdc++.h>
using namespace std;
char n1[1000000];
int num1[1000000], ans[1000000];
long long num2;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    cin >> n1;
    cin >> num2;
    int len1 = strlen(n1);
    for (int i = 1; i <= len1; i++)
    {
        num1[i] = n1[i - 1] - '0';
    }
    long long mod1 = 0;
    for (int i = 1; i <= len1; i++)
    {
        ans[i] = (mod1 * 10 + num1[i]) / num2;
        // cout<<ans[i]<<endl;
        mod1 = (mod1 * 10 + num1[i]) % num2;
    }
    int lenc = 1;
    while (lenc < len1 && ans[lenc] == 0)
        lenc++;

    for (int i = lenc; i <= len1; i++)
        cout << ans[i];
    return 0;
}
```
### 平台目难度颜色标识含义 平台通过不同的颜色来区分目的难度等级,这些颜色代表了不同水平的学习者可以挑战的目范围。以下是具体的颜色及其对应的难度解释: - **红色**:表示入门级难度,适合初学者练习基础算法和编程逻辑[^2]。 - **橙色**:稍高于入门级,通常涉及一些简的数据结构或基本算法的应用[^2]。 - **黄色**:中级难度,可能需要掌握更复杂的算法或者优化技巧[^2]。 - **绿色**:较高难度,通常涉及到较深入的数据结构和算法设计,适合有一定经验的选手。 - **蓝色**:高级难度,这类目往往需要较强的思维能力和扎实的基础知识[^2]。 - **紫色**:非常难,通常是竞赛级别的难,解决这些问需要极高的技巧和创造力。 - **深蓝色(常被误称为“黑”)**:最高难度级别之一,几乎只有顶尖选手才能完成此类目[^1]。 值得注意的是,“黑”的称呼实际上来源于社区习惯叫法,尽管其显示的颜色为深蓝而非真正的黑色。 对于新手而言,在面对远超出当前能力范围的目时可能会感到困惑甚至无法理解目本身的要求[^1]。因此建议按照个人实际水平循序渐进地挑选合适难度的习进行训练。 下面提供一段基于Java实现的例子程序用于演示如何处理特定类型的算法——删数问: ```java import java.util.Scanner; public class DeleteNumbers { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String numberString = scanner.next(); // 输入高精度整数作为字符串 int deleteCount = scanner.nextInt(); // 删除的数量 StringBuilder resultBuilder = new StringBuilder(); int remainingLength = numberString.length() - deleteCount; int leftPointer = -1, hasDigitAppearedYet = 0; for(int indexToFill = 0; indexToFill < remainingLength; ++indexToFill){ char minimalCharInWindow = '9'+1 ; for( int windowStartIndex = leftPointer + 1 ; windowStartIndex <= numberString.length()-remainingLength+indexToFill ; ++windowStartIndex ){ if(numberString.charAt(windowStartIndex)<minimalCharInWindow){ leftPointer = windowStartIndex; minimalCharInWindow = numberString.charAt(leftPointer); } } if(minimalCharInWindow != '0') hasDigitAppearedYet = 1; if(hasDigitAppearedYet==1 || indexToFill+1 >= remainingLength ) resultBuilder.append(minimalCharInWindow); } System.out.println(resultBuilder.toString()); } } ``` ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值