#include<bits/stdc++.h>
#include <windows.h>
#define ll long long
#define ri register int
using namespace std;
int tot;
void solve(char p[],char a[]) {
int c[2005];
memset(c,0,sizeof(c));
int lenp=strlen(p),lena=strlen(a);
lenp=min(lenp,1000),lena=min(lena,1000);
for (ri i=0; i<lenp; i++) {
for (ri j=0; j<lena; j++) {
c[i+j]+=(p[i]-'0')*(a[j]-'0');
if(c[i+j]>9) {
c[i+j+1]+=c[i+j]/10;
c[i+j]%=10;
}
}
}
int cnt=lena+lenp;
while(c[cnt]==0&&cnt>0)cnt--;
for (ri i=0; i<=cnt; i++)
p[i]=c[i]+'0';
p[cnt+1]='\0';
tot=cnt;
}
void SetColorAndBackground(int ForgC, int BackC) {
WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor);
}
void color(int x) {
if(x>=0 && x<=15)
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);
else
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
int main() {
//system("color B4");
printf(" 计算器 \n");
color(4);
printf("这是一个简易计算器,您可以用它计算很大的数\n");
printf("目前支持加、减、乘、除、乘方、阶乘六种运算。");
color(3);
printf("\n\n请选择操作:\n\n");
printf("1:了解输入规则,2:开始计算(建议先了解输入规则)\n\n");
int num;
cin>>num;
if(num==1) {
color(5);
printf("\n输入规则:\n\n本计算器仅支持加(+)、减(-)、乘(*)、除(/)、乘方(^)、阶乘(!)、模(%)七种运算,目前不支持小数。\n\n");
printf("加、减、乘均为高精与高精相运算,输入请先输入运算符,然后换行,再输入两个相运算的数,注意它们之间用空格隔开\n\n");
printf("除、乘方、模均为高精与低精相运算,输入格式同上\n\n");
printf("阶乘比较特殊,请先输入运算符,再输入一个数,注意不能太大,毕竟阶乘的结果很大\n\n");
SetColorAndBackground(7,4);
printf("by @Ggsddu_zzy");
SetColorAndBackground(15,0);
}
if(num==2) {
while(true) {
color(6);
printf("请输入运算符:\n");
char s;
cin>>s;
if(s=='+') {
char s1[100010],s2[100010];
int a[100010],b[100010];
printf("请输入加数1:");
scanf("%s",s1);
printf("请输入加数2:");
scanf("%s",s2);
int la=strlen(s1);
int lb=strlen(s2);
for(ri i=1; i<=la; i++)
a[i]=s1[la-i]-'0';
for(ri i=1; i<=lb; i++)
b[i]=s2[lb-i]-'0';
la=max(la,lb);
for (ri i=1; i<=la; i++)
a[i]=a[i]+b[i];
for (ri i=1; i<=la; i++) {
a[i+1]=a[i+1]+a[i]/10;
a[i]=a[i]%10;
}
if (a[la+1]==1) la++;
printf("和:");
for (ri i=la; i>=1; i--)
printf("%d",a[i]);
printf("\n");
}
if(s=='-') {
char s1[100010],s2[100010],s3[100010];
int a[100010],b[100010];
printf("请输入被减数:");
scanf("%s",s1);
printf("请输入减数:");
scanf("%s",s2);
int la,lb,m=0;
la=strlen(s1);
lb=strlen(s2);
if (strcmp(s1,s2)==0) {
cout<<0;
return 0;
}
if (la<lb||la==lb&&strcmp(s1,s2)<0) {
strcpy(s3,s1);
strcpy(s1,s2);
strcpy(s2,s3);
swap(la,lb);
cout<<'-';
}
for (ri i=1; i<=la; i++)
a[i]=s1[la-i]-48;
for (ri i=1; i<=lb; i++)
b[i]=s2[lb-i]-48;
for (ri i=1; i<=la; i++) {
if (a[i]<b[i]) {
a[i+1]--;
a[i]+=10;
}
a[i]-=b[i];
}
while (a[la]==0&&la>1)la--;
printf("差:");
for (ri i=la; i>=1; i--)
printf("%d",a[i]);
printf("\n");
}
if(s=='*') {
char s1[100010],s2[100010];
int a[100010],b[100010],c[100010];
printf("请输入乘数1:");
scanf("%s",s1);
printf("请输入乘数2:");
scanf("%s",s2);
int la=strlen(s1);
int lb=strlen(s2);
for(ri i=1; i<=la; i++)
a[i]=s1[la-i]-'0';
for(ri i=1; i<=lb; i++)
b[i]=s2[lb-i]-'0';
for(ri i=1; i<=la; i++)
for(ri j=1; j<=lb; j++)
c[i+j-1]+=a[i]*b[j];
int lc=la+lb-1;
for(ri i=1; i<=lc; i++) {
c[i+1]+=c[i]/10;
c[i]%=10;
}
if (c[lc+1]>0) lc++;
printf("积:");
for (int i=lc; i>=1; i--)
printf("%d",c[i]);
printf("\n");
}
if(s=='/') {
int la,lc;
char ss[100010];
int a[100010],b,c[100010];
printf("请输入被除数:");
cin>>ss;
printf("请输入除数:");
cin>>b;
lc=la=strlen(ss);
for (int i=1; i<=la; i++)
a[i]=ss[la-i]-48;
int d,r=0;
for (int i=la; i>=1; i--) {
d=r*10+a[i];
c[i]=d/b;
r=d%b;
}
while(c[lc]==0)
lc--;
printf("商:");
for (int i=lc; i>=1; i--)
printf("%d",c[i]);
printf("\n");
}
if(s=='^') {
int n;
char ans[100010];
printf("请输入指数:");
cin>>ans;
printf("请输入次数:");
cin>>n;
if(!n) printf("1\n");
int id;
reverse(ans,ans+strlen(ans));
char p[2005];
strcpy(p,"1");
while(n) {
if(n&1) {
solve(p,ans);
id=tot;
}
solve(ans,ans);
n>>=1;
}
if(id>=1000) id=999;
printf("幂:");
for (ri i=id; i>=0; i--)
printf("%c",p[i]);
printf("\n");
}
if(s=='!') {
int a[100010],l=0,ss,n;
printf("请输入:");
cin>>n;
a[0]=1;
for(ri i=1; i<=n; i++) {
ss=0;
for(ri j=0; j<=l; j++) {
ss=ss+a[j]*i;
a[j]=ss%10;
ss/=10;
}
while(ss) {
l++;
a[l]=ss%10;
ss/=10;
}
}
printf("阶乘:");
for(ri i=l; i>=0; i--)
cout << a[i];
cout<<'\n';
}
if(s=='%') {
string a;
int b,d=0;
printf("请输入被模数:");
cin>>a;
printf("请输入模数:");
cin>>b;
for(int i=0; i<a.size(); i++)
d=(d*10+(a[i]-'0'))%b;
printf("余数:");
cout<<d<<'\n';
}
}
}
return 0;
}
标签:int,计算器,--,高精,100010,printf,strlen,输入
From: https://www.cnblogs.com/zzyblog0619/p/17207994.html