第二次mock。
出的题是,假设有一个地区不能使用7,都用之后的数字代替,比如8代表7,18代表16(中间有7和17).那么给出一个这个地区的数X,求普通地区的数Y。
首先是找规律,发现其实就是找给出的数X之前带有7的个数diff,然后输出就是X-diff。
之后就是怎么找带有7的数字的个数。
想的过程中,隐隐约约觉得,比如求一个数1394,那么应该要用到10以内或100以内的带7的数字的个数,于是就想把它们存起来。
F[1]表示1~10之间的带7的数字,是1,然后F[2]表示1~100之间的,是19。
然后推出了递推公式,F[i+1]=F[i]*9 - 10 ^(i+2)
然后拿个数字做试验,结果一开始拿了个错误的数,678,还自以为有大于等于7和小于7的,但其实这个地区的数字不能有7。
那么就拿58举例子,算出来之后觉得有点小,然后意识到这只是diff。
接着写程序。中间犯过的小错误不断。一是x = x / 10之后,把x改掉了,但最后仍然ans = x - diff,就错了。二是写了10 ^ i当做求幂值,其实要用pow。三是循环里没有i++。然后是很多边界的i+1之类的。
但整体这次感觉反应还行。
代码:

int convert(int x)
{
int F[50];
F[0] = 0;
for (int i = 1; i <= 50; i++)
{
F[i] = F[i - 1] * 9 + pow(10, i - 1); // F[2] = F[1] * 9 + 10 ^ 1; F[1] = F[0] * 9 + pow(10, 1-1) = 1;
} int original = x;
// calc how many num with 7 < x
int diff = 0;
int i = 0;
while (x != 0)
{
int k = x % 10;
x = x / 10;
if (k < 7)
{
diff += F[i] * k;
}
else // k > 7
{
diff += F[i] * (k - 1) + pow(10, i); // k == 8
}
i++;
}
int ans = original - diff;
return ans;
}

  

最新文章

  1. 关于sqlmap的使用
  2. DevExtreme 学习应用[1]
  3. 基于 Annotation 拦截的 Spring AOP 权限验证方法
  4. codeforces 336 Div.2 B. Hamming Distance Sum
  5. 10秒钟安装 Vim编辑器,5分钟浏览常用命令 2015.10.25
  6. 【转载】应广大群众的要求,今天开始连载《超容易的Linux系统管理入门书》一书
  7. WPF换肤之一:创建圆角窗体
  8. HDU3790
  9. sqlhelper类,C#事务入库
  10. Android 7.0 fiddler代理抓不到https请求的解决办法
  11. 冒泡排序 最好O(n)平均O(n^2) 选择排序O(n2) 插入排序O(n2)
  12. Centos7上实现不同网段的服务器文件共享
  13. 使用 Sublime Text 将含下划线的字符串批量替换为驼峰命名法格式的字符串
  14. mysql 案例~ mysql故障恢复
  15. InstallShield:卸载时文字叠加,文字乱码
  16. 一个简单有效的kubernetes部署案例
  17. shell模拟“多线程”
  18. 搜集C++实现的线程池
  19. SSH框架中NoSuchMethodError: antlr.collections.AST.getLine()的解决方案
  20. TeamView

热门文章

  1. Objective-c中的设计模式
  2. PHP中的ob_start() 的使用
  3. python中关于正则表达式三
  4. 使用ROW_NUMBER进行的快速分页
  5. MyBatis3.1 学习教程
  6. 如何在windows server 2008的桌面上显示 我的电脑
  7. postgres create table default now
  8. java 环境变量配置
  9. 增加Swap内存
  10. 输出图像到文件 imwrite()[OpenCV 笔记7]