用c语言数组计算两个数的四则运算,考虑两个数非常大的情况

作者&投稿:殳光 (若有异议请与网页底部的电邮联系)
孩子在整数的四则运算这块问题很大,有好的辅导建议啊吗~

强化家庭训练,利用辅助工具,比如实物数量加减开始,数豆子什么的,从基本原理开始,让他明白其中的奥妙

、实验项目内容(实验题目)

请编制程序实现功能:利用字符数组实现两个大整数的加法。

要求采用函数模块化程序设计。




、源程序(实验过程或算法)



#include

#include

void main()

{char s1[100],s2[100];

int a[100]={0},b[100]={0},m,n,c,k,i;

puts("请输入两个较大的数字(Note:输完一个按一次回车):");

gets(s1);

gets(s2);

m=strlen(s1);

n=strlen(s2);

if(m<n) k=n;

else

k=m;

c=k;

for(i=0;i<m;k--,i++)

a[k]=s1[m-1-i]-'0';

for(k=c,i=0;i<n;k--,i++)

b[k]=s2[n-1-i]-'0';

printf("
");

for(i=c;i>=0;i--)

{a[i]+=b[i];

if(a[i]>=10)

{a[i]-=10;

a[i-1]++;}

}

printf("此两数相加之和为:");

if(a[0]!=0)

{for(i=0;i<=c;i++)

printf("%d",a[i]);}

else

{for(i=1;i<=c;i++)

printf("%d",a[i]);}

printf("
");

}







望采纳,谢谢

我有C++版本,不知道楼主愿意否?贴出来给你参考一下吧

#include<iostream>
#include<vector>
#include<string>
using namespace std;
void strToIntArray(const string &str,vector<int> &vec)
{//数字串转换为整型数组,最高位在右边,便于计算
size_t size = str.size();
if(vec.size() != size)
vec.resize(size);
for(vector<int>::size_type index = 0;index != vec.size();++index)
vec[index] = str[size - index - 1] - '0';
}
void toInteger(vector<int> & vec)
{//对整型数组进行进制和去掉前面的0等处理
size_t size = vec.size();
if(vec.back() >= 9)
{
vec.resize(size + 1);
++size;
}
for(vector<int>::size_type index = 0;index != size;++index)
{
if(vec[index] > 9)
{
vec[index + 1] += vec[index] / 10;
vec[index] %= 10;
}
}
while(size > 1 && vec[size - 1] == 0) --size;//去掉前面的0
vec.resize(size);
}
string intArrayToStr(vector<int> &vec)
{//将整型数组转换为数字串
string str;
for(vector<int>::size_type index = vec.size() - 1;index != 0;--index)
{
char ch = vec[index] + 48;
str.push_back(ch);
}
str.push_back((char)(vec[0] + 48));
return str;
}
string add(const string &s1,const string &s2)
{//高精度加法
size_t size1 = s1.size(),size2 = s2.size();
vector<int> v1,v2;
strToIntArray(s1,v1);strToIntArray(s2,v2);//转换为整型数组
if(size1 < size2)
{//若s2位数多
v1.resize(size2);
for(vector<int>::size_type i = size1;i != size2;++i)
v1[i] = 0;
}
else
{//若s1位数多
v2.resize(size1);
for(vector<int>::size_type i = size2;i != size1;++i)
v2[i] = 0;
}
for(vector<int>::size_type i = 0;i != v1.size();++i)
v1[i] = v1[i] + v2[i];//整型数组相加
toInteger(v1);//归整
return intArrayToStr(v1);//再次转换为数字串并返回
}
string sub(const string &s1,const string &s2)
{//高精度减法
string::size_type pos;
if((pos = s1.find_first_of("123456789")) == string::npos)
const_cast<string&>(s1) = "0";//排除纯0数字串,如"0...00"
else const_cast<string&>(s1) = s1.substr(pos);
bool small_big = false;
if( (s1.size() < s2.size()) || (s1.size() == s2.size() && s1 < s2))
{//若被减数小于减数,则交换两数
string stemp = s1;
const_cast<string&>(s1) = s2;
const_cast<string&>(s2)= stemp;
small_big = true;//记录,表明结果是否需要加上‘-’
}
vector<int> v1,v2;
strToIntArray(s1,v1);strToIntArray(s2,v2);
size_t size = v1.size();
v2.resize(size);//v2的长度不可能大于v1
for(vector<int>::size_type i = v2.size();i != size;++i)
v2[i] = 0;//v2前导补0
for(vector<int>::size_type i = 0;i != size;++i)
if(v1[i] >= v2[i]) v1[i] = v1[i] - v2[i];
else
{//不够减,则借位
v1[i] = v1[i] - v2[i] + 10;
--v1[i + 1];
}
while(size > 1 && v1[size - 1] == 0) --size;//去掉前面多余的0
v1.resize(size);
string _stemp = intArrayToStr(v1);
if(small_big) _stemp = '-' + _stemp;//加上‘-’
return _stemp;
}
string mul(const string &s1,const string &s2)
{//高精度乘法
size_t size1 = s1.size(),size2 = s2.size(),size = size1 + size2;
vector<int> v1,v2,vprod(size);//vprod的存储乘积
strToIntArray(s1,v1);strToIntArray(s2,v2);
//首先计算被乘数和乘数各位的积,存到vprod中,在计算与十位的乘积,
//把结果退以为加到vprod中,vprod下标规律为i + j。
for(vector<int>::size_type i = 0;i != size2;++i)
for(vector<int>::size_type j = 0;j != size1;++j)
vprod[i + j] = vprod[i + j] + v2[i] * v1[j];
toInteger(vprod);
return intArrayToStr(vprod);
}
void div(const string &s1,const string &s2,string &q,string &r)
{//高精度除法
if(s2 == "0")
{//除数若为0
cout << "Error ! ";
return ;
}
size_t size1 = s1.size(),size2 = s2.size(),size;
if( (size1 < size2) || (size1 == size2 && s1 < s2))
{//被除数若小于除数
q = "0";
r = s1;
}
else
{//被除数大于或者等于除数
int temp;
string::size_type pos;
for(string::size_type i = 0;i != size1;++i)
{//试除,一位一位的增加余数
temp = 0;
r.push_back(s1[i]);
if((pos = r.find_first_of("123456789")) == string::npos) r = "0";
else r = r.substr(pos);//排除纯0数字串,如"0...00"
size = r.size();
while((size > size2) || (size == size2 && r >= s2))
{//若余数大于除数
r = sub(r,s2);//余数减去除数
size = r.size();
++temp;//商自增1
}
q.push_back(temp + '0');
}
if(( pos = q.find_first_of("123456789") ) != string::npos) q = q.substr(pos);
else q = "0";//去掉商前面的0
}
}

假设A 100位、B 100位分别存到数组m、n中。(位数不一样时,小的数补零填充)
1、加法时,从低位按位相加、进位
2、减法时,重高位开始比较大小,然后从低位开始按位减、借位
3、乘法时,低位按位乘、进位
4、除法时,用模运算求整数商,小数部分折半减,逐步精确
附:直接点的方法也可以先转化成二进制、然后用补码运算


c语言如何实现两个整型数组找出不是两者共有的元素?
同一数字不重复输出。输入样例:10 3 -5 2 8 0 3 5 -15 9 10011 6 4 8 2 6 -5 9 0 100 8 1输出样例:3 5 -15 6 4 1 我的想法是先拿A数组去跟B数组比一遍,然后再反过来比一遍,把不是共有的数放到C数组中,最后消去数组C中相同的数输出,这样输出的就不会存在同一个数了 ...

C语言程序 设计函数计算并返回整型数组中元素的平均值。利用该函数分别...
printf("请输入%d个数组元素",n);for(i=0;i<n;i++)scanf("%d",&a1[i]);printf("数组1的平均值为%.4f.\\n",avg(a1,n));printf("请输入数组2的元素个数:");scanf("%d",&n);printf("请输入%d个数组元素",n);for(i=0;i<n;i++)scanf("%d",&a2[i]);printf("数组2的平均...

如何C语言中实现两个任意大小的整数的相加
要实现任意大小两个整数相加,那么就不能存在溢出情况。所以无法使用任何系统类型,唯一的方式是用数组模拟整数存储,并自行实现加法操作算法。需要注意以下几点:1 大数如何存储及输出;2 计算时进位的处理;3 两个计算数长度不同时的处理;4 当达到最高位仍有进位的处理,即结果的长度大于任意一个操作数...

C语言作业, 输入两个数组(数组元素自定),输出在两个数组中不同时出现的...
include<stdio.h>#define N 3int main(){int a[N]={1,2,3},b[N]={2,4,6},i,j;for(i=0;i<N;i++){for(j=0;j<N;j++)if(a[i] == b[j])break;if(j == N) printf("%d ",a[i]);for(j=0;j<N;j++)if(b[i] == a[j])break;if(j == N) printf("%d ...

用C语言写一段,可以计算任意两个输入数的和的程序
C语言任意两个数字的求和程序设计如下:include <stdlib.h> intmain(){ inta,b,sum;printf("请输入两个整数:");scanf("%d %d",&a,&b);sum=a+b;printf("这两个数的和是:%d\\n",sum);printf("计算完成,谢谢使用!");return0;} C语言指定两个数字的求和程序设计如下:include<stdio.h...

C语言编程题 计算2个非常大的十进制整数(可正可负)之和
include <stdio.h> include <string.h> int main(){ char inputA[80 + 1];char inputB[80 + 1];char result[81 + 1];memset(result, 0, sizeof(result));char* pSrc;char* pResult;char* pInputA = inputA;char* pInputB = inputB;int sizeResult = 0;int sizeSrc = 0;int ...

C语言题目 定义两个数组a[n]和b[n](n<=10)?
include <stdio.h> int isprime(int n){ int i;for(i=2; i*i<=n; i++)if(n%i==0)return 0;return n>1;} int main(){ int i,j,n,a[10],b[10];scanf("%d",&n);for(i=0;i<n;i++)scanf("%d",&a[i]);for(i=0;i<n;i++)scanf("%d",&b[i]);for(i=0;i...

C语言中两个数组相除的问题
一、因为a和b数组是整数,整数相除,c是默认取整的,而*1.0之后就将数字变成浮点型的了,可以得出正确答案 二、c[1]=(1.0*b[1])\/a[1]或者(float)(b[1])\/a[1],强制类型转换。三、乘以1.0是将整数转换为浮点型数(小数),1是整数,乘以整数还是整数,所以不起作用。

C语言 结构体数组 计算个数
第一种方法,设置一个结构体变量的成员为某个具体的常量,进行遍历寻找得出变量的数量 第二种方法,在输入时计算 第三种,建立一个有指针域的动态链表 用第三种方法实现的一个例子,可用来学籍管理系统 include <stdio.h> include <stdlib.h> include <conio.h> typedef struct student { int num;...

c语言编程题:有两个二维数组一组20个数一组10个数,求两个数组中任意两...
int i,j;int min = 65534;\/\/根据题目设一个相对较大的数 int list[10][2];\/\/用scanf循环输入 int list2[20][2];\/\/用scanf循环输入 for(i=0;i<10;i++){ for(j=0;j<20;j++){ int len =sqrt((list[i][1]-list2[j][1])*(list[i][1]-list2[j][1])+(list[i][2]...

黄石港区14772568079: 用c语言数组计算两个数的四则运算,考虑两个数非常大的情况 -
底萍精氨: 我有C++版本,不知道楼主愿意否?贴出来给你参考一下吧#include<iostream> #include<vector> #include<string> using namespace std; void strToIntArray(const string &str,vector<int> &vec) {//数字串转换为整型数组,最高位在右边,便于计算...

黄石港区14772568079: windows编程下c语言编程两个数的四则运算 -
底萍精氨: #include <stdio.h> int main() { printf("输入吧\n"); int a,b,m; char o; scanf("%d%c%d=",&a,&o,&b); if(o=='+') m=a+b; else if(o=='-')m=a-b; else if(o=='*')m=a*b; else if(o=='/')m=a/b; printf("%d",m); return 0; }

黄石港区14772568079: c语言编写 编写一个简单的计算器,实现两个整型数的四则运算. -
底萍精氨: #include#include int main() { int a,b; char ch,pm='Y'; while(pm!='N') { cout<<"请输入第一个数:"< cin>>a; cout<<"请输入运算符号:"< cin>>ch; cout<<"请输入第二个数:"< cin>>b; if(ch=='+') cout<< else if(ch=='-') cout<< else if(ch=='*') cout<< else if(ch=='/') cout< cout<<"结束输入N,继续输入任意键!"< pm=getchar(); } return 1;} 要c++的行吗?还要换成c吗?

黄石港区14772568079: 输入两个整数,进行加减乘除四则运算的c语言程序怎么写啊,拜托了~ -
底萍精氨: 代码 #include<stdio.h> int main() { int a,b; scanf("%d %d",&a,&b); printf("%d\t",a + b); printf("%d\t",a - b); printf("%d\t",a * b); printf("%d\t",a / b);return 0;} 运行截图分析 C语言中的加减乘除和数学中的加减乘除一样,不同在于符...

黄石港区14772568079: C语言怎么实现任意两个数的四则运算 -
底萍精氨: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32#include<stdio.h>int main(void) {int a, b;char c;printf("请输入两个数:");scanf("%d %d", &a, &b);getchar();printf("请输入你需要的运算...

黄石港区14772568079: 用C语言编程实现一个简单的四则运算计算器 -
底萍精氨: 用一个数组a作为存储数字的栈,另一个b作为存储操作符的栈,弹出一个操作符即弹出对应的两个数字进行运算,然后将运算结果压回a,直到a中只有一个元素,这个元素即为最后的结果.

黄石港区14772568079: 编写一个C程序来实现两个浮点数的四则运算. -
底萍精氨: #include void main() {float d1,d2;char op;printf("please input d1 and d2:\n");scanf("%f,%f",&d1,&d2);printf("please select the operator(+、-、*、/):\n");scanf("%c",&op);switch(op){case '+':result=d1+d2;break;case '-':result=d...

黄石港区14772568079: c语言写简单的四则运算,就是随机输入两个数,可以进行加减乘除.
底萍精氨:#include <stdio.h> int main() { double a,b,c; printf("输入两个数:"); scanf("%lf%lf",&a,&b); c=a+b; printf("%lf+%lf=%lf\n",a,b,c); c=a-b; printf("%lf-%lf=%lf\n",a,b,c); c=a*b; printf("%lf*%lf=%lf\n",a,b,c); if(b==0) printf("%lf/%lf=除数不能为0\n",a,b); else { c=a/b; printf("%lf/%lf=%lf\n",a,b,c); } return 0; }

黄石港区14772568079: 急 在线等 C语言 自定义函数,完成任意两个实数的四则运算 -
底萍精氨: // 自定义函数,完成任意两个实数的四则运算. // 主函数中输出计算结果. // 函数头为:double fun(double x,double y,char z) // 其中:x,y接受两个实数.Z接受一个运算符.#include<stdio.h> #include<math.h>double fun(double x,double y,char z) ...

黄石港区14772568079: 如何编写一个C语言程序,让计算机自动出四则运算计算 -
底萍精氨: 如果是两个数的,那先写一个产生随机数的函数 然后随机产生=-*/ ~ ~ ~

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网