偷偷灌个水~主打一个没人看
2024-03-17 21:27:09
发布于:广东
105阅读
0回复
0点赞
#include <iostream>
#include <cstdio>
#include <cstring>
#include <windows.h>
#include <ctime>
#include <cmath>//一堆没用的头文件
using namespace std;
char A[100005], B[100005];
int a[100005], b[100005], c[100005], tmp[100005];//合理运用0下标表示数字长度,省去了一堆len
char x;
void print(int *a){
cout << "\n科学计数法:";
cout << a[a[0]] << '.';
int i, j;
for(i = a[0] - 1, j = 1; i >= 1 && j <= 6; i--, j++) cout << a[i];
if(a[0] == 1) cout << 0;
printf("*10^%d\n", a[0]);
}
short cmp(int *a, int *b){
if(a[0] > b[0]) return 1;
if(a[0] < b[0]) return -1;//先比较长度
for(int i = a[0]; i >= 1; i--){
if(a[i] > b[i]) return 1;
if(a[i] < b[i]) return -1;//逐位比较
}return 0;
}
void numcpy(int a[], int b[], int dst){
for(int i = 1; i <= a[0]; i++){
b[i + dst - 1] = a[i];
}b[0] = a[0] + dst - 1;//除法靠右对其函数
}
void jiafa(){//加法,时间复杂度O(lena + lenb)
c[0] = max(a[0], b[0]);
for(int i = 1; i <= c[0];i++){
c[i] += a[i] + b[i];
if(c[i] >= 10){
c[i + 1]++;
c[i] %= 10;
}//逐位相加
}
if(c[c[0] + 1]) c[0]++;
while(c[c[0]] == 0 && c[0] > 1) c[0]--;
for(int i = c[0];i >= 1;i--) cout << c[i];//倒序输出
print(c);
}
void jianfa(){//减法,时间复杂度O(lena + lenb)
bool flag = 0;
if(cmp(a, b) == -1){
cout << '-';
swap(a, b);
}//比较
//剩下的和加法一样
for(int i = 0; i <= a[0]; i++){
c[i] += a[i] - b[i];
if(c[i] < 0){
c[i] += 10;
c[i + 1]--;
}
}c[0] = a[0];
while(c[c[0]] == 0 && c[0] > 1){
c[0]--;
}
for(int i = c[0]; i >= 1; i--){
cout << c[i];
}print(c);
}
void chengfa(){//乘法,时间复杂度O(lena * lenb)
for(int i = 1; i <= a[0]; i++){
int x = 0;
for(int j = 1; j <= b[0]; j++){
int weishu = i + j - 1; //设置位数
c[weishu] += x + a[i] * b[j];//加
x = c[weishu] / 10;//进位
c[weishu] %= 10;
}
c[i + b[0]] = x;
}
c[0] = a[0] + b[0];//设置理想最高位
while(c[c[0]] == 0 && c[0] > 1) c[0]--;//去除前导0
for(int i = c[0]; i > 0; i--) cout << c[i];
print(c);
}
void chufa(){//除法,时间复杂度O(lena * lenb)
cout << endl;
short n = cmp(a, b);
if(n == -1){//如果被除数小于除数,直接输出被除数
cout << "商:0\n";
cout << "余数:";
cout << A;
return;
}
c[0] = a[0] - b[0] + 1;//理想的最高位
for(int i = c[0]; i > 0; i--){
memset(tmp, 0, sizeof(tmp));//清零tmp
numcpy(b, tmp, i);//右边对齐
while(cmp(a, tmp) >= 0){
c[i]++;
for(int j = 1; j <= a[0]; j++){//和减法一样
if(a[j] < tmp[j]){
a[j + 1]--;
a[j] += 10;
}
a[j]-=tmp[j];
}
while(a[a[0]] == 0 && a[0] > 1) a[0]--;//去除前导0
}
}while(c[0] > 1 && c[c[0]] == 0) c[0]--;
cout << "商:";
for(int i = c[0]; i > 0; i--) cout << c[i];
print(c);
cout << "余数:";
for(int i = a[0]; i > 0; i--) cout << a[i];
print(a);
}
void chengfang(){//乘方,最坏时间复杂度O(lena ^ b),运算次数最高为10^9999,一台普通电脑从宇宙爆炸到现在都没算完(不
if(B[0] == '-'){
cout << "我脑袋爆炸了TnT";
return;
}if(b[0] > 18){
cout << "我脑袋爆炸了ToT";
return;
}
long long t = 0;
for(int i = b[0]; i >= 1; i--){
t = t * 10 + b[i];
}//设置指数
memset(b, 0, sizeof(b));//清零b
b[0] = 1, b[1] = 1;//设置b的值
while(t){
if(t % 2){//快速幂
if(a[0] + b[0] > 100000){
cout << "我脑袋爆炸了TnT";
return;
}
for(int i = 1; i <= a[0]; i++){//乘法
int x = 0;
for(int j = 1; j <= b[0]; j++){
int weishu = i + j - 1;
c[weishu] += x + a[i] * b[j];
x = c[weishu] / 10;
c[weishu] %= 10;
}
c[i + b[0]] = x;
}
c[0] = a[0] + b[0];
while(c[c[0]] == 0 && c[0] > 1) c[0]--;
for(int i = 0; i <= c[0]; i++){
b[i] = c[i];
}memset(c, 0, sizeof(c));
}
if(a[0] + a[0] > 100000){
cout << "我脑袋爆炸了ToT";
return;
}
for(int i = 1; i <= a[0]; i++){//乘法,只不过是自己乘自己
int x = 0;
for(int j = 1; j <= a[0]; j++){
int weishu = i + j - 1;
c[weishu] += x + a[i] * a[j];
x = c[weishu] / 10;
c[weishu] %= 10;
}
c[i + a[0]] = x;
}
c[0] = a[0] + a[0];
while(c[c[0]] == 0 && c[0] > 1) c[0]--;
for(int i = 0; i <= c[0]; i++){
a[i] = c[i];
}memset(c, 0, sizeof(c));
t /= 2;
}
for(int i = b[0]; i >= 1; i--) cout << b[i];
print(b);
}
void _init(){
cout << "请输入第一个数:";
cin >> A;
cout << "请输入第二个数:";
cin >> B;
a[0] = strlen(A), b[0] = strlen(B);
for(int i = 0; i < a[0]; i++){
a[a[0] - i] = A[i] - '0';
}for(int i = 0; i < b[0]; i++){//一般都是倒序计算,所以这里也是倒序
b[b[0] - i] = B[i] - '0';
}
cout << "结果为:";
if(A[0] == '-') a[0]--;
if(B[0] == '-') b[0]--;
//然后就是判断是否有负数(一大坨)
if(A[0] == '-'){
if(B[0] == '-'){
if (x == 'A'){
cout << '-';
jiafa();
}if (x == 'B'){
cout << "-(";
jianfa();
cout << ')';
}if (x == 'C'){
chengfa();
}
if (x == 'D'){
chufa();
}if(x == 'E'){
chengfang();
}
}else{
if(x == 'A'){
cout << "-(";
swap(a, b);
jianfa();
cout << ')';
}if(x == 'B'){
cout << '-';
jiafa();
}if(x == 'C'){
cout << '-';
chengfa();
}if(x == 'D'){
cout << '-';
chufa();
}if(x == 'E'){
if(b[1] % 2) cout << '-';
chengfang();
}
}
}else{
if(B[0] == '-'){
if(x == 'A'){
jianfa();
}if(x == 'B'){
jiafa();
}if(x == 'C'){
cout << '-';
chengfa();
}if(x == 'D'){
cout << '-';
chufa();
}if(x == 'E'){
chengfang();
}
}else{
if(x == 'A') jiafa();
if(x == 'B') jianfa();
if(x == 'C') chengfa();
if(x == 'D') chufa();
if(x == 'E') chengfang();
}
}
}
void choose(){
while(1){
cout << "---------计算器----------\n请输入:\nA:加法\nB:减法\nC:乘法\nD:除法(不许输入负数!!!)\nE:乘方(结果必须小于10万位)\n";
cin >> x;
if(x == 'A' || x == 'B' || x == 'C' || x == 'D' || x == 'E') _init();
cout << "\n还要运算吗?1/是 2/否\n";
int n;
cin >> n;
if(n != 1){
cout << "好的!再见!";
for(int i = 1; i <= 7e8; i++) n++;
break;
}else{
system("cls");
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
memset(tmp, 0, sizeof(tmp));//清零
}
}
}
int main(){
choose();
}
全部评论 7
Are you serious?
2024-03-18 来自 上海
0更了个科学计数法
2024-03-17 来自 广东
0你知道什么叫没事儿闲的吗?
2024-01-15 来自 辽宁
0真 . 没人看
2024-01-15 来自 辽宁
01/14日更新:移除了him,将数组增大
2024-01-14 来自 广东
0完了,注释错了,改一下
2024-01-09 来自 广东
0几百行诶
2024-01-08 来自 广东
0哇!你真闲!!!
2024-03-18 来自 浙江
0
有帮助,赞一个