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 文件


6 条评论

  • @ 2025-8-13 16:19:47

    牛逼!!!

    • @ 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

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

          👍 1
          😄 1
          ❤️ 1
          • @ 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
              标签
              递交数
              386
              已通过
              104
              上传者