① 怎么用c语言编写一个大整数的四则运算器,求解(急!!)
1.打开CodeBlocks,创建一个新的空白文件,定义头文件和主要功能,然后写程序的主体:
② C语言怎么实现四则运算
我曾用c编了个计算器,支持四则运算,支持括号改变优先级,你看看吧:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define Esc 27
#define Tab 9
void needle(char* s,char* carriage,int start)//needle意为“用针缝”
{
int size_carriage=(int)strlen(carriage);
int i,j;
for(j=0;j<size_carriage;j++)
{
for(i=(int)strlen(s);i>=start;i--)
s[i+1]=s[i];
s[i+1]=carriage[j];
start=i+2;
}
}
double factorial(double d)//factorial意为“阶乘”
{
return d==0?1:d*factorial(d-1);
}
void handle(char* carriage)//handle意为“处理”
{
void find_start(char*,int*);
char* save1,*save2,ch;
char op[111];
double d1,d2;
int start,i;
find_start(carriage,&start);
ch=carriage[start];
d1=strtod(carriage,&save1);//strtod是库函数,功能是将字符串carriage中出现的第一个浮点数转化为double,并将剩余字符储存在save1中
if(ch=='!')
{
sprintf(op,"%g",factorial(d1));//springf是库函数,功能是将显示在屏幕上的内容储存在op中
strcpy(carriage,op);
return;
}
for(i=0;i<(int)strlen(save1);i++)//对于第一个不是'+'或'-'或数字的字符串,strtod无法作用。所以得去掉诸如"*22"字符串中的'*'
save1[i]=save1[i+1];
d2=strtod(save1,&save2);
switch(ch)
{
case '*':sprintf(op,"%.32g",d1*d2);break;
case '/':sprintf(op,"%.32g",d1/d2);break;
case '+':sprintf(op,"%.16g",d1+d2);break;
case '-':sprintf(op,"%.16g",d1-d2);
}
strcpy(carriage,op);
}
void del(char* s,int start,int end)//delete意为“删除”
{
int i,j;
int size=(int)strlen(s);
for(i=end;i>=start;i--)
for(j=i;j<size;j++)
s[j]=s[j+1];
}
void (char* s,char* carriage,int start,int end)//意为“复制”
{
int i;
for(i=0;start<=end;i++,start++)
carriage[i]=s[start];
carriage[i]='\0';
}
void scissor(char* s,char* carriage,int* start)//scissor意为“用剪刀剪”
{
int sta,end;
for(sta=*start-1;(s[sta]>='0'&&s[sta]<='9')||s[sta]=='.';sta--);
if(sta!=0||s[*start]=='!') //处理式子是-2+3或-2!的特殊情况
sta++;
if(s[*start]=='!')//'!'是单目运算符
end=*start;
else
{
for(end=*start+1;(s[end]>='0'&&s[end]<='9')||s[end]=='.';end++);
if((s[end-1]=='*'||s[end-1]=='/')&&(s[end]=='+'||s[end]=='-'))//处理式子是2*-2等的特殊情况
for(end++;(s[end]>='0'&&s[end]<='9')||s[end]=='.';end++);
end--;
}
(s,carriage,sta,end);
del(s,sta,end);
*start=sta;//记住等下针线函数needle要开始缝的地方
}
void find_start(char* s,int* start)//find_start意为“找到操作符号开始处”
{
int i;
int size=(int)strlen(s);
//由优先级决定从上而下的顺序
for(i=0;i<size;i++)
if(s[i]=='!')
{
*start=i;
return;
}
for(i=0;i<size;i++)
if(s[i]=='*'||s[i]=='/')
{
*start=i;
return;
}
if(s[0]=='+'||s[0]=='-')
{
for(*start=1;(s[*start]>='0'&&s[*start]<='9')||s[*start]=='.';(*start)++);
return;
}
for(i=0;i<size;i++)
if(s[i]=='+'||s[i]=='-')
{
*start=i;
return;
}
}
int judge(char* s)//judge意为“判断”
{
int i;
int size=(int)strlen(s);
for(i=1;i<size;i++)
if(s[i]=='+'||s[i]=='-'||s[i]=='*'||s[i]=='/'||s[i]=='!')
return 1;
return 0;
}
void count(char* s)//count意为“计算”
{
int start,i;
char carriage[555];//carriage意为“运载体”
while(judge(s))//判断式子是否还需要进行运算
{
for(i=0;i<(int)strlen(s);i++)//此循环作用是将式子中出现的'--'替换为'+'
{
for(;s[i]!='-' && i<(int)strlen(s);i++);//循环结束
if(s[i+1]=='-')
{
del(s,i,i+1);
needle(s,"+",i);
}
}
find_start(s,&start);//让下标start指向式子应该最先开始处理的运算符
scissor(s,carriage,&start);//用剪刀scissor将start指向的运算符及相对应的操作数剪下并储存在运载体carriage上
handle(carriage);//处理该运载体,并将运载体上运载的式子的计算结果储存在运载体上
needle(s,carriage,start);//见函数simplify中的说明
}
}
void simplify(char* s)//simplify意为“简化”,即将括号去除
{
char carriage[555];//carriage意为“运载体”
int start,end,i;
int size=(int)strlen(s);
while(1)
{
for(i=0;s[i] != '(' && i<size;i++);//注意这里末尾是分号
if(i==size)
break;//说明式子已不含括号,简化完成
for(end=0;s[end] != ')';end++);//使end下标指向式子中第一个出现')'的地方
end--;
for(start=end;s[start] != '(';start--);//寻找与上面一个')'配对的'('
start++;
(s,carriage,start,end);//将括号里的内容复制给运载体carriage
del(s,start-1,end+1);//删除整个括号及其里面的内容
count(carriage);//计算运载体运载的表达式,运算结果储存在运载体上
needle(s,carriage,start-1);//将运载体运载过来的结果用针线needle缝在刚才删除式子s括号及其内容的地方
}
}
int main()
{
int i=0;
char s[555],ch;
puts(" 本程序不对用户输入数据进行检测:");
puts(" 即用户应输入规范的计算式,包括分母不能为0:");
puts(" 式子不能含有空格及其他非计算字符;");
puts(" 按任意一个键开始,按回车键显示运算结果;");
while(1)
{
i++;
ch=getch();
if(Esc==ch)
break;
if(Tab==ch)
{
system("cls");//清除当前屏幕
puts("显示运算结果后:按“Esc”键退出,按“Tab”键清除当前屏幕");
}
if(i==1)
{
system("cls");
puts("显示运算结果后:按“Esc”键退出,按“Tab”键清除当前屏幕");
}
puts("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
gets(s);
simplify(s);
count(s);
puts(s);
//实验数据:23.243*(5!-23.123/.133+(2!-13/13.23)*(2!-.235)-((4!-20)!/2!)-32*(3!+2.23/(2*3)!))
//其正确结果是:-5953.9401265774754346182917611489
}
puts("谢谢使用!\n有问题可加q问我:281754179");
getch();
return 0;
}
我记得学了数据结构后我又重新用栈写了个,容错能力会更好,上面的代码可以改进很多,也只是给你一个思路罢了
③ C语言怎么实现任意两个数的四则运算
C语言实现任意两个数的四则运算的方法:
1、阅读代码,使用了随机函数:srand(unsigned( time(NULL)));通过调用随机函数,将生成的100以内的随机整数赋给不同的变量,一部分用于四则运算式数据的来源,而赋给变量c的随机数则用于结合switch语句控制程序跳转执行 不同的分支,即不同的四则运算,如下:
c = rand() % 5; //随机产生小于5的非负整数
switch (c)
case 0:
case 1:
...........
case 5:
2、使用while语句控制除数不为0
while (b == 0)
{
b = rand() % 1; //若b=0则重新生成b,直到b不为0
}
3、使用if语句判断减数与被减数的大小。
if (a > b) //使a<b
{
d = a;
a = b;
b = d;
}
if (m > n) //使m<n
{
d = m;
m = n;
n = d;
}
通过if判断并赋值的手段保证结果不出现负数
4、 原代码仅能一次性生成20个随机的四则运算式,而无法从键盘输入结果并判断答案正确与否。
5、修改代码。由于原代码无法从键盘读入数据,所以对其进行了改进。
(1)增加键盘读入功能
scanf("%d",&x);
从键盘读入输入的答案
(2)对答案进行正确与否的判断
if(x == (a+b))
printf("You are right! ");
else
printf("You are wrong! ");
通过比较输入答案与运算得出的答案告知用户计算是否正确。
6、上传源代码至GitHub。
④ C语言编写四则运算
请先给出明确答复:因为程序规定的是先输入操作符,再输入两个操作数
解释原因:请看下面部分的代码
- 第一个scanf("%c",&oper);这一句要求输入一个(注意是一个)字符格式的值,给oper;
如果你输入一个数字、英文等等,假如你第一个输入的是10,那oper就是1,而不是10,因为%c一次只能读取一个字符;
接下来,输入第二第三个,程序再往下就会拿oper判断,如果oper等于-号,就会执行减法,如果等于+号就会执行加法;
所以你输入的操作数是不会匹配任何运算符,就不能进行运算。
有无解决办法:
调换语句顺序:复制第一个printf那一行与第一个scanf那一行,注意这两行printf在scanf的上面,把这两句放到第二个scanf之后,第三个print之前。就能输入 1 空格 + 空格 2 回车,这种的
⑤ c语言里的四则运算
下面是个完整的程序,我测试通过符合你的要求,你在看看,我写的模块化实现,给你贴的有些乱,
函数声明如果在一个.c 文件把所有的子函数都在前面在声明一下,不是很复杂,
#include <stdio.h>
#include <math.h>
(#include "head.h" ) //自己定义的一定要用双引号括起来
//如果用尖括号就会出错
//这里包含的.h 文件时各个子函数的声明可以去掉
//函数功能:实现了减加乘除运算
void main()
{
void (*p)(float ,float); //定义指向函数的指针变量
float a,b; //上面的语句有些难度,相当于一个函数
char logo;
puts("输入两个数和想要的操作:\n");
scanf("%f%c%f",&a,&logo,&b);
while(1)
{switch(logo)
{
if((logo=='+')&&(logo=='-')&&(logo=='/')&&(logo=='*'))
{case '+': p = sum; (*p)(a,b);break; //这里就把指针给加
case '-': p = subtraction; (*p)(a,b);break; //同上
case '/': p = division; (*p)(a,b);break; //同上 给除
case '*': p = multiplication; (*p)(a,b);break;
default:break;
}
else
printf("输入错误重新输入")
}
}
}
#include <stdio.h>
#include <math.h>
void division(float a,float b)
{
float div;
div=a/b;
printf("%.3f\n",div);
}
#include <stdio.h>
#include <math.h>
void multiplication(float a,float b)
{
float mul;
mul=a*b;
printf("%.3f\n",mul);
}
#include <stdio.h>
#include <math.h>
void subtraction(float a,float b)
{
float ch;
ch=a-b;
printf("%.3f\n",ch);
}
#include <stdio.h>
#include <math.h>
void sum(float a,float b)
{
float he;
he=a+b;
printf("%.3f\n",he);
}
⑥ C语言编写程序四则运算法则
1234567891011121314151617# include <stdio.h>int main(void){ int a,b,s; char c; scanf("%d%c%d",&a,&c,&b); switch(c) { case '+':s=a+b;break; case '-':s=a-b;break; case '*':s=a*b;break; case '/':s=a/b;break; default:return -1; } printf("%d",s); return 0;}
如果还要判断除数为0的情况 再添个if即可
⑦ 要求用C语言编写程序实现大整数的四则运算(加、减、乘、除)
如果只是实现(加、减、乘、除)那么,直接用文本文件保存就好,虽然效率略低,但可以保证精确度。
直接按照小学教的加减乘除原理,逐位进行计算,保证无线精确(内存不够大、cpu不够快不算)。 这个我就能做。
⑧ 用c语言数组计算两个数的四则运算,考虑两个数非常大的情况
假设A
100位、B
100位分别存到数组m、n中。(位数不一样时,小的数补零填充)
1、加法时,从低位按位相加、进位
2、减法时,重高位开始比较大小,然后从低位开始按位减、借位
3、乘法时,低位按位乘、进位
4、除法时,用模运算求整数商,小数部分折半减,逐步精确
附:直接点的方法也可以先转化成二进制、然后用补码运算
⑨ C语言大整数的四则运算
#include<stdio.h>
intmul(inta[],intk)
{inti,t=0;
for(i=1;i<=a[0];i++)
{a[i]=k*a[i]+t;
t=a[i]/10;
a[i]%=10;
}
for(i=a[0];t;)
{a[++a[0]]=t%10;
t/=10;
}
}
intmain()
{inti,n,a[102]={1,1};
scanf("%d",&n);
printf("%d!=",n);
for(i=2;i<=n;i++)
mul(a,i);
for(i=a[0];i>0;i--)
printf("%d",a[i]);
return0;
}
⑩ C++中如何实现大数据的四则运算
高精度运算
使用一个数组存储各个位上的数值,之后加减乘除,模拟手算。
具体算法问度娘
速度不快,数的大小可达无穷大(取决于数组大小)
如:1000位时,开到1000就足够