c++的高精度乘除法的实现代码
展开全部
先说最先看到的using namespace std;
是为了使用名称空间std
因为C++中的函数非常多,各大厂商也开发了很多自己的函数库
为了避免出现函数名重名的现象,
C++的开发者们将一些常用的函数放到std名称空间中,
各大厂商或个人也可以为自己开发的函数库命名名称空间,
以便区别。
using namespace std;
凡是函数名在std中出现的函数,都调用其中的函数。
首先你要理解如下三个函数中实现了什么。
int exp( void );
int term( void );
int factor( void );
先说int exp( void );函数
这个函数主要实现的是做加减法运算。
在判断加减法运算前,函数调用了int term( void );函数,是为了判断是否有比加减法优先级更高的运算符。
再说int term( void );函数
这个函数主要实现的是做乘除法运算。
在进行乘除法运算前,函数调用了int factor( void );函数,是为了判断是否有比乘除法运算优先级更高的运算符,即,小括号。(注:因为代码实现中没有体现出识别大括号和中括号的代码,所以这里不对中括号和大括号进行判断考虑。)
以上三个函数,是一句四则运算口诀“先乘除,后加减,有括号的先算括号中的”来编写的。
再说match()和error()函数
match()函数
主要是匹配当前获取到的字符是否与函数传入的参数是否相同,如果相同,获取下一个字符,否则调用error()函数。
Error()函数
当匹配字符发生错误时,打印"输入有错误"信息,并退出程序。
了解了如上五个函数后,现在需要知道一些系统函数是做什么的。
Isalnum();
判断此函数的参数是否为变量或字母。如果既不是数字,也不是字母,那么返回值为0。
例子:
#include <windows.h>
#include <stdio.h>
void main()
{
int x = 0;
char a = '+', b = 'k', c = '3';
printf("%d, %d, %d\n", isalnum(a), isalnum(b), isalnum(c));
}
其打印结果为0(符号),2(字母),4(数字)。
ungetc()函数
功能:把一个字符退回到输入流中。
用法:int ungetc(char c, FILE *stream);
输入参数:c 要写入的字符,stream 文件流指针。
Getchar()函数
功能:每次读取一个字符。而不是读取多个字符或所有字符。
另外想说明一点,这个计算器代码中的一些函数和变量的命名不是很好,希望以后在工作中引以为戒,例如定义了int result;变量,result其实是C代码库中的关键字,最好不将关键字定义为变量,但为了其他人能更好的读取自己写的代码的意思,可以将这个变量这样定义:int iResult = 0;(定义的变量最好初始化,这样会避免很多不必要的麻烦)
也不知道我这样写你能明白不,因为不能当面讲解,所以多少有些担心。
是为了使用名称空间std
因为C++中的函数非常多,各大厂商也开发了很多自己的函数库
为了避免出现函数名重名的现象,
C++的开发者们将一些常用的函数放到std名称空间中,
各大厂商或个人也可以为自己开发的函数库命名名称空间,
以便区别。
using namespace std;
凡是函数名在std中出现的函数,都调用其中的函数。
首先你要理解如下三个函数中实现了什么。
int exp( void );
int term( void );
int factor( void );
先说int exp( void );函数
这个函数主要实现的是做加减法运算。
在判断加减法运算前,函数调用了int term( void );函数,是为了判断是否有比加减法优先级更高的运算符。
再说int term( void );函数
这个函数主要实现的是做乘除法运算。
在进行乘除法运算前,函数调用了int factor( void );函数,是为了判断是否有比乘除法运算优先级更高的运算符,即,小括号。(注:因为代码实现中没有体现出识别大括号和中括号的代码,所以这里不对中括号和大括号进行判断考虑。)
以上三个函数,是一句四则运算口诀“先乘除,后加减,有括号的先算括号中的”来编写的。
再说match()和error()函数
match()函数
主要是匹配当前获取到的字符是否与函数传入的参数是否相同,如果相同,获取下一个字符,否则调用error()函数。
Error()函数
当匹配字符发生错误时,打印"输入有错误"信息,并退出程序。
了解了如上五个函数后,现在需要知道一些系统函数是做什么的。
Isalnum();
判断此函数的参数是否为变量或字母。如果既不是数字,也不是字母,那么返回值为0。
例子:
#include <windows.h>
#include <stdio.h>
void main()
{
int x = 0;
char a = '+', b = 'k', c = '3';
printf("%d, %d, %d\n", isalnum(a), isalnum(b), isalnum(c));
}
其打印结果为0(符号),2(字母),4(数字)。
ungetc()函数
功能:把一个字符退回到输入流中。
用法:int ungetc(char c, FILE *stream);
输入参数:c 要写入的字符,stream 文件流指针。
Getchar()函数
功能:每次读取一个字符。而不是读取多个字符或所有字符。
另外想说明一点,这个计算器代码中的一些函数和变量的命名不是很好,希望以后在工作中引以为戒,例如定义了int result;变量,result其实是C代码库中的关键字,最好不将关键字定义为变量,但为了其他人能更好的读取自己写的代码的意思,可以将这个变量这样定义:int iResult = 0;(定义的变量最好初始化,这样会避免很多不必要的麻烦)
也不知道我这样写你能明白不,因为不能当面讲解,所以多少有些担心。
展开全部
强制类型转换。比如乘法:
c=(double)a*b;
printf("%.8f",c);
就可以实现结果为8位小数。除法一样。
c=(double)a*b;
printf("%.8f",c);
就可以实现结果为8位小数。除法一样。
追问
要100位以上的
追答
我以为只要几位的,不好意思啊。
高精度计算通用方法:高精度计算时一般用一个数组来存储一个数,数组的一个元素对应于数的一位(当然,在以后的学习中为了加快计算速度,也可用数组的一个元素表示数的多位数字,暂时不讲),表示时,由于数计算时可能要进位,因此为了方便,将数由低位到高位依次存在数组下标对应由低到高位置上,另外,我们申请数组大小时,一般考虑了最大的情况,在很多情况下,表示有富余,即高位有很多0,可能造成无效的运算和判断,因此,我们一般将数组的第0个下标对应位置来存储该数的位数.如数:3485(三千四百八十五),表达在数组a[10]上情况是:
下标 0 1 2 3 4 5 6 7 8 9
内容 4 5 8 4 3 0 0 0 0 0
说明:位数 个位 十位 百位 千位
具体在计算加减乘除时方法就是小学时采用的列竖式方法.
注:高精度计算时一般用正数,对于负数,通过处理符号位的修正.
一.高精度数的存储
1.如对数采用的字符串输入
#include
#include
using namespace std;
const int N=100;//最多100位
int main()
{
int a[N+1],i;
string s1;
cin>>s1;//数s1
memset(a,0,sizeof(a)); //数组清0
a[0]=s1.length(); //位数
for(i=1;i
using namespace std;
const int N=100;//最多100位
int main()
{
int a[N+1],i,s,key;
cin>>key;//数key
memset(a,0,sizeof(a)); //数组清0
i=0;//第0位
while(key) //当key大于0
{
a[++i]=key%10;//取第i位的数
key=key/10;
}
a[0]=i; //共i位数
return 0;
}
3.直接初始化(用a[]存储)
初始化为0: memset(a,0,sizeof(a));
初始化为1: memset(a,0,sizeof(a));a[0]=1;a[1]=1;
以下程序都只写函数,不写完整程序,所有高精度数存储都满足上述约定。
二.高精度数比较
int compare(int a[],int b[]) //比较a和b的大小关系,若a>b则为1,ab[0]) return 1;//a的位数大于b则a比b大
if (a[0]0;i--) //从高位到低位比较
{if (a[i]>b[i]) return 1;
if (a[i]<b[i]) return -1;}
return 0;//各位都相等则两数相等。
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询