博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UvaOJ 550 - Multiplying by Rotation
阅读量:6429 次
发布时间:2019-06-23

本文共 1565 字,大约阅读时间需要 5 分钟。

题目

题意略。

分析:这题我把式子各种展开,然后推了一个东西出来,枚举位数,然后求得一个x,若x能表示为当前总位数减一的base下的数,则当前位数为最小。这样写了后TLE了,判断那里可能耗时了。

看了的题解后,发现我考虑复杂了。其实这就是一个base位进制下的多位数乘以一位数的乘法运算。写成竖式如下,

a0a1a2...an-1c

×   f

----------------------

ca0a1a2...an-1

(a0a1a2...an-1c 表示 factor1,f表示factor2,c为需要移动的数字)。

运算过程如,c*f 为最低位运算后的结果 c*f 在base下表示为 c*f/base、(c*f)%base 两位数,其中c*f/base为进位,c*f%base为结果的当前位,由题目条件知,an-1 = c*f%base.

所以我们继续进行an-1*f,直到结果的当前位等于c,且进位为0。可见这就是小学时给的那种竖式留几个空叫你填空的那种题目,只不过由十进制改成了base进制。

代码:

#include 
#include
#include
using namespace std;int main() { int base, n, m; while(cin >> base >> n >> m) { if(m == 1) { cout << 1 << endl; continue; } int carry = 0, cur = n, i = 1; for(; ; i++) { int tmp = cur * m + carry; carry = tmp / base; //满base进一 cur = tmp % base; //当前位 if(carry == 0 && cur == n) { cout << i << endl; break; } } } return 0;}
TLE的代码:

#include
using namespace std;int b, c, f;int is(int x, int n) //x能否表示成b下的n位数{ int cnt=0; for(; x; x/=b, cnt++); if(cnt == n) return 1; else return 0;}int main(){ while(cin>>b>>c>>f) { int i; //first factor的位数 n int b_pow = 1; //b的n-1次 for(i=1; b_pow<=f; i++) b_pow*=b; //①n能不能为1?②<=,x不能为0? for(; ; i++, b_pow*=b) { int t1 = c*(b_pow-f); int t2 = (f*b-1); if(t1%t2 != 0) continue; //x为整数 int x = t1/t2; if(is(x, i-1)) { cout<
<

转载于:https://www.cnblogs.com/tclh123/archive/2012/04/11/2587029.html

你可能感兴趣的文章
Quartz2D
查看>>
jQuery温度计,支持摄氏度华氏度同时展示
查看>>
Cloudstack+Glusterfs+Kvm 集群(笔记)
查看>>
Dubbo与Zookeeper、SpringMVC整合和使用
查看>>
Python中set 和dict 的总结
查看>>
mysql 相关
查看>>
超人学院Hadoop大数据资源分享
查看>>
pip安装更新
查看>>
中国人与欧洲人的想法
查看>>
android客户端Pad客户端开发,屏幕分辨率的不同究竟会怎么影响界面显示效果
查看>>
修复mysql表
查看>>
局域网
查看>>
2014诺贝尔物理学奖:蓝光LED
查看>>
CentOS 下Nginx 配置详解
查看>>
HTTP报文
查看>>
Jenkins系列1--初步了解
查看>>
Bootstrap-select 的地址联动
查看>>
cron任务计划
查看>>
我的友情链接
查看>>
tomcat服务器大数量数据提交Post too large解决办法
查看>>