永发信息网

noip2005普及组复赛circle.pas 麻烦哪位高手写下代码,文件输入输出 谢谢

答案:1  悬赏:30  手机版
解决时间 2021-11-26 15:01
  • 提问者网友:你独家记忆
  • 2021-11-26 10:24
noip2005普及组复赛circle.pas 麻烦哪位高手写下代码,文件输入输出 谢谢
最佳答案
  • 五星知识达人网友:長槍戰八方
  • 2021-11-26 11:57
[转载]
循环

circle.pas

本题主要考察的是对字符串和数的处理,具体分析如下:

【具体分析】

大家都知道要取数的后面的N位就要用数去除以10n。所以题目就容易解决了。首先输入SS为要乘的正整数和要求的位数,因为输入的是一个字符串,所以只有找空格来读入两个数。将要乘的数放入s1中,剩下的length(ss)-I位为要求的位数放入k中。又因为经过实验发现当k超过20时是不存在的,所以当k大于20时可以直接打印-1,但相反如果小于20,首先对输入的 k进行处理,可以算出用于取后k位的L来。然后进行循环用输入的s1乘以s1再取后k位,然后又把新得到的要乘的数乘以s1在取后k位……依次反复,当得到的数的后k位等于s1的后k位时结束,否则依然继续直到循环10000次。

【变量说明】

ss:输入的要乘的数和要求的位数

s1:表示要乘的数

l:用来取最后k位的数

m:循环的次数

【源程序】

program circle;

var s1,s2,ss:string;

b,c,m,n,i,j,l,k,s:longint;

a:longint;

t,p:integer;

begin

assign(input,'circle.in');reset(input);

assign(output,'circle.out');rewrite(output);

readln(ss); {输入要乘的数和要求的位数k}

i:=pos(' ',ss); {找空格的位置分开两个数}

s1:=copy(ss,1,i-1);

val(copy(ss,i+1,length(ss)-i),k,t);

if k<20 then

begin

s2:=copy(s1,length(s1)-k+1,k);

val(s2,n,p);

l:=1;

s:=1;

for a:=1 to k do {求出要L的值}

l:=l*10;

s:=n;

repeat

inc(m);

s:=s*n mod l; {S*N mod L为下个循环的后k位}

until (s=n) or (m=100000);

if m=100000 then writeln(-1) else writeln(m);

end

else writeln(-1); {输出无解}

close(input);

close(output);

end.

顺便推荐一下一个编程交流平台(论坛):
http://www.mydrs.org/dv7/index.asp

还有主页,里面有很多资料:
http://www.mydrs.org

基本上所有搞OI的都知道这个,上面就是里面的一个贴子

还有NOIP的相关网页,几乎有noip的一切:
http://www.noi.cn
(注意:noip是全国联赛)
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯