ft,又是个通不过的题目(zju)

dawnhorizon 2003-07-16 06:43:46
还是zju在线测试上的:
http://acm.zju.edu.cn/show_problem.php?pid=1537

大意是:
给你一个数n,要求给出最小的只有一个数字组成的n的倍数m.
比如,n=37,37*3=111,则要求输出:"1 3",第一个输出数字是组成m
的数字,第二个是m的位数.

如果有多个答案,先保证数字最小,再保证位数最小.
我自己的几个测试数据都过了,但是提交总是错,兄弟们给看看?

#include <iostream.h>

int main()
{
int k;
while (cin>>k)
{
if (k==0)
{
cout<<0<<" "<<0<<endl;
continue;
}
int mm=0,i,sum=0,j=0;
for (i=1;i<10;i++)
{
mm=mm*10+i;
j=j+1;
while ((mm%k!=0)&&(j<9))
{
mm=mm*10+i;
j=j+1;
}
if (mm%k==0)
break;
else
{
mm=0;
j=0;
}
}
if ((i==10)&&(j==0))
cout<<-1<<endl;
else
cout<<i<<" "<<j<<endl;
}
return 0;
}
...全文
52 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
dawnhorizon 2003-07-17
  • 打赏
  • 举报
回复
在这个题目里面怎么用?
mmmcd 2003-07-16
  • 打赏
  • 举报
回复
当n与a互素时,n 整除于 a^(n-1) - 1

当n与10互素时,n 整除于 999...9 (n-1个9)


dawnhorizon 2003-07-16
  • 打赏
  • 举报
回复
我是说,哪位兄弟把费马定理好好说说,我没有看出在这里有什么用哦,这个题目我也AC了
dawnhorizon 2003-07-16
  • 打赏
  • 举报
回复
楼上的兄弟,能再详细说一下吗?
LeeMaRS 2003-07-16
  • 打赏
  • 举报
回复
ZJU 1537 - Playing with a Calculator - 00:00.00 308K
http://acm.zju.edu.cn/show_problem.php?pid=1537
AC 2次
这道题其实是爆简单,也是应用竖式除法的方法,数字从1试到9,每次添一位,然后求余数,遇到重复余数的就表示出现循环,尝试下一个数字,当余数为0就表示找到一个倍数,输出答案即可。

补充:事实上连余数都不用记录。由于一个数除以k只有k个余数0..k-1,如果我们在k步之内,仍没有找到一个倍数,那么我们就可以下结论找不到,枚举下一个数字。当然,这么做的效率不如记录余数的高。
Wugifer 2003-07-16
  • 打赏
  • 举报
回复
给个提示,费马定理曰:

当n与a互素时,n 整除于 a^(n-1) - 1

令a=10则本题的答案就很清晰了。
Riemann 2003-07-16
  • 打赏
  • 举报
回复
同意 Wugifer()的观点,例如27,输出应该是1 27,而不是3 9。其实用到大数运算到未必,你可以利用如下关系:
a*b(mod n)=(a(mod n)*b(mod n))(mod n)及
a+b(mod n)=(a(mod n)+b(mod n))(mod n)
这样就可以解决mm由于反复乘10而越界的问题。
dawnhorizon 2003-07-16
  • 打赏
  • 举报
回复
难道如你所说,还要用到大数运算?
Wugifer 2003-07-16
  • 打赏
  • 举报
回复
"Consider the capacity of the calculator to be unlimited."

没理由如你程序中限制为9位数吧

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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