请会C++和JAVA的朋友进来,分别有个C++和一个JAVA程序来比试谁的更快,要给出充足的理由,分不是问题

avalonBBS 2004-11-22 06:01:11
花了半天的时间写了一个C++程序(200多行),其功能是求两个数相乘的程序(这两个数非常大)
几百位或者几千位。
程序写好后,我发到一个论坛里面,不想那的一个人写了个JAVA程序(20多行)也实现了我的程序的功能。
我感觉到很郁闷,我可是写了200多行才写出来的丫,如果真这样,那我也转行学JAVA算了

=======================
所以小生在这请向各位帮个忙,帮我评测一下这两个程序,看看谁的程序更快,(如果能找到BUG那就最好啦),最好要说明理由,谢谢大家啦。 ^-^
我的程序如下:
输入时:9238479123874987123947921379407812390587902138794791237849回车
19234879182374971239874971239479127349712394回车
就行了
----------------------------
#include <iostream>
#include <cstring>
#include <string>
#include <cassert>
#include <cstdlib>
typedef int ET;
typedef struct NODE{
ET data;
struct NODE * p;
struct NODE * n;
}NODE,*NODEH;
typedef struct LIST{
NODEH head;
NODEH end;
int length;
}LIST,*LISTH;
////////////////////////
////////////////////////
inline bool InitList(LISTH& L)
{
//将头结点L处理一下
L=(LISTH)malloc(sizeof(LIST));
assert(L);
L->head = L->end = NULL;
L->length=0;
return true;
}
inline NODEH NMalloc(const ET& elem)
{
//返回一个新结点,其数据为elem
NODEH temp=(NODEH)malloc(sizeof(NODE));
assert(temp);
temp->data=elem;
return temp;
}
inline bool PreAdd(LISTH& L,const ET& elem)
{
//在头部加入新结点elem
NODEH temp=NMalloc(elem);
++(L->length);
if(NULL==L->head&&NULL==L->end){
temp->n=temp->p=NULL;
L->head=L->end=temp;
return true;
}
temp->p= NULL;
temp->n= L->head;
L->head->p=temp;
L->head= temp;
return true;
}
inline bool EndAdd(LISTH& L,const ET& elem)
{
//在尾部加入新结点elem
NODEH temp=NMalloc(elem);
++(L->length);
if(NULL==L->head&&NULL==L->end){
temp->n=temp->p=NULL;
L->head=L->end=temp;
return true;
}
temp->n=NULL;
temp->p=L->end;
L->end->n=temp;
L->end=temp;
return true;
}
inline bool DestoryList(LISTH& L)
{
//将表L 释放
NODEH temp=L->head,it;
if(temp==NULL){
free(L);
return true;
}
while(temp!=L->end){
it=temp;
temp=temp->n;
free(it);
}
free(temp);
free(L);
return true;
}
inline void PrintList(LISTH& L)
{
//print
NODEH it=L->head,end=L->end;
if(it==NULL)return;
for(;it!=end;it=it->n)
putchar(it->data+'0');
putchar(it->data+'0');
}
inline bool AddZero(LISTH& L,int count)
{
//在L的尾部加上count个0
while(count--)EndAdd(L,0);
return true;
}
inline bool BitMul(LISTH& L,const int number,LISTH& NUM)
{
//将L与数number相乘 后的结果存入NUM中去
//NUM应当为空表结构!!!!!!!!!
NODEH L_end=L->end;
int status=0,temp;
for(; L_end!=L->head ;L_end=L_end->p){
temp= L_end->data * number + status;
PreAdd(NUM, temp%10 );
status= temp/10;
}
temp= L->head->data * number + status;
if(temp>10){
PreAdd(NUM,temp%10 );
PreAdd(NUM,temp/10);
}
else PreAdd(NUM,temp);
//少一次哦:)
return true;
}
inline bool ADD(const LISTH& La,LISTH& Lb)
{
// Lb= La+Lb
NODEH pa=La->end,pb=Lb->end;
int status=0;
for(;pa!= La->head;pa=pa->p,pb=pb->p){
if(pb==NULL){
PreAdd(Lb,0);
pb=Lb->head;
}
int sum=pa->data+pb->data+status;
if(sum>=10){
pb->data=sum%10;
status=1;
}
else{
pb->data=sum;
status=0;
}
}
if(pb==NULL){
PreAdd(Lb,0);
pb=Lb->head;
}
int sum= pa->data + pb->data +status;
if( sum>=10){
pb->data=sum%10;
if(pb->p ==NULL){
PreAdd(Lb,0);
pb=Lb->head;
pb->data=sum/10;
return true;
}
pb=pb->p;
if(pb==NULL){
PreAdd(Lb,0);
pb=Lb->head;
}
pb->data=sum/10;
return true;
}
else //sum<10
pb->data=sum;
return true;
}
///////////////////////////////////////////////////////////////////////////////
inline void MUL(const char * a,const char *b)
{
//init
LISTH CS=NULL; //乘数
LISTH BCS=NULL; //被乘数
LISTH NUM=NULL; //结果
assert(a&&b);
assert(InitList(NUM));
assert(InitList(CS)&&InitList(BCS));
{
//符号处理
int sig=1;
if('-'==*a){
++a;
sig*=-1;
}
else if('+'==*a) ++a;
if('-'==*b){
++b;
sig*=-1;
}
else if('+'==*b)
++b;
if(sig<0)
putchar('-');
}
if(strcmp(a,b)>0){
const char *pa= a,*pb=b;
for(;'\0'!=*pa;++pa){
int temp= *pa-'0';
assert(EndAdd(BCS,temp) );
}
for(;'\0'!=*pb;++pb){
int temp= *pb-'0';
assert(EndAdd(CS,temp) );
}
}
else {
const char *pa= a,*pb=b;
for(;'\0'!=*pa;++pa){
int temp= *pa-'0';
assert(EndAdd(CS,temp) );
}
for(;'\0'!=*pb;++pb){
int temp= *pb-'0';
assert(EndAdd(BCS,temp) );
}
}
// init end!!!!
NODEH cs_p= CS->end;
int bit = 0;//位数
for(; cs_p !=CS->head ; cs_p=cs_p->p){
LISTH TEMP;
InitList(TEMP);
BitMul(BCS,cs_p->data,TEMP);
AddZero(TEMP,bit);
ADD(TEMP,NUM);
++bit;
DestoryList(TEMP);
}
LISTH TEMP;
InitList(TEMP);
BitMul(BCS,cs_p->data,TEMP);
AddZero(TEMP,bit);
ADD(TEMP,NUM);
PrintList(NUM);
putchar('\n');
///////////清理工作
DestoryList(TEMP);
DestoryList(BCS);
DestoryList(CS);
DestoryList(NUM);
}
int main(void)
{
std::string a,b;
std::cin>>a;
std::cin>>b;
MUL(a.c_str(),b.c_str());

system("pause");
return 0;
}

==============================================================================
那个人写的JAVA程序源码如下:
import java.math.BigInteger;


class Time{
public static void main(String[] args){
In in=new In();
System.out.println("第1个数");
String num1=in.getString();
BigInteger n1=new BigInteger(num1);

System.out.println("第2个数");
String num2=in.getString();
BigInteger n2=new BigInteger(num2);


BigInteger re=n1.multiply(n2);
System.out.print("结果是:");
System.out.println(re);
}
}
...全文
279 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
yjh1982 2004-11-23
  • 打赏
  • 举报
回复
网上不是有些C++数学库么.如果用了就不会慢了
avalonBBS 2004-11-23
  • 打赏
  • 举报
回复
我的心理平衡一点了,就算程序比他慢,也只是说明写那个BigInteger的人厉害(这我可以欣然接受的,毕竟人家是行家嘛~ ^-^) ,,,终于找个台阶给自己下了,,嘿嘿嘿
nKannan 2004-11-23
  • 打赏
  • 举报
回复
Java最下层应该也是用C实现的,算法一样的情况下不可能比C快的。Java本身支持了一大堆面向对象的特性,自然更慢。
Java的优势在于开发效率相对比C要高.而且Java有非常广泛的类库,很多功能已经集成了。就像你说的,Java一点点程序实现了你一大段程序的功能。一般来说同样的功能,Java的实现代码量要比C少30%-50%。(当然是平均来说)
另外Java对于面向对象的管理,自动垃圾收集,异常处理等等,大大减轻了开发人员的负担和出错的可能。
用Java和C比性能,本身就不是Java的长处。

你这个特例有可能是因为Java内部实现的长整数的处理算法比你的先进,所以性能上有优势。我们对于长整数一般的处理就是直接相乘,数学上可能有更好的算法。你可以去看看Java的BigInteger的源代码,看看里面是怎么实现的。算法一样的话,C不大可能比Java慢。
Squall1009 2004-11-23
  • 打赏
  • 举报
回复
可以这么说吧,
他import之后,java虚拟机会把他import的类的代码和他写的代码一起装载,然后运行
avalonBBS 2004-11-22
  • 打赏
  • 举报
回复
我比的对象又不是那个人,那个不过是利用了别人做好的东西(这个东西是否相当于C里面的库函数?)
blas 2004-11-22
  • 打赏
  • 举报
回复
没什么可比性!好的算法和挫的算法可能会差十几倍,而且优秀的编译器和一般的编译器也会相差很多!要比速度,那就得和fortran比!
zez 2004-11-22
  • 打赏
  • 举报
回复
没意义...
java优势不是速度...比的过又怎样? 比不过你岂不更没面子
avalonBBS 2004-11-22
  • 打赏
  • 举报
回复
大家误会了我的意思了,我是想比速度的:)
d_selenite 2004-11-22
  • 打赏
  • 举报
回复
你不要和他比代码长短了,他用的是现成的类,当然比你短

BigInteger里边不知道用了什么算法,假设你用的算法是相同的算法,那C++的要比JAVA快

声明:我以前用C++,现在用JAVA

avalonBBS 2004-11-22
  • 打赏
  • 举报
回复
是这个,JAVA我一点不懂的
import java.math.BigInteger;


class Time{
public static void main(String[] args){
In in=new In();
System.out.println("第1个数");
String num1=in.getString();
BigInteger n1=new BigInteger(num1);

System.out.println("第2个数");
String num2=in.getString();
BigInteger n2=new BigInteger(num2);


BigInteger re=n1.multiply(n2);
System.out.print("结果是:");
System.out.println(re);
}
}
beepbug 2004-11-22
  • 打赏
  • 举报
回复
你与哪个Java比?是Java伪码,还是Java机器码?
sharkhuang 2004-11-22
  • 打赏
  • 举报
回复
java肯定慢!
  • 打赏
  • 举报
回复
Java提供了Bignum 当然不用写了,你下个C/C++加密库来用哪还照样不用写了,至于速度就不要比了,Java的大数类本来就是用C/C++实现的,当然速度都差不多.
CoolFlyTow 2004-11-22
  • 打赏
  • 举报
回复
精确的时间确实可以算出来啊!你让他重复运行300次大约也要4分钟吧!!然后再比较不久出来了!
avalonBBS 2004-11-22
  • 打赏
  • 举报
回复
可是从他提供的数据集用在JAVA上,感觉也并不慢,
一个数的长度为1760位,另一个数的长度为 1837位,
听他说在他的程序里也仅1秒左右就能得出结果:(
Squall1009 2004-11-22
  • 打赏
  • 举报
回复
java中有个类就是专门实现大数的乘法的,所以他写的明显可以比你少.
Squall1009 2004-11-22
  • 打赏
  • 举报
回复
有必要比吗?
java首先基本的对象全存放在堆中.慢
java运行需要先jvm.慢
java一般你不声明的函数都是C++所谓的虚拟函数.慢
avalonBBS 2004-11-22
  • 打赏
  • 举报
回复
大家尽管用超长来测试
我希望的是在同样的数据集上我的C++程序能比JAVA程序快上个30秒就满足了:))))

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧