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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于c语言超长正整数相加的问题,。求高手指教!!!!!相关的知识,希望对你有一定的参考价值。

设某机器表示的正整数不超过5位十进制数字。试采用顺序表表示任意长的正整数,并设计计算两个正整数之和的程序。
要求:
1、存储结构采用顺序结构。
2、要求程序由以下函数组成:建立顺序表函数、输出顺序表函数、相加函数和main()函数。
3、设计几组测试数据。
4、程序能正常运行,输出正确结果。

请会以上题目的高手帮帮忙。。 将代码给我。。 不胜感激!!!

参考技术A /*这里是头文件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<iostream.h>
#include<stdio.h>
#include"BigInt.h"
#include <windows.h>

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)

cout<<tempnode->n;
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;


本回答被提问者采纳
参考技术B 本想敲代码,忽然楼上已经回答,代码完整,非常专业! 参考技术C #include <stdio.h>
#include <conio.h>
#include <string.h>
void add(char a[],char b[],char back[])
int i,j,k,up,x,y,z,l;
char *c;
if (strlen(a)>strlen(b))
l=strlen(a)+2;
else
l=strlen(b)+2;
c=(char *)malloc(l*sizeof(char));
i=strlen(a)-1,j=strlen(b)-1;
k=0,up=0;
while(i>=0||j>=0)
if(i<0) x='0'; else x=a[i];
if(j<0) y='0'; else y=b[j];
z=x-'0'+y-'0';
if(up) z+=1;
if(z>9) else up=0;
c[k++]=z+'0';
i--,j--;

if(up) c[k++]='1';
c[k]=i=0;
for(k-=1;k>=0;k--)back[i++]=c[k];
back[i]='\0';


void main()
#define MAX 5000
char a[MAX],b[MAX],c[MAX+1];
for(;;)

printf("★★★★(to Exit,Enter 'e' or 'E')★★★★★");
printf("\n★★Enter two numbers with [enter]-key:★★\n>>");
scanf("%s",&a);
if(a[0]=='e'||a[0]=='E')return;
printf(">>");
scanf("%s",&b);
add(a,b,c),printf("%s\n",c);


C语言分解质因数

根据数论的知识可知,任何一个合数都可以写成几个质数相乘的形式,这几个质数都叫做这个合数的质因数。例如:24=2×2×2×3。现在从键盘输入一个正整数,请编程输出它的所有质因数。
Sample Input
180

Sample Output
2 2 3 3 5

下面这个程序不知道哪里出了问题,oj里显示是Wrong Answer,应该是没有通过全部测试数据引起的,该如何改进,求大神指教!
#include “stdio.h”
#include"math.h"
int f(int x)

int F=1,i,j;
for(i=2;i<=sqrt(x);i++)
if(x%i==0)
F=0;
if(F)
j=1;
else
j=0;
return j;

void main()

int data, dataBuf,x=0;
int s = 1;
int i = 2;
scanf("%d", &data);
x=f(data);
if(x==0)
dataBuf = data;
while (s < dataBuf)

if ((data % i) == 0)

data /= i;
s *= i;

printf("%d ", i);


else

i++;


printf("\n");

#include <stdio.h>

int main()

int n;  // 用户输入的整数

int i;  // 循环标志

printf("输入一个整数:");

scanf("%d",&n);

printf("%d=",n);

// n>=2才执行下面的循环

for(i=2; i<=n; i++)

while(n!=i)

if(n%i==0)

printf("%d*",i);

n=n/i;

else

break;

printf("%d\\n",n);

return 0;

将一个正整数分解质因数。

程序分析:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:

1、如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。

2、如果n>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n,重复执行第一步。

3、如果n不能被k整除,则用k+1作为k的值,重复执行第一步。

C语言,是一种通用的、过程式的编程语言,广泛用于系统与应用软件的开发。具有高效、灵活、功能丰富、表达力强和较高的移植性等特点,在程序员中备受青睐。最近25年是使用最为广泛的编程语言。

C语言

C语言是由UNIX的研制者丹尼斯·里奇(Dennis Ritchie)于1970年 由 肯·汤普逊(Ken Thompson)所研制出的B语言的基础上发展和完善起来的。目前,C语言编译器普遍存在于各种不同的操作系统中,例如UNIX、MS-DOS、Microsoft Windows及Linux等。C语言的设计影响了许多后来的编程语言,例如C++、Objective-C、Java、C#等。

参考技术A 这样注释的已经很好了啊
if(m%k!=0),说明还没找到因数,每次都是从2开始,逐渐递增,来找因数的
else,else部分,说明已经找到了因数,找到因数以后,先把因数打印出来,然后让m等于被除后的数,让k=2,也就是从2开始,继续递增找其他的因数啊

举个例子,你就明白了,比如15,你要对它进行分解质因数,该怎么做呢
先让k=2,发现15%2!=0了,说明2不是它的因数,让k++
k=3的时候,发现15%3==0了,说明3是它的一个因数,打印出3,让m=15/3=5,让k=2
5%2!=0,5%3!=0,5%4!=0,说明2,3,4,都不是5的因数,k继续自加
k=5,5%5==0了,说明5是5的因数,所以,打印5,m=5/5=1,k=2,这时,就会退出for循环了

逐行分析,见下面:
if(m%k!=0) //m不能被k整除,说明k不是m的因数

k++; //就让k自加1,判断下一个数是不是m的因数

else //m不能被k整除,说明k是m的一个因数

printf("%d*",k); //把这个因数k,打印出去
m=m/k; //从m中把因数k去掉,如果不去掉,下一个又会找到因数k的,那样就不对了
k=2;//让k重新等于2,也就是重新从2开始找m的因数
参考技术B #include <stdio.h>
void main()

int i=2,n,k;
printf("输入不小于2的自然数: ");
scanf("%d",&n);
k=n;
printf("%d=",n);
while(k>1)

if(k%i==0) printf("%d*",i);k/=i;
else i++;

printf("\\b \\b");


参考技术C 你写的太复杂了
#include <stdio.h>
void main( )

int data, i = 2;
scanf("%d", &data);
while(data > 1)

if(data % i == 0)

printf("%d ", i);
data /= i;

else i++;

本回答被提问者和网友采纳
参考技术D #include "stdio.h"

int main()

int n;
int i,j,a;
a=0;
do

scanf("%d",&n);
a+=1;
if(n>0)
printf("Case %d:\\n",a);
i=2;
while(n>=i)


if(n%i==0)

j=0;
printf("%d ",i);
while(n%i==0)

n=n/i;
j+=1;

printf("%d\\n\\n",j);


i+=1;

while(n>0);

 

以上是关于关于c语言超长正整数相加的问题,。求高手指教!!!!!的主要内容,如果未能解决你的问题,请参考以下文章

超长正整数相加, BigInteger, 华为

(求算法高手!)将一个正整数表示为N个不同的正整数之和。

大神求解,C语言问题

每日一题 | day17(杨辉三角的变形 |超长正整数相加)

求高手指教c语言函数怎么返回结构体

c语言将一个正整数分解质因数,望高手帮我详细解释一下程序?