导航:首页 > 源码编译 > 超大乘法算法

超大乘法算法

发布时间:2023-01-04 05:59:06

❶ 怎样用C语言做超大整数的加减运算

用高精度算法来实现,即用数组或指针来储存数字,例如A〔20〕来储存a ,用B〔20〕来储存b,这样a 和b就可以是很大的数,再用一个C〔21〕来储存结果,为什么C要21呢,你知道,加法是要近位的,呵呵。这里给出相加的伪代码,d =0/*用来存储近位*/,for i=0到19{c=A〔i〕+B〔i〕+d ,d =c/10,c=c%10,C〔i〕=c}if d 不等于0 C〔i+1〕=d ,再逆的输出C就可以了!编程要学会思考,现在你可以试试编下高精度乘法,例如可以输出100的阶乘!

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

*函数名称: 大数乘法
*函数过程: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语言定义超大数字类型

没有这样的类型,不过大数可以通过大数数组来实现,有专门的数据结构算法。
可以参考如下的乘法实现:
大数乘法:按照32位机器表示法,最多可计算结果为32位以内的数的乘法,否则会溢出;借助字符串转换,可以解决这一问题;#include<stdio.h>
#include<string.h>
#define MAX 100
#define MUX 200
char A[MAX];
char B[MAX];
int reverse(char str[],int len){
char temp;
int i;
for(i=0;i<(len+1)/2;i++){
temp=str[i];
str[i]=str[len-i-1];
str[len-i-1]=temp;
}
return 0;
}
int main(void){
char *ptr;
int increase=0;
ptr=A;
int i=0;
int j=0;
int temp=0;
int add=0;
printf("input the first number:");
scanf("%s",ptr);
ptr=B;
printf("\ninput the second number:");
scanf("%s",ptr);
printf("%s*%s=",A,B);
reverse(A,strlen(A));
reverse(B,strlen(B));
char result[MUX];//array to store the result;
for(i=0;i<MUX-1;i++)
result[i]='0';//initial the array,every bit is 0;
for(i=0;i<strlen(A);i++){
increase=0;
for(j=0;j<strlen(B);j++){
temp=(A[i]-48)*(B[j]-48);
add=(temp+increase+(result[i+j]-48))%10;
increase=(temp+increase+(result[i+j]-48))/10;
result[i+j]=add+48;
if(j==strlen(B)-1&&increase>0)
result[i+j+1]=increase+48;
}//for j

}//for i
int k=0;
char temper;
reverse(result,MUX-1);//attention :MUX-1
int writeflag=0;
printf("\nthe result is:");
for(i=0;i<MUX;i++){
if(result[i]!='0') writeflag=1;
if(writeflag==1)
printf("%c",result[i]);
}
printf("\n");
return 0;
}//return main

阅读全文

与超大乘法算法相关的资料

热点内容
mac压缩解压视频 浏览:904
这就是程序员魅力 浏览:294
京东java算法笔试题 浏览:178
柱子加密箍筋不准有接头 浏览:199
我的世界服务器菜单插件如何使用 浏览:12
刘毅10000词pdf 浏览:890
刚毕业的程序员会什么 浏览:974
单片机控制64路开关量 浏览:982
win10截图编程 浏览:420
怎样把名字变成文件夹 浏览:203
文件怎么搞成文件夹 浏览:730
多线程编程php 浏览:606
安卓机越用越卡有什么办法 浏览:17
高中生解压操场适合做的游戏 浏览:395
程序员java招聘 浏览:462
未来之光手机云服务器 浏览:160
服务器下载资料为什么c盘满了 浏览:265
怎么清除空文件夹 浏览:544
如何查看派派服务器 浏览:804
杀手6解压画面 浏览:671