首页 > 其他分享 >高精计算器

高精计算器

时间:2023-03-12 12:55:23浏览次数:35  
标签:int 计算器 -- 高精 100010 printf strlen 输入

#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

相关文章

  • #yyds干货盘点# LeetCode程序员面试金典: 计算器
    1.题目:给定一个包含正整数、加(+)、减(-)、乘(*)、除(/)的算数表达式(括号除外),计算其结果。表达式仅包含非负整数,+,-,*,/四种运算符和空格 。整数除法仅保留整数部分。......
  • 从0开始自制解释器——实现多位整数的加减法计算器
    上一篇我们实现了一个简单的加法计算器,并且了解了基本的词法分析、词法分析器的概念。本篇我们将要对之前实现的加法计算器进行扩展,我们为它添加以下几个功能计算减法能......
  • 大数科学计算器 C++
    大数计算器目录大数计算器优点实现思路自定义类MyNum类★★★Method类具体函数实现MyNum类的函数构造&三大函数数学函数转换函数运算符重载显示函数Method类的函数构......
  • 高精度模板2--zhengjun
    只支持非负数,用vectoer实现。#include<bits/stdc++.h>usingnamespacestd;usingll=unsignedlonglong;usingbigint=unsignedlonglong;usingbigbig=__int128;......
  • 调用其它可执行程序(比如计算器)
    usesshellapiShellExecute(0,'Open',ExeName,nil,nil,SW_SHOW)ExeName:='C:WinNTSystem32Calc.exe';也有可能系统不安装在C盘,建议把Calc.exe拷到程序的运行文件下E......
  • 高精度算法-加法(附完整源码)
    前言:基础的加法,类似a+b都很熟悉,但是整型之间的加法是存在范围限制的,比如int类型的范围是【-231,+231-1】,即使是longlong类型也有着【-263,+263-1】的范围,一旦超过这个范围,计......
  • 个税计算器丨用它,计算个税不用愁!!
    最近热热闹闹的退个税大潮,你退了多少呢~虽然个税软件已经为我们计算好了该交多少税、该退多少钱,直接按流程操作就好,但我们并不是很了解其中的计算过程,有网友正好开发了一......
  • flex计算器
    <?xmlversion="1.0"encoding="utf-8"?><mx:Applicationxmlns:mx="http://www.adobe.com/2006/mxml"layout="absolute"><mx:Script><![CDATA[//相加函数internal......
  • 算法基础1.3.1高精度加法
    前言该文章探讨的高精度代指C++中极大整数的计算,不是浮点数(y总说那个少见,不讲)。这个问题只在C++中存在,Java有大整数类来解决,python本身特性就已经解决了。高精度整数分......
  • 算法基础1.3.4高精度除法
    前言先看高精度加法的文章,如果没有看,我把高精度加法文章中的总结前言放到这里该文章探讨的高精度代指C++中极大整数的计算,不是浮点数(y总说那个少见,不讲)。这个问题只在C......