导航:首页 > 方法技巧 > 如何找大数乘大数的计算方法

如何找大数乘大数的计算方法

发布时间:2022-04-29 05:15:11

Ⅰ C语言中如何实现大数计算

/*关于任意精度大数的高精度求幂运算

在以前的文章中看到介绍一种算法,就是使用10000进制法,用数组来存储数据。
原理如下:
先说计数方法:
十进制和其他进制都是用权和数字(好象这里名词不对,记不清楚了)来计数的:
比如

num=123456790
这个数的大小就是:
0*10^0+9*10^1+7*10^2+...+1*10^8
我们可以这样来写这个数:
123 456 790
令a=123,b=456,c=790
那么,abc看起来就象和123456790是一样的

看到这里你明白了吧?
我们可以分段表示一个非常大的数而不必考虑它的溢出,
而只用考虑段数是否大于一个数即可
举个例子:
上边,a的最大值是999,bc也同样都是,我们只用保证这三个数不溢出
那么,num就不会溢出

再一个乘法.

我们老祖宗给我们留下的算盘,很妙,
它其实就是最基本的计算机之一

我们算乘方时,
只用乘以一个数:
这样来列式子:
123456790
*2=
--------------
246913580

即:
123 456 790
*2= *2= *2=
----- ----- ------
246 912 (1)580(溢出) 第三段有溢出,加到上一段
----- ----- --------
246 913 580

呵呵,就这样,打算盘一样,进位.

至此,我们已经将需要计算的溢出和乘方计算问题解决了,只用看代码了:
程序用一个含有1024个无符号整数(上限65536)的数组来存放各段数据
每一个数是一段,每一个数据可以表示9999这么大的数(便于进位)
计算一次,检查是否超过9999,如果超过,把这一段减去10000,
然后向上一个位(即上一个数)进1(这可以称为 "一万进制 ")
程序可以计算小于2的13605次方,大于0次方的任意的二的乘方

其实这样算起来一点也没有必要,不过,我觉得好玩,过瘾.
另外,借助对数,可以很轻松的算出这些来,
相比之下,本程序无任何误差而已

我称这个算法为 " '一万进制 '算盘法 ":

*/
#include "stdio.h "
int main(void)
{
static unsigned int temp[1024];/*分段储存数据*/
unsigned int position=1;/*记录共有几段*/
int overflow=0; /*记录在算每一段时是否溢出*/
long
times=10000,tm_cnt,sgn_cnt;/*默认10000次计算,可以更改,两个计数器(乘方次数,段的位置)*/
temp[0]=2;/*初始值为2*/
if(times> 13000)
{
printf( "your input is too large ");/*检查输入是否越界*/
exit(0);
}
/*开始计算,外层为乘方次数,内层为每一位计算*/
for(tm_cnt=0;tm_cnt <times-1;tm_cnt++)
{
for(sgn_cnt=0;sgn_cnt <position;sgn_cnt++)
{

temp[sgn_cnt] < <=1;/*相当于乘2*/
if(overflow==1) /*检查上次是否有溢出*/
{
/*有的话,将溢出加到这一段,同时置溢出为0*/
++temp[sgn_cnt];
overflow=0;
}

if(temp[sgn_cnt]> 9999)
{
/*检查本次是否溢出,溢出的话,*/
temp[sgn_cnt]-=10000;
overflow=1;
}

}
if(overflow==1)
{
++position;
++temp[sgn_cnt];
overflow=0;
}
if(position> 1023)
{

printf( "times: %d error! ",tm_cnt);
exit(1);
}
}

printf( "%d ",temp[sgn_cnt-1]);
for(sgn_cnt=position-2;sgn_cnt> =0;sgn_cnt--)
{
if(temp[sgn_cnt] <1000)
printf( "0 ");
if(temp[sgn_cnt] <100)
printf( "0 ");
if(temp[sgn_cnt] <10)
printf( "0 ");
printf( "%d ",temp[sgn_cnt]);
if((sgn_cnt+1)%15==0)
printf( "\n ");
}
return 0;
}

2的1000次方:
199 5063 1168 8075
8384 8837 4216 2683 5850 8382 3496 8318 8619 2454 8520 0894 9852 9438 8302
2194 6631 9199 6168 4036 1945 9789 9331 1294 2320 9124 2715 5649 1349 4137
8111 7593 7859 3209 6323 9578 5573 0046 7937 9452 6765 2465 5126 6059 8955
2055 0086 9181 9331 1542 5086 0846 0618 1046 8550 9074 8660 8962 4888 0904
8989 4838 0092 5394 1633 2578 5062 1568 3094 7390 2556 9123 8806 5225 0966
4387 4441 0467 5987 1626 9854 5322 2868 5381 6169 4315 7756 2964 0762 8368
8076 0732 2285 3509 1641 4761 8395 6381 4589 6946 3899 4108 4096 0536 2678
2106 4621 4273 3339 4036 5255 6564 9530 6031 4268 0234 9694 0033 5934 3166
5145 9297 7732 7966 5775 6061 7258 2031 4079 9419 8179 6073 7824 5683 7622
8003 7302 8854 8725 1900 8344 6458 1454 6505 5792 9601 4148 3392 1615 7345
8813 9257 0953 7976 9119 2778 0082 6957 7356 7444 4123 0620 1875 7836 3255
0272 8323 7892 7071 0373 8028 6639 3031 4281 3324 1401 6241 9567 1690 5740
6141 9654 3423 2463 8801 2488 5614 7305 2074 3199 2259 6117 9625 0130 9928
6024 1708 3408 0760 5932 3201 6126 8492 2884 9625 5841 3128 4406 1536 7389
5148 7114 2563 1511 1089 7455 1420 3313 8202 0293 1640 9575 9646 4756 0104
0584 5841 5660 7204 4962 8670 1651 5061 9206 3100 4186 4222 7590 8670 9005
7460 6417 8569 5191 1456 0550 6825 1250 4060 0751 9842 2618 9805 9237 1180
5444 4788 0729 0639 5242 5483 3922 1982 7074 0447 3162 3767 6084 6613 0337
7870 6039 8034 1319 7133 4936 5462 2700 5631 6993 7455 5082 4178 0972 8109
8329 1314 4035 7187 7524 7685 0985 7276 9379 2643 3221 5993 9987 6886 6608
0836 8837 8380 2764 3282 7751 7227 3657 5727 4478 4112 2943 8973 3810 8616
0742 3253 2919 7481 3120 1976 0417 8281 9656 9747 5898 1645 3125 8434 1359
5986 2784 1301 2818 5406 2834 7664 9088 6905 2104 7580 8826 1582 3961 9857
7012 2407 0443 3058 3075 8690 3931 9604 6034 0497 3156 5832 0867 2105 9133
0090 3752 8234 1553 9745 3943 9771 5257 4552 9051 0212 3109 4732 1610 7534
7482 5740 7752 7398 6348 2984 9834 0756 9379 5564 6638 6218 7456 9499 2790
1657 2103 7013 6443 3135 8172 1431 1791 3982 2298 3845 8473 3444 0270 9641
8285 1005 0729 2774 8364 5505 7863 4501 1008 5298 7812 3894 7392 8699 5408
3434 6158 8070 4395 9118 9858 1514 5779 1771 4361 9698 7281 3145 9483 7832
0208 1474 9821 7185 8011 3890 7122 8250 9058 2681 7436 2205 7747 5921 4176
5371 5687 7256 1490 4582 9049 9246 1028 6300 8153 5583 3081 3010 1987 6758
5623 4343 5389 5540 9175 6234 0084 4887 6264 3568 6488 3351 9463 7203
7729 3240 0944 5624 6923 2543 5040 0678 0272 7383 7755 3764 0672 6898 6362
4103 7491 4109 6671 8557 0507 5909 8100 2467 8988 0178 2719 2595 3381 2824
2195 4028 3027 5940 8448 9550 1467 6668 3896 9799 6886 2416 3631 3376 3939
0337 3455 8014 0763 6741 8777 1105 5384 2257 3949 9110 1864 6821 9696 5816
5148 5130 4942 2236 9947 7147 6306 9155 4682 1768 2876 2003 6277 7257 7237
8136 5331 6111 9681 1280 7926 6948 1887 2012 9864 3660 7685 5163 9860 5346
0229 7871 5575 1794 7385 2463 6944 6923 0878 9426 5948 2170 0805 1120 3223
6549 6288 1690 3573 9121 3683 3839 3591 7564 1873 3850 5109 7027 1613 9154
3959 0991 5981 5465 4417 3363 1165 6936 0311 2224 9937 9699 9922 6781 7323
5802 3111 8626 4457 5299 1357 5817 5008 1998 3923 6284 6152 4988 1088 9602
3224 4362 1737 7161 8086 3570 1546 8484 0586 2232 9792 8538 7562 3486 5564
4053 6962 6220 1896 3571 0288 1236 1567 5125 4333 8303 2700 2909 7668 6505
6855 7157 5055 1672 7518 8991 9412 9711 3376 9014 9916 1813 1517 1544 0077
2865 0573 1895 5745 0920 3301 8530 4847 1138 1831 5407 3240 5331 9038 4620
8403 6421 7637 0391 1550 6397 8900 0742 8536 7219 6280 9034 7797 4533 3204
6836 8795 8685 8023 7952 2186 2912 0080 7428 1955 1317 9481 5762 4448 2985
1846 1509 7048 8802 7274 7215 7468 8131 5947 5040 9732 1150 8049 8190 4558
0341 6826 9497 8714 1316 0632 1068 6391 5116 8177 4304 7925 9670 9376

Ⅱ 大数乘法 用什么算法啊

大数乘法基本上是乘法竖式笔算的代码化。
基本功能有3个
1.
大数的数组表示。
2.
大数乘以小数,得到大数。
3.
大数加大数,得到大数。
对于1,其实就是int数组的每个元素存储若干位。比如每个元素保存4个十进制位。[0]存储个十百千,[1]存储万、十万、百万、千万,诸如此类。一个数组保存一个大数。因此需要一个额外的int变量记录当前数组用了多少个元素(类似于字符串长度)。
对于2,“小数”指的是能用一个int保存的数。注意这里只限4个二进制位(和1里提到的位数一致)。
比如1
2345
6789这个数字,[0]保存6789,[1]保存2345,[2]保存1。长度3。
这个大数乘以小数,比如9999,过程就是[0]
*
9999,即6789
*
9999
=
6788
3211,积的低四位(%10000)3211保存到积(大数)的[0],剩下6788的进位到[1]。
然后2345
*
9999
= 2344
7655,加上刚才进位上来的6788得到2345
4443,其中4443保存到积(大数)的[1]中,2345进位到[2]。
以此类推。
对于3,基本只要一个for,对位相加然后注意进位就行了。
大数乘以大数,其实就是第一个大数先乘以第二个大数的[0](大数乘小数,上面的2),得到一个大数a0;然后第一个大数乘以第二个大数的[1],又得到一个大数a1……最后再将a0、a1、……加起来(也就是大数加法,上面的3)。加的时候要注意,a1的[0]要和a0的[1]对齐,a2的[0]要和a1的[1]和a0的[2]对齐……这个也和我们竖式笔算一样。
ps:上面的算法基本上是“10000进制数”的计算方式。如果数组的每个元素只保存1个十进制位,那就是10进制数。之所以用10000进制,纯粹是程序员感觉上好一些。最有效的利用,是每个int保存2的15次方,也就是32768进制。要注意到,如果用10进制计算的话,程序的计算耗时会变成10000进制的16倍,也就是效率变成1/16。
ps2:用int数组的话,位数最多只能是4位。因为5位数相乘可能得到11位数,超出了int表示范围。

Ⅲ 求高人给我讲大数的乘除法 如99999x77778 还要有更大的数 数位更多 这种题什么窍门啊

99999*77778
=(100000-1)*77778
=100000*77778-1*77778
=100000-77778
=100000-(70000+7000+700+70+8)
=100000-70000-7000-700-70-8
=30000-7000-700-70-8
=23000-700-70-8
=22300-70-8
=22230-8
=22222
方法就是把最接近整百整千整万…的数字变成整(百千…)减去它们的差,还有就是加如:
10010*888
=(10000+10)*888
=10000*888+10*888
=8880000+8880
=8888880

Ⅳ 大数定律是怎么运算的有人知道吗

大数定律(laws of large number)
编辑本段【基本概念】
概率论历史上第一个极限定理属于贝努里,后人称之为“大数定律”。概率论中讨论随机变量序列的算术平均值向常数收敛的定律。概率论与数理统计学的基本定律之一。又称弱大数理论。
编辑本段【主要含义】
在随机事件的大量重复出现中,往往呈现几乎必然的规律,这个规律就是大数定律。通俗地说,这个定理就是,在试验不变的条件下,重复试验多次,随机事件的频率近似于它的概率。比如,我们向上抛一枚硬币,硬币落下后哪一面朝上本来是偶然的,但当我们上抛硬币的次数足够多后,达到上万次甚至几十万几百万次以后,我们就会发现,硬币每一面向上的次数约占总次数的二分之一。偶然必然中包含着必然。
编辑本段【发展历史】
1733年,德莫佛——拉普拉斯在分布的极限定理方面走出了根本性的一步,证明了二项分布的极限分布是正态分布。拉普拉斯改进了他的证明并把二项分布推广为更一般的分布。1900年,李雅普诺夫进一步推广了他们的结论,并创立了特征函数法。这类分布极限问题是当时概率论研究的中心问题,卜里耶为之命名“中心极限定理”。20世纪初,主要探讨使中心极限定理成立的最广泛的条件,二三十年代的林德贝尔格条件和费勒条件是独立随机变量序列情形下的显着进展。 贝努里是第一个研究这一问题的数学家,他于1713年首先提出后人称之为“大数定律”的极限定理。
编辑本段【举例说明】
例如,在重复投掷一枚硬币的随机试验中,观测投掷n次硬币中出现正面的次数。不同的n次试验,出现正面的频率(出现正面次数与n之比)可能不同,但当试验的次数n越来越大时,出现正面的频率将大体上逐渐接近于1/2。又如称量某一物体的重量,假如衡器不存在系统偏差,由于衡器的精度等各种因素的影响,对同一物体重复称量多次,可能得到多个不同的重量数值,但它们的算术平均值一般来说将随称量次数的增加而逐渐接近于物体的真实重量。由于随机变量序列向常数的收敛有多种不同的形式,按其收敛为依概率收敛,以概率 1 收敛或均方收敛,分别有弱大数定律、强大数定律和均方大数定律。常用的大数定律有:伯努利大数定律、辛钦大数定律、柯尔莫哥洛夫强大数定律和重对数定律。
设有一随机变量序列,假如它具有形如(1)的性质,则称该随机变量服从大数定律。
伯努利大数定律设μn为n重伯努利实验中事件A发生的次数,p为每次实验中A出现的概率,则对任意的ε>0,有(2)成立。
马尔可夫大数定律对随机变量序列,若(3)成立,则服从大数定律,即对任意的ε>0,(1)式成立。
辛钦大数定律设为独立同分布的随机变量序列,若Xi的数学期望存在,则服从大数定律,即对任意的ε>0,(1)成立。

Ⅳ 请构造一个大整数乘法的计算方法,并用函数实现,原型为: int mul(int a[], int n, int b);

#include<iostream>
using namespace std;
int mul(int a[], int n, int b)
{
int c = 0, d = 0, i = 0;
for (int j = 0; j < n; j++)
{
d = ((a[j] + c) * b) % 10;
c = (a[j] + c) * b / 10;
a[j] = d;
i++;
}
while (c > 0)
{
a[i++] = (c % 10);
c /= 10;
}
return i;
}
void main()
{
int n, a[10000], m = 0, p;
a[0] = 1;
cin >> n;
p = n;
while (p)
{
a[m] = p % 10;
m++;
p /= 10;
}

m = mul(a, m, 123456);

for (int j = m - 1; j >= 0; j--)
cout << a[j];
}

Ⅵ 如何实现大数相乘

网上搜的,评分较高的。
/*--------------------------------------------------------------------------
*函数名称: 大数乘法
*函数过程:1 输入两个大数作为字符串
* 2 作一个双向链表
* 3 两个指针分别指向数字字符串的最低位
* 4 以第一个数的最低的一个位乘以第二个数的所有项存于链表中
* 5 链表首指针移
* 6 重复4,5依次从最低位乘到最高位
* 7 乘完后因为最低位是链表首,最后一位是链表尾。所以在逆顺输出链表。
* 4 直到循环结束
*入口参数:numa,numb,result字符串
*出口参数:无
*--------------------------------------------------------------------------*/
void multiply(char *numa, char *numb ,char *result)//用来储结果的)//计算乘积
{
char *pna = findend(numa);//指向numa的一个指针。point numa pna 指向乘数的最低位,
char *pnb = findend(numb);//指向numb的一个指针 //pnb 指向被乘数的最低位,
int along=(int)strlen(numa);//标记数字a的长度;
int blong=(int)strlen(numb);//标记数字b的长度;
int carry=0,temp_result;//存贮进位 和临时结果的
Node *head, // 用于存贮头指针
*pstart, // 用于存贮计算时的首指针
*pnew, //作于申请新结点
*pgo; //作为每计算完一行时,回到下一行起始节点用,移位标致来用
head = pstart =new Node;//初始化首结点和头结点。
pstart -> data = 0;
pstart -> next = NULL;
pstart -> ahead = NULL;
while (along--)
{
pgo = pstart;//保存进位点
blong = (int)strlen(numb);//初始化长度
pnb = findend(numb); //初始化指针
while ((blong-- && (blong>=0))|| carry != 0)
{
if(!pstart->next)//如果当前为空结点,则申请新结点
{
pnew = new Node;
pnew -> data = 0;
pnew -> next = NULL;
pnew -> ahead = pstart;
pstart -> next = pnew;
}
if(blong<0)temp_result = carry ;//处理只有进位的情况
else temp_result =(pstart->data+(*pna-48)*(*pnb-48)+carry);//自身值+新值+进位作为新值
pstart -> data = temp_result%10; //存贮个位
carry = temp_result/10; //存贮进位
pstart = pstart -> next; //结点移动
pnb--; //指针移向被乘数高位
}
pstart = pgo->next; //前进一个位置;
pna--; //指针移向乘数高位
}
pstart =head;//寻找链表的结尾点
while(pstart->next != 0)
{
pstart->data += 48;//!!<<<因为我们的输出是字符。所以再此加上48>>>> 逆顺输出
pstart = pstart->next ;
}
int tip = 0;//转为字符串用
pstart = pstart->ahead ;//找有效字
while(pstart != 0)//输出正序的结果;
{
result[tip++] = pstart->data;
pstart = pstart->ahead ;
}
result[tip] = '\0';
pstart =head; //释放空间
while(pstart->next != 0)
{
pnew = pstart->next ;delete pstart;
pstart =pnew;
}
return ;
}

Ⅶ 如何输入一个大数 很大的数 并进行计算的

我觉得可以把很大的数看成是字符串,先将字符串输入到变量里,然后把他分解成计算机能计算的数据。然后通过atoi函数把分解后的字符串变成数据。
例子:
char s[] = "";
char a1[] = 数组s的前8位
char a2[] = 8到16位.............依次分解数组s
int n = atoi(a1);//依次变字符串为整数
然后进行数学计算,
计算完在把数据变成字符串 itoa()
然后再把a1,a2....数组连起来 就是最后的值了

Ⅷ 如何实现两个超大整数的相乘

*函数名称: 大数乘法
*函数过程:1 输入两个大数作为字符串
* 2 作一个双向链表
* 3 两个指针分别指向数字字符串的最低位
* 4 以第一个数的最低的一个位乘以第二个数的所有项存于链表中
* 5 链表首指针移
* 6 重复4,5依次从最低位乘到最高位
* 7 乘完后因为最低位是链表首,最后一位是链表尾。所以在逆顺输出链表。
* 4 直到循环结束
*入口参数:numa,numb,result字符串
*出口参数:无
*--------------------------------------------------------------------------*/
void multiply(char *numa, char *numb ,char *result)//用来储结果的)//计算乘积
{
char *pna = findend(numa);//指向numa的一个指针。point numa pna 指向乘数的最低位,
char *pnb = findend(numb);//指向numb的一个指针 //pnb 指向被乘数的最低位,
int along=(int)strlen(numa);//标记数字a的长度;
int blong=(int)strlen(numb);//标记数字b的长度;
int carry=0,temp_result;//存贮进位 和临时结果的
Node *head, // 用于存贮头指针
*pstart, // 用于存贮计算时的首指针
*pnew, //作于申请新结点
*pgo; //作为每计算完一行时,回到下一行起始节点用,移位标致来用
head = pstart =new Node;//初始化首结点和头结点。
pstart -> data = 0;
pstart -> next = NULL;
pstart -> ahead = NULL;
while (along--)
{
pgo = pstart;//保存进位点
blong = (int)strlen(numb);//初始化长度
pnb = findend(numb); //初始化指针
while ((blong-- && (blong>=0))|| carry != 0)
{
if(!pstart->next)//如果当前为空结点,则申请新结点
{
pnew = new Node;
pnew -> data = 0;
pnew -> next = NULL;
pnew -> ahead = pstart;
pstart -> next = pnew;
}
if(blong<0)temp_result = carry ;//处理只有进位的情况
else temp_result =(pstart->data+(*pna-48)*(*pnb-48)+carry);//自身值+新值+进位作为新值
pstart -> data = temp_result%10; //存贮个位
carry = temp_result/10; //存贮进位
pstart = pstart -> next; //结点移动
pnb--; //指针移向被乘数高位
}
pstart = pgo->next; //前进一个位置;
pna--; //指针移向乘数高位
}
pstart =head;//寻找链表的结尾点
while(pstart->next != 0)
{
pstart->data += 48;//!!<<<因为我们的输出是字符。所以再此加上48>>>> 逆顺输出
pstart = pstart->next ;
}
int tip = 0;//转为字符串用
pstart = pstart->ahead ;//找有效字
while(pstart != 0)//输出正序的结果;
{
result[tip++] = pstart->data;
pstart = pstart->ahead ;
}
result[tip] = '\0';
pstart =head; //释放空间
while(pstart->next != 0)
{
pnew = pstart->next ;delete pstart;
pstart =pnew;
}
return ;
}

Ⅸ C语言编程求两个大数的乘积,帮忙看一个程序分析一下

voidcompute(char*a,char*b,char*c)
{
inti,j,m,n;
longsum,carry;
m=strlen(a)-1;//第一个乘数的位数
n=strlen(b)-1;//第二个成熟的位数
for(i=m;i>=0;i--)a[i]-='0';//将数字字符转变成数
for(i=n;i>=0;i--)b[i]-='0';//将数字字符转变成数
c[m+n+2]='';//积的字符串末尾置0
carry=0;//进位。下面是从个位起逐位计算每一位的数值,用的方法与人工列竖式计算完全一样
for(i=m+n;i>=0;i--)//从积个位(最后面)到最高位(最前面)
{
sum=carry;//该位累加,先加上后面一位计算中的进位
if((j=i-m)<0)j=0;//第i位的计算与第一个乘数中i位之前的各位没有关系
for(;j<=i&&j<=n;j++)sum+=a[i-j]*b[j];//循环计算有关各位相乘的积并累加
c[i+1]=sum%10+'0';//计算累加结果的个位,就是当前位的值,+'0'转化成字符
carry=sum/10;//计算结果除以10,是向前面一位的进位
}
if((c[0]=carry+'0')=='0')c[0]='40';//前面的0改成空格
}

..........12345--------a

..........x1234--------b

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

..........49380

.......37035

....24690

..12345

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

..15233730

积的:

个位:b的个位×a的个位=4×5=20,个位0,进位2;

十位:后面进位+b的个位×a的十位+b的10位×a的个位=2+4×4+3×5=33,十位3,进位3

百位:后面进位+b的个位×a的百位+b的10位×a的十位+b的100位×a的个位=3+4×3+3×4+2×5=37,百位7,进位3

千位:后面进位+b的个位×a的千位+b的10位×a的百位+b的100位×a的10位+b的千位×a的个位=3+4×2+3×3+2×4+1×5=33,百位3,进位3

其余类推。

..........12345--------a

..........x1234--------b

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

..................20....4×5

................16....4×4

................15....3×5

-----------

................33

..............12....4×3

..............12....3×4

..............10....2×5

----------

..............37

..............8....4×2

..............9....3×3

..............8....2×4

..............5....1×5

---------

............33

............4....4×1

............6....3×2

............6....2×3

............4....1×4

--------

.........23

.........3....3×1

.........4....2×2

.........3....1×3

------

.......12

.......2....2×1

.......2....1×2

-----

.......5

.....1....1×1

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

....15233730

Ⅹ c语言大整数乘法

dc这个函数里面连b这个参数都没有使用,这也能出结果...,

if(z[0]='0')continue 也写错了

不是打击你,你的代码太滥了,实在不想去找错误,给你我以前写的代码吧,你自己整理一下

#include <stdio.h>

int mulx(char * a,int b,char * r,int d);
void init(char * s);

char buf1[4*1024];
char buf2[4*1024];
char buf3[4*1024];
int main()
{
char * a;
char * b;
char * r;
char * t;
int d;
int i;

a = buf1;
b = buf2;
r = buf3;

init(NULL);

while(scanf("%s %d",a,&d)!=EOF)
{
mulx(a,d,r,10);
printf("%s\n",r);
}

return 0;
}

char c2d[256]; //字符转换成数字
char * charset; //代表数字的字符

/*功能:设置使用那些字符表示数字,默认的为"0123456789ABCDEF"*/
/*参数:*/
/*返回值:*/
void init(char * s)
{
int i;
if(s==NULL)
charset = "0123456789ABCDEF";
else
charset = s;
for(i=0;i<256;i++)
c2d[i] = 0;
for(i=0;charset[i];i++)
c2d[charset[i]] = i;
}

/*功能:清除前导零*/
/*参数:需要清楚的数字*/
/*返回值:清零后数字的位数*/
int clearZeros(char * a)
{
int i,j;
for(i=0;a[i]==charset[0];i++);
for(j=0;a[i];i++,j++)
a[j] = a[i];
a[j] = 0;
if(j==0)
{
a[j++] = charset[0];
a[j] = 0;
}
return j;
}

/*功能:乘,用于进制转换之类*/
/*参数:a 和 b 分别为乘数,结果保存到 r , d 为使用的进制*/
/*注意:r 可以等于 a , b一定要小于d, 如果被乘数有前导0 则结果也会有前导0*/
/*返回值:结果的位数*/
int mulx(char * a,int b,char * r,int d)
{

int i,j,k,len;
int c,t;

if(r==NULL)
r = a;
for(i=0;a[i];i++);

len = k = i;
for(c=0,i--,r[k--]=0;i>=0 ;i--,k--)
{
t = c2d[a[i]] * b + c ;
c = t/d;
r[k] = charset[t%d];
}
if(c)
{
for(i=len,j=++len;i>=0;i--,j--)
r[j] = r[i];
r[0]=charset[c];
}
return len;
}

阅读全文

与如何找大数乘大数的计算方法相关的资料

热点内容
oppo手机的助手在哪里设置方法 浏览:532
尖头b2单边桥最简单方法如何对点 浏览:129
灯带安装方法直流 浏览:81
衬衣领子打结方法视频 浏览:973
修复冰晶使用方法 浏览:242
受益所有人的计算方法 浏览:876
黄豆怎么收购方法去杂 浏览:651
a5c用简便方法表示 浏览:262
正方形面积的计算方法 浏览:269
国标铝的检测方法 浏览:110
boa9连接wifi方法 浏览:861
尿素水溶液的检测方法 浏览:565
评职称里的技术创新方法怎么写 浏览:234
电脑取出电池充电方法 浏览:382
体育课快速热身方法 浏览:789
如何看出html的解密方法 浏览:768
弹力带健身使用方法 浏览:596
如何鉴定蜂蜜真假的方法 浏览:661
科目二教育原则和方法有哪些 浏览:849
肝结节怎么治疗最好方法 浏览:850