讨论 / no.168,大牛们帮我看看,悬赏6分
x-ray 2010-08-08 23:31:00
点我顶贴 收藏 删除
高精度写的有些恶心,全wa了,

var na,a:array[1..1000]of string;

b,c:array[0..2000]of longint;

n,i,j,maxlen,k:longint;

t:string;

function max1(x,y:ansistring):boolean;

begin

if length(x)>length(y) then exit(true)

else if length(x)<length(y) then exit(false)

else if x>y then exit(true)

else exit(false);

end;

function max2(x,y:ansistring):boolean;

begin

if length(x)>length(y) then exit(false)

else if length(x)<length(y) then exit(true)

else if x<y then exit(true)

else exit(false);

end;

procedure qsort;

procedure sort(l,r:longint);

var i,j:longint;

x:ansistring;

begin

i:=l;

j:=r;

x:=a[(l+r)div 2];

repeat

while max2(a[i],x) do inc(i);

while max1(a[j],x) do dec(j);

if not(i>j)then

begin

t:=a[i];

a[i]:=a[j];

a[j]:=t;

t:=na[i];

na[i]:=na[j];

na[j]:=t;

inc(i);

dec(j);

end;

until i>j;

if l<j then sort(l,j);

if i<r then sort(i,r);

end;

begin

sort(1,n);

end;

function max(x,y:longint):longint;

begin

if x>=y then exit(x) else exit(y);

end;

procedure intoarray1(x:ansistring);

begin

for i:=1 to length(x) do

c[length(x)-i+1]:=ord(x[i])-ord(’0’);

c[0]:=length(x);

end;

procedure plus;

begin

maxlen:=max(b[0],c[0]);

for i:=1 to maxlen do

begin

b[i]:=b[i]+c[i];

b[i+1]:=b[i+1]+b[i] div 10;

b[i]:=b[i] mod 10;

end;

while b[i+1]<>0 do inc(i);

b[0]:=i;

if k<=n-1 then

begin

inc(k);

intoarray1(a[k]);

plus;

end;

end;

procedure intoarray(x:ansistring);

begin

for i:=1 to length(x) do

b[length(x)-i+1]:=ord(x[i])-ord(’0’);

b[0]:=length(x);

intoarray1(a[k+1]);

k:=k+1;

plus;

end;

begin

readln(n);

for i:=1 to n do

begin

readln(na[i]);

readln(a[i]);

end;

qsort;

for i:=1 to n-1 do

if(a[i]=a[i+1])and(na[i]<na[i+1]) then

begin

t:=na[i];

na[i]:=na[j];

na[j]:=t;

end;

for i:=n downto 1 do writeln(na[i]);

k:=1;

intoarray(a[k]);

for i:=490 downto 1 do write(b[i]);

end.

#1 woshiniba@2009-03-26 07:03:00
回复 删除
我的当初也是这样 和别人的框架一模一样 结果也是全Wa,导致这题提交了31次都wa,一气之下用别人的提交了。。。

代码:

program rq168new;

type

muldat= record //高精度结构

len:integer;

w:array[1..2000] of integer;

end;

data= record //一个猪王的信息 姓名 猪肉量

name:string;

score:muldat;

end;

var

a:array[1..10000] of data;

i,n,j,k:longint;

all:muldat;

procedure readin;//读入每个数据

var

i,j,k:integer;

ch:char;

begin

readln(n);

for i:= 1 to n do

with a[i] do

begin

readln(name);

a[i].score.len:=0;

while not eoln do

begin

read(ch);

inc(a[i].score.len);

a[i].score.w[a[i].score.len]:=ord(ch)-ord(’0’);

end;

readln;

for j:=1 to a[i].score.len div 2 do

begin

k:=a[i].score.w[j];

a[i].score.w[j]:=a[i].score.w[a[i].score.len+1-j];

a[i].score.w[a[i].score.len+1-j]:=k;

end;

//if a[i].score.len>490 then a[i].score.len:=490;

end;

end;

function add(a,b:muldat):muldat; //高精度加高精度

var

i,k:integer;

begin

if a.len>b.len then k:=a.len else k:=b.len;

for i:= 1 to k do

begin

a.w[i]:=a.w[i]+b.w[i];

inc(a.w[i+1],a.w[i] div 10);

a.w[i]:=a.w[i] mod 10;

end;

if a.w[a.len+1]<>0 then inc(a.len);

if a.len>490 then a.len:=490;

exit(a);

end;

function cmpname(s1,s2:string):integer;//按字典顺序比较姓名

var

i,k:integer;

begin

if length(s1)<length(s2)

then k:=length(s1)

else k:=length(s2);

for i:= 1 to k do

begin

if s1[i]<s2[i] then exit(1);

if s1[i]>s2[i] then exit(-1);

end;

if length(s1)<length(s2) then exit(1);

if length(s1)>length(s2) then exit(-1);

exit(0);

end;

function cmpscore(s1,s2:muldat):integer;//比较2个高精度数据的大小

var

i:integer;

begin

if s1.len>s2.len then exit(1);

if s1.len<s2.len then exit(-1);

for i:= s1.len downto 1 do

begin

if s1.w[i]>s2.w[i] then exit(1);

if s1.w[i]<s2.w[i] then exit(-1);

end;

exit(0);

end;

function cmp(a,b:data):integer; //比较2个猪王的大小

begin

if cmpscore(a.score,b.score)=1 then exit(1);

if cmpscore(a.score,b.score)=-1 then exit(-1);

if cmpname(upcase(a.name),upcase(b.name))=1 then exit(1);

if cmpname(upcase(a.name),upcase(b.name))=-1 then exit(-1);

exit(0);

end;

procedure qsort(m,n:longint);//按猪王排序

var

i,j:longint;

k,t:data;

begin

i:=m; j:=n;

k:=a[(i+j) div 2] ;

repeat

while cmp(a[i],k)=1 do inc(i);

while cmp(a[j],k)=-1 do dec(j);

if i<=j

then begin

t:=a[i]; a[i]:=a[j]; a[j]:=t;

inc(i); dec(j);

end;

until i>j;

if m<j then qsort(m,j);

if i<n then qsort(i,n);

end;

begin

readin;

all.len:=1; all.w[1]:=0;

for i:= 1 to n do

all:=add(all,a[i].score);

qsort(1,n);

for i:= 1 to n do

writeln(a[i].name);

for i:=490 downto 1 do

write(all.w[i]);

readln;

end.

#2 x-ray@2009-03-26 08:27:00
回复 删除
我想知道哪里错了,那位大牛知道啊??????
#3 x-ray@2009-03-26 21:26:00
回复 删除

#4 小小小学生@2009-03-26 21:35:00
回复 删除
代码那么长。。。。。。。。。。。。。。。。

怕怕。

#5 x-ray@2009-03-27 04:36:00
回复 删除
没事,有哪位想要那6分就看一下
#6 x-ray@2009-03-27 04:41:00
回复 删除
说实话,如果你看到我一个同学的200行的5位排序,你会吓死的
#7 tld@2009-03-27 07:12:00
回复 删除
两个比较函数好象不对

你看看我的程序

#include<iostream>

#include<string.h>

using namespace std;

int n;

string name[5001];

string a[5001];

int num[5001],tot;

void type()

{

int i;

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

cout<<name[i]<<endl;

for (i=490;i>=1;i--)

cout<<num[i];

}

void jia( string x)

{

int i,j=1;

if ( tot< x.size() )

tot=x.size();

for ( i=x.size()-1 ;i>=0 ;i-- )

{

num[j]=num[j]+x[i]-’0’;

j++;

}

for ( i=1;i<=tot;i++ )

if ( num[i]>9 )

{

num[i+1]=num[i+1]+num[i]/10;

num[i]=num[i]%10;

}

while ( num[tot]>9 && tot<=490 )

{

num[tot+1]=num[tot+1]+num[tot]/10;

num[tot]=num[tot]%10;

tot++;

}

tot=500;

}

void init()

{

int i,max=0;

cin>>n;

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

{

cin>>name[i]>>a[i];

jia( a[i] );

if (max<a[i].size())

max=a[i].size();

}

}

void sort(int x,int y)

{

int i,j;

string temp;

if ( x<y )

{

i=x-1;

for (j=x;j<=y;j++)

{

if ( ( a[j].size()==a[y].size() && a[j]>a[y] )|| a[j].size()>a[y].size() )

{

i++;

temp=a[i];a[i]=a[j];a[j]=temp;

temp=name[i];name[i]=name[j];name[j]=temp;

}

else

{

if ( a[j]==a[y] )

{

if ( name[j]<name[y] )

{

i++;

temp=a[i];a[i]=a[j];a[j]=temp;

temp=name[i];name[i]=name[j];name[j]=temp;

}

}

}

}

temp=a[i+1];a[i+1]=a[y];a[y]=temp;

temp=name[i+1];name[i+1]=name[y];name[y]=temp;

sort(x,i);

sort(i+2,y);

}

}

main()

{

init();

sort(1,n);

type();

}

#8 x-ray@2009-03-27 07:34:00
回复 删除
相当抱歉,我不会C/C++
#9 x-ray@2009-03-28 06:08:00
回复 删除
#10 x-ray@2009-04-03 04:48:00
回复 删除
查看更多回复
提交回复