C语言中怎么实现两个超大整数的相加减乘除

作者&投稿:能莘 (若有异议请与网页底部的电邮联系)
数学建模中的C语言编程~

这个问题的前提条件不明确,本人试着给出一种方法的描述,该回答基于下述假设:
1、n个工件是同时到达的;
2、任意工件可以任意机器上加工;
3、已知工件的加工时间;

基本思想:
采用短工作优先算法,从而使总加工时间最少。
该算法的详细说明可以参考任何一本《操作系统原理》

解法步骤:
1、将工件按加工时间排序,需要时间最少的排在最前;
2、设置一个M大小的数组U,表示各机器已用时间;
3、设置一个M大小的数组N,表示各机器加工当前工件还需要的时间;
4、设置一个M大小的数组R,表示各机器已运行的时间;
4、将数组U、R、N的各元素都置为0;
5、对工件数据中每个元素执行下述操作:
从数组N中找到值最小的元素x;
将数组N中每个元素的值减去元素x的值作为其新值;
将数组R中每个元素的值加上元素x的值为作其新值;
将元素x值设置为工件要求的加工时间;
修改数组U中的值:U[x]+=R[x]+N[x];
6、将数组U中各元素的值求和,得到的即为最短的总时间

祝你好运!

-------------------------------------------------------

程序用JAVA语言编写,并省略了排序操作,并假定机器数为3

public static void main(String[] arg)throws Exception
{
int[] W=new int[]{1,2,3,55,56,77,77,88,99,100};//工件需要的工作时间
int[] U=new int[]{0,0,0};//各机器加工的工件已用的总时间,含等待时间
int[] R=new int[]{0,0,0};//各机器已运行的时间
int[] N=new int[]{0,0,0};//各机器加工完当前工作需要的时间
for(int i=0;i<W.length;i++)
{
/**找到当前机器中最早可用的机器,用m表示机器的代号,x表示机器完成当前工作需要的时间*/
int m=0;
for(int j=1;j<N.length;j++)if(N[j]<N[m])m=j;
int x=N[m];

//将数组N中每个元素的值减去元素x的值作为其新值;
//将数组R中每个元素的值加上元素x的值为作其新值;
for(int j=0;j<N.length;j++)
{
N[j]-=x;
R[j]+=x;
}

//将元素x(即机器m)值设置为工件要求的加工时间;
N[m]=W[i];
U[m]+=(R[m]+N[m]);
}

int total=0;
for(int i=0;i<U.length;i++)total+=U[i];
System.out.println("总时间等于:"+total);
}


#include #include #include #include #define z_Size 3 //随机数 整数最大位数,可自由修改,但总位数不要超过变量类型#define x_Size 3 //随机数 小数最大位数#define tmN 10 //生成题目的数量,默认10条typedef enum { true=1, false=0} boolean;typedef struct timu{ int id; //题目编号自增 double num1;//运算数字1 double num2;//运算数字2 char f;//运算符 double n;//运算结果 boolean flag;//true:回答正确 ;flase:回答错误}TM;double power10(int m)//计算10的次方 支持负数幂{ int i; double sum=1; if(m==0) return sum; for(i=0;i0) return sum; if(m<0) return 1/sum; return -1;}int main(){ srand(time(NULL)); int zSize,xSize,i,fn,false_count=0; double xPow10,ansr; TM tms[tmN]; for(i=0;i<tmN;i++) { zSize=rand()%z_Size; xSize=rand()%x_Size; xPow10=power10(xSize); tms[i].id=i+1; tms[i].num1=rand()%(int)power10(zSize)+(double)(rand()%(int)xPow10)/xPow10; tms[i].num2=rand()%(int)power10(zSize)+(double)(rand()%(int)xPow10)/xPow10; fn=rand()%3;//随机运算符 if(fn==0)//加法 { tms[i].f='+'; tms[i].n=tms[i].num1+tms[i].num2; } if(fn==1)//加法 { tms[i].f='-'; tms[i].n=tms[i].num1-tms[i].num2; } if(fn==2)//加法 { tms[i].f='*'; tms[i].n=tms[i].num1*tms[i].num2; } if(fn==3)//加法 { tms[i].f='/'; tms[i].n=tms[i].num1/tms[i].num2; } printf("题目%d、请计算:%lf%c%lf=?
回答:",tms[i].id,tms[i].num1,tms[i].f,tms[i].num2); scanf("%lf",&ansr); if(abs(tms[i].n-ansr)<(1/power10(zSize))) tms[i].flag=true; else tms[i].flag=false; } printf("
-------开始统计回答结果-----------
"); for(i=0;i<tmN;i++) { if(tms[i].flag==false) { false_count++; printf("第%d题回答错误,答案应该是:%lf
",tms[i].id,tms[i].n); } } printf("共回答正确%d个,错误%d个
",tmN-false_count,false_count); return 0;}

#include <string.h>

#include <stdio.h>

#include <stdlib.h>

#define N 100

int main(int argc, char const *argv[])

{

char arr[N] = {};

gets(arr);

char brr[N] = {};

gets(brr);

int len1,len2,i = 0,j = 0;

len1 = strlen(arr);

len2 = strlen(brr);

int len = len1>len2?len1:len2; 

/*  c99之后数组初始化支持整型表达式,称为可变长数组,但按照c89的标准是不对的

int num1[len]; //将字符串转换成翻转的整型数组

int num2[len];

*/

int* num1 = (int*)malloc(len*sizeof(int));

int* num2 = (int*)malloc(len*sizeof(int));

for (i = 0; i < len; i++)

{

num1[i] = i<len1 ? arr[len1-i-1]-'0':0;

}

for (j = 0; j < len; j++)

{

num2[j] = j<len2 ? brr[len2-j-1]-'0':0;

}

//int sum[len]; //定义和数组 

int* sum = (int*)malloc(len*sizeof(int));

int flag=0; //设进位符

for (i = 0; i < len; i++)

{

sum[len-1-i] = (num1[i]+num2[i]+flag)%10;

flag = (num1[i]+num2[i]+flag)/10;

}

if (flag == 1) printf("1");   //如果最高位有进位 则输出一个1 

for (i = 0; i < len; i++)

{

printf("%d",sum[i]);

}

printf("
");

free(num1);

free(num2);

free(sum);

num1 = NULL;

num2 = NULL;

sum = NULL;

return 0;

}

扩展资料:

gets()函数用法

gets是从标准输入设备读字符串函数。

函数原型:char*gets(char*str);

功能为:从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读取串的内容,读取的换行符被转换为‘\0’空字符,并由此来结束字符串。

注意:不会判断上限,以回车结束读取,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。使用时需要包含stdio.h头文件

参数

str为字符串指针,用来存放读取到的数据。

返回值

读入成功,返回与参数buffer相同的指针;读入过程中遇到EOF(End-of-File)或发生错误,返回NULL指针。所以在遇到返回值为NULL的情况,要用ferror或feof函数检查是发生错误还是遇到EOF。



直接上程序代码吧。
#include <stdio.h>
#define MAXINT 1000
int compare(int a[],int b[]);
int bigplus(int a[],int b[],int c[]);
int bigsub(int a[],int b[],int c[]);
int bigmult(int a[],unsigned int b,int c[]);
int bigmult2(int a[],int b[],int c[]);
int bigdiv(int a[],unsigned int b,int c[],int *d);
int bigdiv2(int a[],int b[],int c[],int d[]);
int main(int argc, char *argv[])
{
int a[MAXINT]={10,5,4,6,5,4,3,2,1,1,1}; //被乘数或被除数
int b[MAXINT]={7,7,6,5,4,3,2,1}; //乘数或除数
int c[MAXINT],d[MAXINT]; //c[]存放商,d[]存放余数
int div=1234; //小乘数或小除数
int k=0;
int *res=&k; //小余数整数指针
bigplus(a,b,c);
bigsub(a,b,c);
bigmult(a,div,c);
bigmult2(a,b,c);
bigdiv(a,div,c,res);
bigdiv2(a,b,c,d);
getchar();
return 0;
}
int compare(int a[],int b[]) //比较大整数的大小
{
int i;
if (a[0]>b[0]) return 1; //比较a,b的位数确定返回值
else if (a[0]<b[0]) return -1;
else //位数相等时的比较
{
i=a[0];
while (a[i]==b[i]) //逐位比较
i--;
if (i==0) return 0;
else if (a[i]>b[i]) return 1;
else return -1;
}
}
int bigplus(int a[],int b[],int c[]) //大整数加法
{
int i,len;
len=(a[0]>b[0]?a[0]:b[0]); //a[0] b[0]保存数组长度,len为较长的一个
for(i=0;i<MAXINT;i++) //将数组清0
c[i]=0;
for (i=1;i<=len;i++) //计算每一位的值
{
c[i]+=(a[i]+b[i]);
if (c[i]>=10)
{
c[i]-=10; //大于10的取个位
c[i+1]++; //高位加1
}
}
if (c[i+1]>0) len++;
c[0]=len; //c[0]保存结果数组实际长度
printf("Big integers add: ";
for (i=len;i>=1;i--)
printf("%d",c[i]); //打印结果
printf("\n";
return 0;
}
int bigsub(int a[],int b[],int c[]) //大整数减法
{
int i,len;
len=(a[0]>b[0]?a[0]:b[0]); //a[0]保存数字长度,len为较长的一个
for(i=0;i<MAXINT;i++) //将数组清0
c[i]=0;
if (compare(a,b)==0) //比较a,b大小
{
printf("Result:0";
return 0;
}
else if (compare(a,b)>0)
for (i=1;i<=len;i++) //计算每一位的值
{
c[i]+=(a[i]-b[i]);
if (c[i]<0)
{
c[i]+=10; //小于0的原位加10
c[i+1]--; //高位减1
}
}
else
for (i=1;i<=len;i++) //计算每一位的值
{
c[i]+=(b[i]-a[i]);
if (c[i]<0)
{
c[i]+=10; //小于0原位加10
c[i+1]--; //高位减1
}
}
while (len>1 && c[len]==0) //去掉高位的0
len--;
c[0]=len;
printf("Big integers sub= ";
if (a[0]<b[0]) printf("-";
for(i=len;i>=1;i--) //打印结果
printf("%d",c[i]);
printf("\n";
return 0;
}
int bigmult(int a[],unsigned int b,int c[])//高精度乘以低精度
{
int len,i;
for (i=0;i<MAXINT;i++) //数组清0
c[i]=0;
len=a[0];
for(i=1;i<=len;i++) //对每一位计算
{
c[i]+=a[i]*b;
c[i+1]+=c[i]/10;
c[i]%=10;
}
while (c[++len]>=10) //处理高位
{
c[len+1]=c[len]/10;
c[len]%=10;
}
if (c[len]==0) len--; //处理高进位为0情况
printf("Big integrs multi small integer: ";
for (i=len;i>=1;i--)
printf("%d",c[i]);
printf("\n";
}
int bigmult2(int a[],int b[],int c[]) //高精度乘以高精度
{
int i,j,len;
for (i=0;i<MAXINT;i++) //数组清0
c[i]=0;
for (i=1;i<=a[0];i++) //被乘数循环
for (j=1;j<=b[0];j++) //乘数循环
{
c[i+j-1]+=a[i]*b[j]; //将每一位计算累加
c[i+j]+=c[i+j-1]/10; //将每一次结果累加到高一位
c[i+j-1]%=10; //计算每一次的个位
}
len=a[0]+b[0]; //取最大长度
while (len>1 && c[len]==0) //去掉高位0
len--;
c[0]=len;
printf("Big integers multi: ";
for (i=len;i>=1;i--) //打印结果
printf("%d",c[i]);
printf("\n";
}
int bigdiv(int a[],unsigned int b,int c[],int *d) //高精度除以低精度
{ //a[] 为被乘数,b为除数,c[]为结果,d为余数
int i,len;
len=a[0]; //len为a[0]的数组长度
for (i=len;i>=1;i--)
{
(*d)=10*(*d)+a[i]; //计算每一步余数
c[i]=(*d)/b; //计算每一步结果
(*d)=(*d)%b; //求模余数
}
while (len>1 && c[len]==0) len--; //去高位0
printf("Big integer div small integer: ";
for (i=len;i>=1;i--) //打印结果
printf("%d",c[i]);
printf("\tArithmetic compliment:%d",*d);
printf("\n";
}
int bigdiv2(int a[],int b[],int c[],int d[]) //高精度除以高精度
{
int i,j,len;
if (compare(a,b)<0) //被除数较小直接打印结果
{
printf("Result:0";
printf("Arithmetic compliment:";
for (i=a[0];i>=1;i--) printf("%d",a[i]);
printf("\n";
return -1;
}
for (i=0;i<MAXINT;i++) //商和余数清0
{
c[i]=0;
d[i]=0;
}
len=a[0];d[0]=0;
for (i=len;i>=1;i--) //逐位相除
{
for (j=d[0];j>=1;j--)
d[j+1]=d[j];
d[1]=a[i]; //高位*10+各位
d[0]++; //数组d长度增1
while (compare(d,b)>=0) //比较d,b大小
{
for (j=1;j<=d[0];j++) //做减法d-b
{
d[j]-=b[j];
if (d[j]<0)
{
d[j]+=10;
d[j+1]--;
}
}
while (j>0 && d[j]==0) //去掉高位0
j--;
d[0]=j;
c[i]++; //商所在位值加1
}
}
j=b[0];
while (c[j]==0 && j>0) j--; //求商数组c长度
c[0]=j;
printf("Big integers div result: ";
for (i=c[0];i>=1;i--) //打印商
printf("%d",c[i]);
printf("\tArithmetic compliment: "; //打印余数
for (i=d[0];i>=1;i--)
printf("%d",d[i]);
printf("\n");
}

在本题中要实现两个超大整数的计算,主要是靠快速算式,改变运算的传统过程,准确无误的求出结果。例如(1)9988+8899=10000-12+8899=18899-12=18887;(2)980886-88906=980886-90000-6+1100=890880+1100=891980;(3)999786x99999=999786x100000-999786=99978600000-1000000+214=99977600214;(4)8950700÷50000=8950700÷100000x2=89.507x2=179.014。

可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  • c语言
  • 加减乘除
  • 超大数


可以将它们化为十六进制来计算。


在汇编语言中怎样实现两个数互换
交换AX和BX的数据,用以下4种方法可以实现:第一种:将中间变量存储于栈中:SSEG SEGMENT STACK DB 32 DUP (?)SSEG ENDS CSEG SEGMENT assume CS:CSEG, SS:SSEG Main: mov AX, SSEG mov SS, AX mov SP, 32h ; 初始化栈段及栈指针 mov AX, xxx mov BX, yyy ; 分别设置AX和...

C语言编写一个程序实现两个有序(从小到大)顺序表合并成为一个顺序表,合...
printf("创建一个有序表:\\n");printf("输入有序表中元素的个数:");scanf("%d",&n);L->length=n;for(i=0;i<n;i++){ printf("输入第%d个元素的值:",i+1);scanf("%d",&L->elem[i]);printf("\\n");} } void Disp_Sq(SqList *L) \/\/***注意这里 { int i,n;n=L->...

C语言怎么自定义函数实现两个同维数组对应位置相乘再求和,返回一个数...
include<stdio.h> void sum(int x[],int y[]);\/\/这括号里边的是形参,可以不给出数组的长度。而且数组名任意,只要 void main() \/\/两个数组名不重复就行 { int a[2],b[2],i;printf("intput a[2]:\\n");for(i=0;i<2;i++)scanf("%d",&a[i]);printf("input b[2]:...

c语言中IF实现双向选择的一般形式是什么 还有个是实现多向选择的一般...
双向选择:if(a>b){\/\/如果a>b就执行 printf("这里是a大于b的情况");}else{\/\/a<=b printf("这里是a不大于b的情况");}多项选择使用switch() case结构:switch(a){ case 1: XXX;break;\/\/执行当a=1的情况 case 2: XXX;break;\/\/执行当a=2的情况 case 3: XXX...

汇编语言实现两台单片机并行通信
这就太简单了。如果是单工的,用一个 8 位的并行口,互连即可。比如甲机 P2 连接到乙机的 P1。甲机的 P1 接上八个拨动开关,乙机的 P2 接上八个 LED。两台单片机,都是 P1 输入、P2 输出。程序是相同的,如下:ORG 0000H MOV P2, P1 SJMP 0000H END 这就实现了《并行的、简单...

C语言怎么样用最简单的方法实现两个函数二选一运行?
int add(int a,int b){ return a+b;} int sub(int a,int b){ return a-b;} if(i%2==0){ p=add;} else { p=sub;} int sum=p(3,3);利用了函数指针,赋值不同的函数给它。前提是两个函数的参数要一致

如何用C语言实现两个16进制数的异或
C语言中,异或运算符是^。不管运算对象是10进制的数还是16进制的数(或其他进制的数),进行^运算时,都是将运算对象转换为二进制,按位进行异或运算。举例说明如下:int a=0x9a, b=0x56;int c = a^b; \/\/ 将a和b进行异或运算 运算过程是 a = 1001 1010 \/\/ 0x9a b = 0101 0110 ...

C语言中实现两个一维数组间元素的交换
include<stdio.h> define N 5 void main(){ int a[N],b[N],c;int i;printf("请输入a数组元素:\\n");for(i=0;i<N;i++)scanf("%d",&a[i]);printf("请输入b数组元素:\\n");for(i=0;i<N;i++)scanf("%d",&b[i]);printf("交换后的数组元素为:\\n");for(i=0;i<N;...

c语言如何实现两行输入
如果要\\n,那么得输入两个回车。如果没有\\n,输入一次之后第二个没输入就结束。include<stdio.h> int main(){ char c1,c2;printf("Is the first numberan int (y\/n)? ");scanf("%c",&c1);printf("Is the second number int (y\/n)? ");scanf("%c",&c2);scanf("%c",&c2);} ...

编写一个函数实现两个字符串的连接(不使用库函数strcat).这个用C语...
void fun (char s1[],char s2[]){ int i,j;for (i=0;s1[i] !=’\\0’; i++); \/*求出的i为pA字符的总长度,包括结束标记位*\/ for (j=0;s2[j] !=’\\0’; j++)s1[i++]=s2[j]; \/*将pB字符串连在pA字符串的后面*\/ s1[i]='\\0’; \/*在字符串最后加上结束标记符*...

阿巴嘎旗15947567053: 如何用C语言写两个大数相加? -
田凯调中: 00+01这种数据是不会有的, 题目说了是整数,就一定会符合整数的格式,请放心 我的代码:#include<iostream> #include<string> using namespace std; void reader(int *a,int &len) {char buf[1024];scanf("%s",buf);len=strlen(buf);memset(...

阿巴嘎旗15947567053: 用C语言实现两个任意100位长整数的加法运算 -
田凯调中: #includechar s[100001]; int a[100001],b[100001],c[100001]; int main(){ long i,j,k,m,n; long alen,blen,clen; gets(s); alen=strlen(s); for(i=alen-1;i>=0;i--) a[alen-i]=s[i]-'0'; gets(s); blen=strlen(s); for(i=blen-1;i>=0;i--) b[blen-i]=s[i]-'0'; if(alen>blen) clen=...

阿巴嘎旗15947567053: 两个超长正整数相加(C语言) -
田凯调中: 大整数不应该用double做为输入,应该用字符串,代码如下:#include <iostream>#include <string>#include <sstream> using namespace std; const int M = 4; const int N = 99; void Sort(int a[], string z) { int i = 0; int zlen = 0; while (z.size() > 0) { zlen ...

阿巴嘎旗15947567053: 朋友们,你们好,任何在C语言中实现2个大数的相加?请帮帮忙,谢谢 -
田凯调中: 那要看你的数最大是多少了 !~ 如果是长整形的话,那就是:main() {longint a,b,sum; scanf("%ld,%ld",&a,&b); sum=a+b; sprintf("%ld",sum); }

阿巴嘎旗15947567053: C语言大作业 题目是:请设计一个算法完成两个超长正整数的加法.谁会的帮帮忙? -
田凯调中: 有没有具体的要求,比方说数据结构方面,我这有一个,你可以参考参考#include"stdio.h"#include"stdlib.h"#define n 10 /*假定系统允许的最大作业为n,假定模拟实验中n值为10*/#define m 10 /*假定系统允许的空闲区表最大为m,假定模拟...

阿巴嘎旗15947567053: C语言 利用字符数组实现两个大整数的加法 添加注释 -
田凯调中: #include <string.h> #include <stdio.h> void f1(char *a,char *b) //一个函数 { char t[101];if(strlen(a)<strlen(b)) //比较前的准备{t[101]=0; strcpy(t,a); //把a中内容拷贝到字符串t中 strcpy(a,b);strcpy(b,t); //以上三条实现a与b的交换 } } void f(char *t1,...

阿巴嘎旗15947567053: C语言2个超长数相加程序?? -
田凯调中: 高精度加法(以下程序只是整数相加,可举一反三) 就相当于竖式加法.PS,我是个OIer#include<stdio.h>#include<string.h>/*功能是返回两个大整数的和,用字符数据组c返回.*/ char c[200]; char *add(char *a,char *b) { char tmp;int i,max,lc; int ...

阿巴嘎旗15947567053: C语言如何实现大数相加问题,各位高手多多指教! -
田凯调中: 可以的.我曾经编写过100的阶乘的程序.在这个程序中,计算结果达到几千位,这样大的数据很明显是任何数据类型都表示不了的.不过,你可以把大数用数组来表示,比如1258746这个数,你用数组 a[]={0,0,0,...,0,1,2,5,8,7,4,6}来表示,然后...

阿巴嘎旗15947567053: c语言大数相加,求解 -
田凯调中: 溢出了,int也就是6万多,long也就是10几位,再多了,就报错了.这个你该知道 大数,需要字符串来处理,不能简单的相加就好 需要每个位,也就是ab的每个单元相加,个位对齐,进位处理

阿巴嘎旗15947567053: c语言超大数做加法,怎么定义
田凯调中: 可以用数组制作. 都知道int,float,double的精度和可使用的范围都是有限的,对于大数相减,总是会产生溢出的情况. 所以对于大数相减,认为可以用数组来做.比如,定义一个数组a[100];a[1]用来保存个位数,a[2]用来保存十位数,等等. 如果a[i]的值大于或等于10,就让a[i+1]++,a[i]-10就行了. 在打印的时候就用一个for语句,再调一下输出格式就可以了.

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