lenx

时间:2024-11-15 15:17:51编辑:莆田seo君

谁会数据结构超长正整数相加,C语言的?

#define MAXLEN 1024 type struct { int digit[MAXLEN]; //每个int保存8位10进制整数,最大8*MAXLEN个 int length; //实际长度 } longnum; int longadd(longnum a, b, c){ longnum * l, * r; if (a.length digit[i] + r->digit[i]; if (t >= 100000000) { c.digit[i] = t - 100000000; t = 1; } else { c.digit[i] = t; t = 0; } } if (l->length > r->length) for (i = r->length; i length; i ++) { t += l->digit[i]; if (t >= 100000000) { c.digit[i] = t - 100000000; t = 1; } else { c.digit[i] = t; t = 0; } } if (t > 0) c.length = l->length + 1; else c.length = l->length; if (c.length > MAXLEN) { c.length --; return (t); } else return (0);} 如果超过最大整数表示,则返回1,否则返回0


关于c语言超长正整数相加的问题,。求高手指教!!!!!

/*这里是头文件BigInt.h*/
class bigint
{
struct node //节点
{
char n;
node *next;
};
node *head,*end,*temp;//头结点,尾节点,临时节点
void addhead(char n);//增加头结点
void addend(char n);//增加尾节点
public:
bigint();
~bigint();
void getnum();//获取大整数
void dispnum();//显示
void add(const bigint &bignum1,const bigint &bignum2);

void sub(const bigint &bignum1,const bigint &bignum2);

void mul(const bigint &bignum1,const bigint &bignum2);
};



/*主文件BigInt.cpp*/

#include
#include
#include"BigInt.h"
#include

bigint::bigint()
{
head=end=temp=NULL;
}

//析构
bigint::~bigint()
{
node *nextnode;
if (head==NULL)
return;
temp=head;
while (temp) //删除节点
{
nextnode=temp->next;
delete temp;
temp=nextnode;
}
head=end=temp=NULL;
}

void bigint::addhead(char n)//增加头结点
{
temp=new node;
temp->n=n;
temp->next=NULL;
if (!head)
{
head=end=temp;
temp->next=NULL;
}
else
{
temp->next=head;
head=temp;
}
}

void bigint::addend(char n)//增加尾节点
{
temp=new node;
temp->n=n;
temp->next=NULL;
if (!end)
{
head=end=temp;
temp->next=NULL;
}
else//链表非空时,尾节点的指针指向临时节点,然后把临时节点赋给尾节点
{
end->next=temp;
end=temp;
}
}

void bigint::getnum()//获取大整数
{
char key;
while ((key=getchar())!=10)//判断是否是回车
{
addhead(key);
}
}

void bigint::dispnum()//显示大整数
{
if (!head)//空链表时的显示
cout<<"错误!"<<endl;
else
{
node *tempnode;
tempnode=head;
while (tempnode)
{
coutn;
tempnode=tempnode->next;
}
cout<<endl;
}
}

//加法
void bigint::add(const bigint &bignum1,const bigint &bignum2)
{

node *temp1,*temp2;
int rest=0,num=0;
temp1=bignum1.head;//临时节点指针1指向第一个大整数的头结点
temp2=bignum2.head;//临时节点指针2指向第二个大整数的头结点
while (temp1&&temp2)
{
num=(int(temp1->n)-48)+(int(temp2->n)-48)+rest;
if (num>9)
{
num=num-10;
rest=1;
}
else
rest=0;
addhead(num+'0');
temp1=temp1->next;//节点下移
temp2=temp2->next;
}
if (temp2) temp1=temp2;//当一个链表到达尾部时,另一个链表继续循环
while (temp1)
{
num=(int(temp1->n)-48)+rest;
if (num>9)
{
num=num-10;
rest=1;
}
else
rest=0;
addhead(num+'0');
temp1=temp1->next;
}
if (rest)//判断循环结束后是否有进位
addhead(rest+48);
}



void bigint::sub(const bigint &bignum1,const bigint &bignum2) //减法
{
bigint tempa,tempb,tempc;
node *temp1,*temp2,*temp3,*temp4,*temp5;
int num1_len=0,num2_len=0;//统计两个大整数的长度
int num=0,rest=0;
temp1=bignum1.head;
temp2=bignum2.head;
while (temp1)
{num1_len++;temp1=temp1->next;}
while (temp2)
{num2_len++;temp2=temp2->next;}
temp1=bignum1.head;
temp2=bignum2.head;
if (num1_len>num2_len)//当第一个大整数比第二个大整数长时,结果为正数
{
while (temp1&&temp2)
{
num=(int(temp1->n)-48)-(int(temp2->n)-48)+rest;
if (num<0)
{
num=num+10;
rest=-1;
}
else
rest=0;
addhead(num+'0');
temp1=temp1->next;
temp2=temp2->next;
}
while (temp1)
{
num=(int(temp1->n)-48)+rest;
if (num<0)
{
num=num+10;
rest=-1;
}
else
rest=0;
addhead(num+'0');
temp1=temp1->next;
}
}
else if (num1_len<num2_len)//第二个大整数比第一个大整数长,则结果为负数
{
temp3=temp2;
temp2=temp1;
temp1=temp3;
while (temp1&&temp2)
{
num=(int(temp1->n)-48)-(int(temp2->n)-48)+rest;
if (num<0)
{
num=num+10;
rest=-1;
}
else
rest=0;
addhead(num+'0');
temp1=temp1->next;
temp2=temp2->next;
}
while (temp1)
{
num=(int(temp1->n)-48)+rest;
if (num<0)
{
num=num+10;
rest=-1;
}
else
rest=0;
addhead(num+'0');
temp1=temp1->next;
}
addhead('-');
}
else//一样长时,从头位往后依次判断各个对应位数字的大小,以判断结果的正负
{
temp1=bignum1.head;
while (temp1)
{tempa.addhead(temp1->n);temp1=temp1->next;}
temp4=tempa.head;
temp2=bignum2.head;
while (temp2)
{tempb.addhead(temp2->n);temp2=temp2->next;}
temp5=tempb.head;
temp1=bignum1.head;
temp2=bignum2.head;
while (temp4->n==temp5->n)//相同时的情况
{
temp4=temp4->next;
temp5=temp5->next;
if (temp4==NULL) break;
}
if (temp4==NULL)
addend('0');
else if (temp4->n>temp5->n)//结果为正
{
while (temp1)
{
num=(int(temp1->n)-48)-(int(temp2->n)-48)+rest;
if (num<0)
{
num=num+10;
rest=-1;
}
else
rest=0;
addhead(num+'0');
temp1=temp1->next;
temp2=temp2->next;
}
}
else //结果为负
{
temp3=temp1;
temp1=temp2;
temp2=temp3;
while (temp1)
{
num=(int(temp1->n)-48)-(int(temp2->n)-48)+rest;
if (num<0)
{
num=num+10;
rest=-1;
}
else
rest=0;
addhead(num+'0');
temp1=temp1->next;
temp2=temp2->next;
}
addhead('-');//向头结点增加负号
}
}
}



//乘法
void bigint::mul(const bigint &bignum1,const bigint &bignum2)
{
bigint Tempa,Tempb,result;
node *temp,*temp1,*temp2,*tempa,*tempb;
int num=0,num2=0,i=0,k=0,rest,rest2;
temp1=bignum1.head;
temp2=bignum2.head;
while (temp2)
{
rest=0;rest2=0;//归零
if (result.head!=NULL)
{result.head=result.end=NULL;}//清空结果链表
while (temp1!=NULL)//用第二个大整数的一位与第一个大整数的每一位相乘,结果存入临时链表Tempa中
{
num=(int(temp1->n)-48)*(int(temp2->n)-48)+rest;
if (num>9)
{
rest=num/10;
num=num%10;
}
else
rest=0;
Tempa.addend(num+48);
temp1=temp1->next;
}
if (rest!=0) Tempa.addend(rest+48);
for(k=i;k>=1;k--) {Tempa.addhead(0+48);}//每循环依次,临时链表都要在尾部补零,类似于手算乘法
i++;
temp1=bignum1.head;
temp2=temp2->next;
tempa=Tempa.head;
tempb=Tempb.head;
while (tempa!=NULL&&tempb!=NULL)//以下为两大整数的相加运算,与加法算法相同。
{
num2=(int(tempa->n)-48)+(int(tempb->n)-48)+rest2;
if (num2>9)
{
num2=num2-10;
rest2=1;
}
else
rest2=0;
result.addend(num2+48);
tempa=tempa->next;
tempb=tempb->next;
}
if (tempb!=NULL) tempa=tempb;
while (tempa!=NULL)
{
num2=(int(tempa->n)-48)+rest2;
if (num2>9)
{
num2=num2-10;
rest2=1;
}
else
rest2=0;
result.addend(num2+48);
tempa=tempa->next;
}
if (rest2) result.addend(rest2+48);
if (Tempa.head!=NULL) {Tempa.head=Tempa.end=NULL;}//对临时链表a置空
if (Tempb.head!=NULL) {Tempb.head=Tempb.end=NULL;}//对临时链表b置空
if (result.head!=NULL)
{
node *t=result.head;
while (t)
{Tempb.addend(t->n);t=t->next;}//将结果链表复制给临时链表b,用来下一次的相加运算
}
}
if (result.head!=NULL)
{
temp=result.head;
while (temp)
{addhead(temp->n);temp=temp->next;}
}
}







void main() //主函数
{
bigint bignum1,bignum2,bignum3;
char p='1';
while (p)
{
system("cls");
cout<<"大整数基本运算器"<<endl<<endl;;
cout<<"请选择:"<<endl;
cout<<"1.加法"<<endl;
cout<<"2.减法"<<endl;
cout<<"3.乘法"<<endl;
cout<<"按其他键退出!"<<endl<<endl;
cout<<"请输入:"<<endl;
int s;
cin>>s;
switch(s)
{
case 1:
{
cout<<"请输入第一个数字:"<<endl;
bignum1.getnum();
cout<<"请输入第二个数字:"<<endl;
bignum2.getnum();
bignum3.add(bignum1,bignum2);
cout<<"结果是:"<<endl;
bignum3.dispnum();
cout<<"按0退出,其他键继续:";
cin>>p;
p=p-48;
}break;
case 2:
{
cout<<"请输入第一个数字:"<<endl;
bignum1.getnum();
cout<<"请输入第二个数字:"<<endl;
bignum2.getnum();
bignum3.sub(bignum1,bignum2);
cout<<"结果是:"<<endl;
bignum3.dispnum();
cout<<"按0退出,其他键继续:";
cin>>p;
p=p-48;
}break;

case 3:
{
cout<<"请输入第一个数字:"<<endl;
bignum1.getnum();
cout<<"请输入第二个数字:"<<endl;
bignum2.getnum();
bignum3.mul(bignum1,bignum2);
cout<<"结果是:"<<endl;
bignum3.dispnum();
cout<<"按0退出,其他键继续:";
cin>>p;
p=p-48;
}break;
default:
p=0;
}
}
}


镜音连是喜欢初音还是镜音铃

镜音铃和镜音连的制作经费比初音未来高,但作为同一套软件发售,价格却和初音未来差不多(现VOCALOID4 镜音リン・レン V4X バンドル售价2,1600円、税込 )。CN:山火这是因为初音未来引来的热潮令电子音乐制作的初学者在短期内增多,而且15750日元的价格(现英文版本售价最低,体価格:12,000円)对一般人来说较难接受(但在同类软件中,这个价钱还是较低)。所以CRYPTON FUTURE MEDIA决定软件在和初音未来相同的价钱下,为新产品加入更多内容。2007年12月20日左右,镜音铃、连在音乐软件的市场占有率开始急速上升,最高升至62.2%并超过当时第一位的初音未来,在爆发冷静下来后仍然有23.6%,至2008年7月23日共售出约20000套,至2009年10月27日共售出约25000套。而在NICONICO动画上的影片,发售前已有约500段,截至2008年2月6日则超过4000段。另外,虽然创作热潮于初音未来时开始,但亦有不少用户由镜音铃、连时才开始使用,如在NICONICO动画中被称作“シグナルP”的音乐制作者荒井洋明。2008年5月26日,官方网站镜音铃、连的图片开始“剥落”起来,两日后,CRYPTON在第75回音乐资讯科学研究会中发表镜音铃、连的新版本“act2”。于6月12日正式在自己网站发表,新版本会改善音与音之间的顺滑感和减少杂音,7月上旬发售,已购买旧版本的用户则会免费收到更新资料片,预定发布至9月20日。6月18日开始发表试听曲。7月9日发表新图片,在手部的机械处等有细微的改变。于7月11日决定于7月18日发售。

镜音连到底是喜欢初音还是镜音铃?

镜音铃和镜音连的制作经费比初音未来高,但作为同一套软件发售,价格却和初音未来差不多(现VOCALOID4 镜音リン・レン V4X バンドル售价2,1600円、税込 )。CN:山火这是因为初音未来引来的热潮令电子音乐制作的初学者在短期内增多,而且15750日元的价格(现英文版本售价最低,体価格:12,000円)对一般人来说较难接受(但在同类软件中,这个价钱还是较低)。所以CRYPTON FUTURE MEDIA决定软件在和初音未来相同的价钱下,为新产品加入更多内容。2007年12月20日左右,镜音铃、连在音乐软件的市场占有率开始急速上升,最高升至62.2%并超过当时第一位的初音未来,在爆发冷静下来后仍然有23.6%,至2008年7月23日共售出约20000套,至2009年10月27日共售出约25000套。而在NICONICO动画上的影片,发售前已有约500段,截至2008年2月6日则超过4000段。另外,虽然创作热潮于初音未来时开始,但亦有不少用户由镜音铃、连时才开始使用,如在NICONICO动画中被称作“シグナルP”的音乐制作者荒井洋明。2008年5月26日,官方网站镜音铃、连的图片开始“剥落”起来,两日后,CRYPTON在第75回音乐资讯科学研究会中发表镜音铃、连的新版本“act2”。于6月12日正式在自己网站发表,新版本会改善音与音之间的顺滑感和减少杂音,7月上旬发售,已购买旧版本的用户则会免费收到更新资料片,预定发布至9月20日。6月18日开始发表试听曲。7月9日发表新图片,在手部的机械处等有细微的改变。于7月11日决定于7月18日发售。

sketchup中怎样改变组件的大小使它符合需要的尺寸

工具/材料:电脑、草图大师。第一步,打开电脑,打开软件进入。第二步,使用拉伸工具画一个矩形。第三步,画好矩形后,使用鼠标全选矩形。第四步,全选完成矩形之后,鼠标右键点击矩形选择创建组件。第五步,创建组件完成后,鼠标移动到左侧工具栏中的缩放图标点击选用。第六步,点击缩放图标之后,在草图大师右下角输入缩放比例,使用回车键即可缩放组件的大小。

上一篇:七年级体育教学计划

下一篇:没有了