- 【例2.1】Hello World
锚点2
- 2025-2-7 14:18:32 @
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 条评论
-
方均宸 LV 10 @ 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
- 上传者