大数运算 大数求余

大数运算的思想就是用数组保存某个数字的各个数据位,

然后进行运算,并同样分割保存结果。

参考下面:

/*用数组存储数字,可以超越数据类型的限制,实现极大数的加法,减法和乘法 */

/*2005-3-7 梁见斌*/

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define MAX 80

int a[MAX]={0}, b[MAX]={0};

int *r, *s;

char e[40], f[40];/* e[30]和f[30]存放以字符串形式输入的乘数和被乘数*/

char *p, *q;

void NiZhi(int *ShuZu, int len);/*把数字逆置,把个位数字存储在a[0]*/

void ZhuanHuan(char *ZhiFu, int *ShuZi, int len);/*把字符改存为整型数字*/

int PanDuan(int len);/*当len1=len2时判断a[]和 b[]谁大 */

void JiaFa(int len1, int len2);

void JianFa(int len1, int len2);

void ChengFa(int len1, int len2);

int main(void)

{

int len1, len2;

int choice;

do{

puts( "请您选择操作的方式: ");

puts( "t加法请按1 ");

puts( "t减法请按2 ");

puts( "t乘法请按3 ");

scanf( "%d ", &choice);

}while(choice < 1 || choice > 3);

r=a;

s=b;

p=e;

q=f;

puts( "Inter m: ");

scanf( "%s ", p);

puts( "Inter n: ");

scanf( "%s ", q);

len1=strlen(e);

len2=strlen(f);

ZhuanHuan(p, r, len1);

ZhuanHuan(q, s, len2);

NiZhi(r, len1);

NiZhi(s, len2);

switch(choice)

{

case 1: JiaFa(len1, len2);

break;

case 2: JianFa(len1, len2);

break;

case 3: ChengFa(len1, len2);

break;

default: printf( "It 's error ");

}

system( "pause ");

return 0;

}

void NiZhi(int *ShuZu, int len)

{

int i, t;

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

大数运算 大数求余
{

t=*(ShuZu+i);

*(ShuZu+i)=*(ShuZu+len-i-1);

*(ShuZu+len-i-1)=t;

}

}

void ZhuanHuan(char *ZhiFu, int *ShuZi, int len)

{

int i;

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

*(ShuZi+i)=int(*(ZhiFu+i))-48;

}

void ChengFa(int len1, int len2)

{

int i, j, k;

int c[MAX]={0}, aa[MAX]={0};/*a[max]和aa[max]存放被乘数,b[max]存放乘数,c[max]存放积*/

int x, jinwei, d;

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

{

for(j=0; j <=len1; j++)/*每次都使 aa[ ]表示被乘数*/

aa[j]=a[j];

d=20;/*提供足够多的存储空间以存放积的进位,此处设为20,可根据数据的大小调节*/

jinwei=0;/*c表示积的进位,初值为0*/

for(j=0; j <=len1+d; j++)/*用乘数的每一位从个位开始依次和被乘数相乘,用aa[ ]存储当前积*/

{

x=aa[j]*b[i]+jinwei;

jinwei=x/10;

aa[j]=x%10;

}

while(a[j] == 0)/*用j表示现有数字的个数,多出的存储空间应消除*/

j--;

d=4;/*提供足够多的存储空间以存放积的进位,此处设为4,可根据数据的大小调节*/

jinwei=0;/*c表示积的进位,初值为0*/

for(k=0; k <=j+d; k++)/*c[max]存放原始积,注意每次把当前积与原始积时相加时两者的位置对应情况*/

{

x=aa[k]+c[k+i]+jinwei;

jinwei=x/10;

c[k+i]=x%10;

}

}

k=k+i; /*用k表示现有数字的个数,多出的存储空间应消除*/

while(c[k] == 0)

k--;

printf( "%s * %s =n ", p, q);

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

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

}

void JiaFa(int len1, int len2)

{

int i, j;

int x, jinwei, max;

max=(len1 > = len2)?len1:len2;

jinwei=0;

for(i=0; i <=max+2; i++)

{

x=a[i]+b[i]+jinwei;

jinwei=x/10;

a[i]=x%10;

}

while(a[i] == 0)/*用j表示现有数字的个数,多出的存储空间应消除*/

i--;

printf( "%s + %s =n ", p, q);

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

printf( "%d ",a[j]);

}

void JianFa(int len1, int len2)

{

int i, j;

int max;

int flag=0;

if(len1 == len2)/*当len1=len2时判断a[]和 b[]谁大 */

flag=PanDuan(len1);

if((len1 > len2) || (len1 == len2) && flag)/*若m大于n直接按m-n计算*/

{

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

{

if(a[i] > = b[i])

a[i]=a[i]-b[i];

else

{

a[i+1]-=1;

a[i]=a[i]+10-b[i];

}

}

while(a[i] == 0)/*用j表示现有数字的个数,多出的存储空间应消除*/

i--;

printf( "%s - %s =n ", p, q);

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

printf( "%d ",a[j]);

}

else/*若m小于n,则按n-m计算,输出结果前面加负号*/

{

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

{

if(b[i] > = a[i])

b[i]=b[i]-a[i];

else

{

b[i+1]-=1;

b[i]=b[i]+10-a[i];

}

}

while(b[i] == 0)/*用j表示现有数字的个数,多出的存储空间应消除*/

i--;

printf( "%s - %s =n ", p, q);

printf( "- ");

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

printf( "%d ",b[j]);

}

}

int PanDuan( int len)

{

int i=len;

while(a[i] > = b[i] && i > = 0)

i--;

if(i > = 0)

return 0;

else if((i < 0) && (a[i+1] == b[i+1]))

{

printf( "nThe answer is 0 ");

system( "pause ");

exit(0);

}

else

return 1;

}

六楼的这位人兄的答案太经典了,

如果我们用通用格式些,如:

void add_multibyte(void *a,void *b,void *c,char len_a,char len_b,char len_c)

{

/*

*a,数据a的起始地址;len_a,数据a的长度;

*b,数据b的起始地址;len_b,数据b的长度;

*c,数据c的起始地址; len_c,数据c的长度;

实现将 数据a+数据b 的值放到数据c的起始地址中。

*/

}

void sub_multibyte(void *a,void *b,char len_a,char len_b)

{

/*

*a,数据a的起始地址;len_a,数据a的长度;

*b,数据b的起始地址;len_b,数据b的长度;

实现将 数据a - 数据b 的值放到数据a的起始地址中。

*/

}

void mul_multibyte(void *a,void *b,void *c,char len_a,char len_b,char len_c)

{

/*

*a,数据a的起始地址;len_a,数据a的长度;

*b,数据b的起始地址;len_b,数据b的长度;

*c,数据c的起始地址; len_c,数据c的长度;

实现将 数据a * 数据b 的值放到数据c的起始地址中。

*/

}

void sub_multibyte(void *a,void *b,char len_a,char len_b)

{

/*

*a,数据a的起始地址;len_a,数据a的长度;

*b,数据b的起始地址;len_b,数据b的长度;

实现将 数据a / 数据b 的值放到数据a的起始地址中。

*/

}

这样就可是实现外部的调用了

  

爱华网本文地址 » http://www.aihuau.com/a/25101012/132254.html

更多阅读

《超简交易》连载4:大数法则-交易方法上

一、大数法则大数法则(LawofLargeNumbers),又称“贝努利大数定律”或“平均法则”,它是概率论中的一个最重要法则。它是指,某些“有规律的随机事件”在大量重复出现的条件下,往往会呈现出几乎必然的统计特性。 比如:大量的做“扔硬币”的试

大数定律是必然的吗? 什么是大数定律

【孙志超的回答(52票)】:哲学和数学一样是门严谨的学科,无论在哪个层面下,大数定律都是经过推演和论证的,根本不存在“是不是必然”这种说法,当然是必然的,除非加个神学的标签……所以可以探讨的只是大数定律应用于实践是不是必然的?而对

第一单元《大数的认识》教学反思 圆的认识教学反思

第一单元《大数的认识》教学反思《大数的认识》教学反思本单元在学生认识万以内数的基础上,进一步认识更大的数在实际生活中的运用,掌握更大数的读写,并能在数据的收集过程中,认识近似数。学习的内容主要有四个部分:亿以内数的认识、亿

菩提心论 占察善恶业报经

金刚顶瑜伽中发阿耨多罗三藐三菩提心论大兴善寺三藏沙门不空奉 诏译大广智阿阇黎云。若有上根上智之人。不乐外道二乘法。有大度量。勇锐无惑者。宜修佛乘。当发如是心。我今志求阿耨多罗三藐三菩提不求余果。誓心决定故。魔宫震动

声明:《大数运算 大数求余》为网友有梦总比没梦好分享!如侵犯到您的合法权益请联系我们删除