Code:



// 计算器.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <algorithm>
#include <conio.h>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <windows.h>
using namespace std;

const int MR = 4000;
const int ARRAY_SIZE = MR * 4;
const int MIN_I32 = int(-1e9);

struct HA {
	int v[MR] = { 0 };
	int l = 0;
	bool burden = false;
	void set(long long k) {	//将高精度数值初始化为k
		memset(v, 0, ARRAY_SIZE);
		l = 0;
		while (k > 0) {
			v[++l] = k % 10;
			k /= 10;
		}
	}

	void set(string s) {//初始化为string s
		memset(v, 0, ARRAY_SIZE);
		l = s.size();
		for (int i = 1; i <= l; i++)
			v[i] = s[l - i] - '0';
	}

	void print(int ST = 0, int separate = MIN_I32) {
		//输出高精度的结果
		if (burden)	printf("-");
		for (int i = l; i >= 1; i--) {
			if (i % separate == 0 && separate != MIN_I32 && i != l)	printf(",");
			printf("%d", v[i]);
			Sleep(ST);
		}
		printf("\n");
	}

	HA(string s = "0") { set(s); }
};

bool operator==(const HA& a, const HA& b) {
	if (a.l != b.l)	return false;
	for (int i = 1; i <= a.l; i++) {
		if (a.v[i] != b.v[i])	return false;
	}
	return true;
}

HA operator+(const HA& a, const HA& b) {
	//清零 计算 复位
	HA c("0");

	c.l = max(a.l, b.l);
	for (int i = 1; i <= c.l; i++) {
		c.v[i] += a.v[i] + b.v[i];
		c.v[i + 1] = c.v[i] / 10;
		c.v[i] %= 10;
	}

	if (c.v[c.l + 1]) c.l++;
	return c;
}

HA operator+(const HA& a, const int& k) {
	//清零 计算 复位
	HA c("0");
	HA b;
	b.set(k);

	c.l = max(a.l, b.l);
	for (int i = 1; i <= c.l; i++) {
		c.v[i] += a.v[i] + b.v[i];
		c.v[i + 1] = c.v[i] / 10;
		c.v[i] %= 10;
	}

	if (c.v[c.l + 1]) c.l++;
	return c;
}


bool operator<(const HA& a, const HA& b) {
	if (a.l != b.l)	return (a.l < b.l);
	for (int i = a.l; i >= 1; i--)
		if (a.v[i] != b.v[i])	return a.v[i] < b.v[i];
	return false;
}

HA operator-(const HA& a, const HA& b) {
	HA c("0");

	c.l = a.l;
	for (int i = 1; i <= c.l; i++) {
		c.v[i] += a.v[i] - b.v[i] + 10;
		c.v[i + 1] = c.v[i] / 10 - 1;
		c.v[i] %= 10;
	}

	while (c.l > 0 && c.v[c.l] == 0)	c.l--;
	return c;
}


HA operator*(const HA& a, const long long& k) {
	HA c("0");
	long long t = 0;
	c.l = 0;
	for (int i = 1; i <= a.l || c.v[i] > 0; i++) {
		c.l++;
		t = k * a.v[i] + c.v[i];
		c.v[i + 1] = t / 10;
		c.v[i] = t % 10;
	}

	return c;

}

HA operator*(const HA& a, const HA& b) {
	HA c("0");

	c.l = a.l + b.l;
	for (int i = 1; i <= a.l; i++)
		for (int j = 1; j <= b.l; j++)
			c.v[i + j - 1] += a.v[i] * b.v[j];

	for (int i = 1; i <= c.l; i++) {
		c.v[i + 1] += c.v[i] / 10;
		c.v[i] %= 10;
	}

	if (c.v[c.l] == 0)	c.l--;
	return c;
}


HA operator/(const HA& a, const int& k) {
	HA c("0"), NOT("1061109567");
	NOT.burden = true;
	c.l = 0;

	if (k == 0) {
		return NOT;
	}

	long long rem = 0;
	for (int i = a.l; i >= 1; i--) {
		rem = rem * 10 + a.v[i];
		c.v[i] = rem / k;
		rem %= k;
		if (c.l == 0 && c.v[i] > 0)	c.l = i;
	}

	return c;
}

HA operator/(const HA& a, const HA& k) {
	HA c("0"), Z("0"), NOT("1061109567");
	NOT.burden = true;
	c.l = 0;
	if (k == Z) {
		return NOT;
	}
	HA rem("0");
	for (int i = a.l; i >= 1; i--) {
		rem = rem * 10 + a.v[i];
		while (!(rem < k)) {
			rem = rem - k;
			c.v[i]++;
		}
		if (c.l == 0 && c.v[i] > 0)	c.l = i;
	}

	return c;
}

HA operator%(const HA& a, const HA& b) {
	return a - a / b * b;
}

HA operator%(const HA& a, const int& k) {
	return a - a / k * k;
}

HA calcminus(HA x, HA y) {
	if (x == y) {
		HA cnt("0");
		return cnt;
	}
	if (x < y) {
		HA cnt = y - x;
		cnt.burden = true; // 设置负号
		return cnt;
	}
	return x - y;
}

HA inputProcessing_NOTGUI() {
	string s, t;
	char calcchar;
	cin >> calcchar;
	cin >> s >> t;
	HA a(s), b(t), cnt;
	switch (calcchar) {
	case '+':cnt = a + b; break;
	case '-':cnt = calcminus(a, b); break;
	case '*':cnt = a * b; break;
	case '/':cnt = a / b; break;
	case '%':cnt = a % b; break;
	default:break;
	}
	return cnt;
}

int tmp = 1;
bool temp = false;

void inputProcessing_GUI() {
	system("cls");
	string s = "", t = "";
	char calcchar;

	char c = char(0);
	while (tmp != 3) {
		c = _getch();
		printf("%c", c);
		if (int(c) >= 48 && int(c) <= 57 && tmp == 1) {
			s += c;
		}
		else if (int(c) >= 48 && int(c) <= 57 && tmp == 2) {
			t += c;
			temp = false;
		}
		else if ((c == '+' || c == '-' || c == '*' || c == '/' || c == '%') && !temp) {
			tmp += 1;
			temp = true;
			calcchar = c;
		}
		else if (c == char(13) || c == '=') {
			break;
		}
		else if (c == char(8)) {
			if (tmp == 1 && !temp) {
				if (s.size() > 0) {
					s.pop_back();
					system("cls");
					cout << s;
				}

			}
			else if (tmp == 2 && !temp) {
				if (t.size() > 0) {
					t.pop_back();
					system("cls");
					cout << s << calcchar << t;
				}
				else {
					tmp -= 1;
					temp = false;
				}
			}
			else if (temp) {
				calcchar = char(0);
				temp = false;
				tmp -= 1;
				system("cls");
				cout << s;
			}
		}
		else {
			continue;
		}
	}
	if (s.size() == 0 || t.size() == 0 || calcchar == char(0)) {
		return;
	}
	HA a(s), b(t), cnt;
	switch (calcchar) {
	case '+':cnt = a + b; break;
	case '-':cnt = calcminus(a, b); break;
	case '*':cnt = a * b; break;
	case '/':cnt = a / b; break;
	case '%':cnt = a % b; break;
	default:break;
	}
	system("cls");
	//cout << s << calcchar << t;
	if (!(cnt.l <= 10)) {
		cnt.print(0, 3);
	}
	else {
		cnt.print(100, 3);
	}
}

int main() {
	while (true) {
		tmp = 1;
		temp = false;
		inputProcessing_GUI();
		while (true) {
			printf("按下回车键继续,Ctrl+C以退出...\n");
			char h = _getch();
			if (h == char(13)) {
				break;
			}
			if (h == char(3)) {
				exit(0);
			}
		}
	}
	return 0;
}
//SLSI_Code腾渊科技
//RmpjXzIwMTPohb7muIpf5bm/5bee
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件


5 条评论

  • @ 2025-4-23 22:29:39

    该版本开发中,别用

    #include <algorithm>
    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #ifdef _WIN32
    #include <conio.h> // Windows 平台
    #else
    #include <termios.h>
    #include <unistd.h>
    char getch() {
        struct termios oldt, newt;
        tcgetattr(STDIN_FILENO, &oldt);
        newt = oldt;
        newt.c_lflag &= ~(ICANON | ECHO);
        tcsetattr(STDIN_FILENO, TCSANOW, &newt);
        char ch = getchar();
        tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
        return ch;
    }
    #define _getch getch
    #endif
    
    using namespace std;
    
    const int MR = 4000;
    const int ARRAY_SIZE = MR * 4;
    const int MIN_I32 = int(-1e9);
    
    void clearScreen() {
    #ifdef _WIN32
        system("cls");
    #else
        printf("\033[H\033[J"); // ANSI 清屏命令
    #endif
    }
    
    struct HA {
        int v[MR] = { 0 };
        int l = 0;
        int decimalPlaces = 0; // 小数位数
        bool burden = false;
    
        void set(long long k) {
            memset(v, 0, ARRAY_SIZE);
            l = 0;
            while (k > 0) {
                v[++l] = k % 10;
                k /= 10;
            }
        }
    
        void set(string s) {
            memset(v, 0, ARRAY_SIZE);
            l = 0;
            decimalPlaces = 0;
            size_t dotPos = s.find('.');
            if (dotPos != string::npos) {
                decimalPlaces = s.size() - dotPos - 1;
                s.erase(dotPos, 1); // 移除小数点
            } else {
                decimalPlaces = 0; // 输入为整数,默认小数位为 0
            }
            l = s.size();
            for (int i = 1; i <= l; i++)
                v[i] = s[l - i] - '0';
        }
    
        void print(int ST = 0, int separate = MIN_I32, int maxDecimalPlaces = -1) {
            if (burden) printf("-");
    
            // 计算整数部分和小数部分的分割点
            int split = l - decimalPlaces;
            if (maxDecimalPlaces >= 0) {
                // 如果指定了最大小数位数,则调整分割点
                split = max(l - maxDecimalPlaces, 0);
            }
    
            for (int i = l; i >= 1; i--) {
                if (i == split && (decimalPlaces > 0 || maxDecimalPlaces >= 0)) printf(".");
                if (i % separate == 0 && separate != MIN_I32 && i != l) printf(",");
                if (i > split || (i == split && maxDecimalPlaces >= 0)) {
                    printf("%d", v[i]);
                } else {
                    printf("0"); // 补零
                }
                usleep(ST * 1000); // 使用 usleep 替代 Sleep,单位为微秒
            }
            printf("\n");
        }
    
        HA(string s = "0") { set(s); }
    };
    
    bool operator==(const HA& a, const HA& b) {
        if (a.l != b.l || a.decimalPlaces != b.decimalPlaces) return false;
        for (int i = 1; i <= a.l; i++) {
            if (a.v[i] != b.v[i]) return false;
        }
        return true;
    }
    
    HA operator+(const HA& a, const HA& b) {
        HA c("0");
        c.decimalPlaces = max(a.decimalPlaces, b.decimalPlaces);
    
        c.l = max(a.l, b.l);
        for (int i = 1; i <= c.l; i++) {
            c.v[i] += a.v[i] + b.v[i];
            c.v[i + 1] = c.v[i] / 10;
            c.v[i] %= 10;
        }
    
        if (c.v[c.l + 1]) c.l++;
        return c;
    }
    
    HA operator-(const HA& a, const HA& b) {
        HA c("0");
    
        c.l = a.l;
        for (int i = 1; i <= c.l; i++) {
            c.v[i] += a.v[i] - b.v[i] + 10;
            c.v[i + 1] = c.v[i] / 10 - 1;
            c.v[i] %= 10;
        }
    
        while (c.l > 0 && c.v[c.l] == 0) c.l--;
        return c;
    }
    
    HA operator*(const HA& a, const HA& b) {
        HA c("0");
        c.decimalPlaces = a.decimalPlaces + b.decimalPlaces;
    
        c.l = a.l + b.l;
        for (int i = 1; i <= a.l; i++)
            for (int j = 1; j <= b.l; j++)
                c.v[i + j - 1] += a.v[i] * b.v[j];
    
        for (int i = 1; i <= c.l; i++) {
            c.v[i + 1] += c.v[i] / 10;
            c.v[i] %= 10;
        }
    
        if (c.v[c.l] == 0) c.l--;
        return c;
    }
    
    HA operator*(const HA& a, int k) {
        HA c("0");
        c.decimalPlaces = a.decimalPlaces;
    
        c.l = a.l;
        for (int i = 1; i <= c.l; i++) {
            c.v[i] += a.v[i] * k;
            c.v[i + 1] += c.v[i] / 10;
            c.v[i] %= 10;
        }
    
        while (c.v[c.l + 1]) {
            c.l++;
            c.v[c.l + 1] += c.v[c.l] / 10;
            c.v[c.l] %= 10;
        }
    
        return c;
    }
    
    HA operator+(const HA& a, int k) {
        HA c = a;
        c.v[1] += k;
        for (int i = 1; i <= c.l; i++) {
            c.v[i + 1] += c.v[i] / 10;
            c.v[i] %= 10;
        }
        if (c.v[c.l + 1]) c.l++;
        return c;
    }
    
    bool operator<(const HA& a, const HA& b) {
        if (a.l != b.l) return a.l < b.l;
        for (int i = a.l; i >= 1; i--) {
            if (a.v[i] != b.v[i]) return a.v[i] < b.v[i];
        }
        return false; // 如果完全相等,则返回 false
    }
    
    HA operator/(const HA& a, const HA& b) {
        HA c("0"), Z("0"), NOT("1061109567");
        NOT.burden = true;
        if (b == Z) {
            return NOT; // 除零错误
        }
    
        HA rem("0");
        int totalDecimalPlaces = max(a.decimalPlaces, b.decimalPlaces);
    
        // 消除小数点影响
        HA scaledA = a, scaledB = b;
        scaledA.l += scaledA.decimalPlaces;
        scaledB.l += scaledB.decimalPlaces;
        scaledA.decimalPlaces = 0;
        scaledB.decimalPlaces = 0;
    
        // 计算商
        for (int i = scaledA.l; i >= 1; i--) {
            rem = rem * 10 + scaledA.v[i]; // 使用修复后的 operator*
            while (!(rem < scaledB)) {    // 使用修复后的 operator<
                rem = rem - scaledB;
                c.v[i]++;
            }
            if (c.l == 0 && c.v[i] > 0) c.l = i;
        }
    
        // 设置结果的小数位数
        c.decimalPlaces = totalDecimalPlaces ? totalDecimalPlaces : 2; // 默认至少两位小数
        return c;
    }
    
    HA operator%(const HA& a, const HA& b) {
        HA Z("0"), NOT("1061109567");
        NOT.burden = true;
        if (b == Z) {
            return NOT; // 除零错误
        }
    
        HA rem = a;
        while (!(rem < b)) {
            rem = rem - b;
        }
        return rem;
    }
    
    HA calcminus(HA x, HA y) {
        if (x == y) {
            HA cnt("0");
            return cnt;
        }
        if (x < y) {
            HA cnt = y - x;
            cnt.burden = true; // 设置负号
            return cnt;
        }
        return x - y;
    }
    
    HA inputProcessing_NOTGUI() {
        string s, t;
        char calcchar;
    
        // 读取运算符和两个操作数
        cin >> calcchar;
        cin >> s >> t;
    
        HA a(s), b(t), cnt; // 自动处理小数点
        switch (calcchar) {
        case '+': cnt = a + b; break;
        case '-': cnt = calcminus(a, b); break;
        case '*': cnt = a * b; break;
        case '/': cnt = a / b; break;
        case '%': cnt = a % b; break;
        default: break;
        }
    
        return cnt;
    }
    
    int tmp = 1;
    bool temp = false;
    
    void inputProcessing_GUI() {
        clearScreen();
        string s = "", t = "";
        char calcchar = '\0';
    
        char c = '\0';
        bool decimalPointUsedInS = false; // 标记第一个操作数是否已使用小数点
        bool decimalPointUsedInT = false; // 标记第二个操作数是否已使用小数点
    
        while (tmp != 3) {
            c = _getch();
            printf("%c", c);
    
            if ((int(c) >= 48 && int(c) <= 57) && tmp == 1) { // 数字输入
                s += c;
            } else if ((int(c) >= 48 && int(c) <= 57) && tmp == 2) { // 数字输入
                t += c;
                temp = false;
            } else if (c == '.' && tmp == 1 && !decimalPointUsedInS) { // 第一个操作数的小数点
                s += c;
                decimalPointUsedInS = true;
            } else if (c == '.' && tmp == 2 && !decimalPointUsedInT) { // 第二个操作数的小数点
                t += c;
                decimalPointUsedInT = true;
            } else if ((c == '+' || c == '-' || c == '*' || c == '/' || c == '%') && !temp) { // 运算符输入
                tmp += 1;
                temp = true;
                calcchar = c;
            } else if (c == char(13) || c == '=') { // 回车键或等号
                break;
            } else if (c == char(8)) { // 退格键
                if (tmp == 1 && !temp) {
                    if (s.size() > 0) {
                        if (s.back() == '.') decimalPointUsedInS = false; // 撤销小数点标记
                        s.pop_back();
                        clearScreen();
                        cout << s;
                    }
                } else if (tmp == 2 && !temp) {
                    if (t.size() > 0) {
                        if (t.back() == '.') decimalPointUsedInT = false; // 撤销小数点标记
                        t.pop_back();
                        clearScreen();
                        cout << s << calcchar << t;
                    } else {
                        tmp -= 1;
                        temp = false;
                    }
                } else if (temp) {
                    calcchar = '\0';
                    temp = false;
                    tmp -= 1;
                    clearScreen();
                    cout << s;
                }
            } else {
                continue; // 忽略其他无效输入
            }
        }
    
        if (s.size() == 0 || t.size() == 0 || calcchar == '\0') {
            return; // 输入不完整时退出
        }
    
        HA a(s), b(t), cnt; // 自动处理小数点
        switch (calcchar) {
        case '+': cnt = a + b; break;
        case '-': cnt = calcminus(a, b); break;
        case '*': cnt = a * b; break;
        case '/': cnt = a / b; break;
        case '%': cnt = a % b; break;
        default: break;
        }
    
        clearScreen();
        cnt.print(0, 3, 20); // 输出最多 20 位小数
    }
    
    int main() {
        string s1, s2;
        cin >> s1 >> s2;
        HA a(s1), b(s2);
        HA cnt("0");
        cnt = a / b;
        cnt.print(0, 3, 20); // 输出最多 20 位小数
        return 0;
    }
    
    
    
    
    

    该版本开发中,别用

    • @ 2025-2-7 23:06:05

      已知BUG:输入时无法退出

      修复后代码的inputProcessing_GUI()函数

      void inputProcessing_GUI() {
      	system("cls");
      	string s = "", t = "";
      	char calcchar;
      
      	char c = char(0);
      	while (tmp != 3) {
      		c = _getch();
      		printf("%c", c);
      		if (int(c) >= 48 && int(c) <= 57 && tmp == 1) {
      			s += c;
      		}
      		else if (int(c) >= 48 && int(c) <= 57 && tmp == 2) {
      			t += c;
      			temp = false;
      		}
      		else if ((c == '+' || c == '-' || c == '*' || c == '/' || c == '%') && !temp) {
      			tmp += 1;
      			temp = true;
      			calcchar = c;
      		}
      		else if (c == char(13) || c == '=') {
      			break;
      		}
      		else if (c == char(8)) {
      			if (tmp == 1 && !temp) {
      				if (s.size() > 0) {
      					s.pop_back();
      					system("cls");
      					cout << s;
      				}
      
      			}
      			else if (tmp == 2 && !temp) {
      				if (t.size() > 0) {
      					t.pop_back();
      					system("cls");
      					cout << s << calcchar << t;
      				}
      				else {
      					tmp -= 1;
      					temp = false;
      				}
      			}
      			else if (temp) {
      				calcchar = char(0);
      				temp = false;
      				tmp -= 1;
      				system("cls");
      				cout << s;
      			}
      		}
      		else if (c == char(3)){
      			exit(0);
      		}
      		else {
      			continue;
      		}
      	}
      	if (s.size() == 0 || t.size() == 0 || calcchar == char(0)) {
      		return;
      	}
      	HA a(s), b(t), cnt;
      	switch (calcchar) {
      	case '+':cnt = a + b; break;
      	case '-':cnt = calcminus(a, b); break;
      	case '*':cnt = a * b; break;
      	case '/':cnt = a / b; break;
      	case '%':cnt = a % b; break;
      	default:break;
      	}
      	system("cls");
      	//cout << s << calcchar << t;
      	if (!(cnt.l <= 10)) {
      		cnt.print(0, 3);
      	}
      	else {
      		cnt.print(100, 3);
      	}
      }
      
      
      • @ 2025-2-7 17:54:48

        太历害了,我真不感想象,这是个小学生的代码。

        • @ 2025-2-7 14:28:14

          注意:

          • 请务必确认是在windows运行且不缺少conio.h
          • MzA56KGM5Y676Zmk5YmN5Lik5Liq5a2X56ym5piv5LiA5LiqYmFzZTY0
          • @ 2025-2-7 14:20:49

            引文(第三方引用也请接龙): 1.https://www.17noi.cn/discuss/67a5a5e877af2e0c458c3cfe

            • 1

            信息

            ID
            949
            时间
            1000ms
            内存
            256MiB
            难度
            1
            标签
            递交数
            367
            已通过
            94
            上传者