讨论 / 为什么一点错了?
zhqc 2008-10-25 00:43:00
点我顶贴 收藏 删除
var

a,b:array[0..100000] of longint;

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

m:string;

function pan:boolean;

var i,j,m:longint;

f:boolean;

begin

f:=true;

m:=k div 2;

for i:=1 to m do

if a[i]<>a[k-i+1] then f:=false;

if f then pan:=true else pan:=false;

end;

begin

readln(n);

readln(m);

if n<>16 then begin

for i:=1 to length(m) do

begin

a[length(m)-i+1]:=ord(m[i])-ord(’0’);

b[i]:=ord(m[i])-ord(’0’);

end;

end

else

begin

for i:=1 to length(m) do

begin

case m[i] of

’a’,’b’,’c’,’d’,’e’,’f’: a[length(m)-i+1]:=ord(m[i])+10-ord(’a’);

’0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’: a[length(m)-i+1]:=ord(m[i])-48;

end;

case m[i] of

’a’,’b’,’c’,’d’,’e’,’f’: b[i]:=ord(m[i])+10-ord(’a’);

’0’,’1’,’2’,’3’,’4’,’5’,’6’,’7’,’8’,’9’: b[i]:=ord(m[i])-ord(’0’);

end;

end;

end;

k:=length(m);

for p:=1 to 30 do

begin

a[1]:=a[1]+b[1];

for i:=2 to k do

begin

a[i]:=a[i]+b[i]+a[i-1] div n;

a[i-1]:=a[i-1] mod n;

end;

if a[k]>=n then

begin

inc(k);

a[k]:=a[k-1] div n;

a[k-1]:=a[k-1] mod n;

end;

if pan then begin writeln(p);exit; end;

for j:=1 to k do

begin

b[k-j+1]:=a[j];

end;

end;

writeln(’Impossible’);

end.

如题~希望牛们给一个答案~谢谢大家了!

#1 圣彼得@2008-10-04 19:56:00
回复 删除
16进制:

’A’..’F’ instead ’a’..’f’(区分大小写);

#2 飞雪天涯@2008-10-24 08:48:00
回复 删除
不知道你看得懂C++么?

code:

//Simulation

#include<fstream>

#include<iostream>

#include<string>

#define ok true

#define no false

//#define debug

using namespace std;

#define fin cin

#define fout cout

//ifstream fin ("huiwen.in");

//ofstream fout ("huiwen.out");

#ifdef debug

ofstream deb ("huiwen_debug.out");

#endif

long long n;

string m;

long long count_ALU=0;

void input(){

fin>>n>>m;

}

long long ordinate1(char c){

if (c>=’0’&&c<=’9’)

return (int)(c-’0’);

if (c>=’a’&&c<=’z’)

return (int)((c-’a’)+10);

if (c>=’A’&&c<=’Z’)

return (int)((c-’A’)+10);

}

char ordinate2(long long k){

if (k<10)

return (char)(k+’0’);

if (k>=10)

return (char)(k+’a’-10);

}

long long change1(string s){

long long base=1,decbase=0;

for (int i=s.size()-1;i>=0;i--){

decbase+=base*ordinate1(s.at(i));

base*=n;

}

return decbase;

}

string change2(long long k){

string nbase="";

long long f=k;

while (f){

nbase.insert(0,1,ordinate2(f%n));

f/=n;

}

return nbase;

}

/*

long long change3(long long k){

int set[256],index=0;

long long f=k,result=0;

while (f){

set[index++]=f%10;

f/=10;

}

// for (int i=0,j=index-1;i<j;i++,j--){

// int temp;

// temp=set[i];

// set[i]=set[j];

// set[j]=temp;

// }

for (int i=0;i<index;i++)

result=result*10+set[i];

return result;

}

*/

string change4(string s){

string rotated=s;

for (int i=0,j=rotated.size()-1;i<j;i++,j--){

char temp;

temp=rotated[i];

rotated[i]=rotated[j];

rotated[j]=temp;

}

#ifdef debug

deb<<"c4 rotated: "<<rotated<<endl;

#endif

return rotated;

}

void huiwens(){

while (count_ALU<30){

long long value1,value2;

bool isok=ok;

string m2;

#ifdef debug

deb<<" m: "<<m<<endl;

#endif

value1=change1(m);

#ifdef debug

deb<<"value1: "<<value1<<endl;

#endif

m2=change4(m);

#ifdef debug

deb<<" m2: "<<m2<<endl;

#endif

value2=change1(m2);

#ifdef debug

deb<<"value2: "<<value2<<endl;

#endif

m=change2(value1+value2);

#ifdef debug

deb<<" m: "<<m<<endl;

#endif

for (int i=0,j=m.size()-1;i<j;i++,j--)

if (m[i]!=m[j]){

isok=no;

break;

}

count_ALU++;

if (isok) break;

}

}

void output(){

if (count_ALU==30)

fout<<"Impossible";

else fout<<count_ALU;

}

int main (void){

input();

huiwens();

output();

return 0;

}

#3 atttx123@2008-10-25 00:42:00
回复 删除
Program dualpal;

Var

a, b : array [0..10000] of integer;

t : string;

n, m, i : integer;

f : boolean;

step, l : longint;

//===================main========================

Begin

readln(n);

readln(t);

step := 0;

l := length(t);

If ( n <> 16) then For i := l downto 1 do a[i] := ord(t[l+1-i]) - 48

else Begin

For i := l downto 1 do

If (t[l+1-i] >= ’0’) and (t[l+1-i] <= ’9’) then a[i] := ord(t[l+1-i]) - 48

else a[i] := ord(t[l+1-i]) - 55;

End;

While (step <= 30) do

Begin

f := true;

For i := 1 to ((l+1) div 2) do

If (a[i] <> a[l+1-i]) then Begin

f := false;

break;

End;

If f then Begin

writeln(step);

close(Input);

close(Output);

exit;

End

else Begin

For i := 1 to l do b[i] := a[i];

For i := 1 to l do

Begin

b[i] := b[i] + a[l+1-i];

b[i+1] := b[i+1] + (b[i] div n);

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

End;

If (b[l+1] <> 0) then inc(l);

For i := 1 to l do a[i] := b[i];

inc(step);

End;

End;

If (step > 30) then writeln(’Impossible’);

End.

#4 atttx123@2008-10-25 00:43:00
回复 删除
用高精度的思想解决
查看更多回复
提交回复