NYOJ:458小光棍数
2016-09-06 17:07
183 查看
小光棍数
描述最近Topcoder的XD遇到了一个难题,倘若一个数的三次方的后三位是111,他把这样的数称为小光棍数。他已经知道了第一个小光棍数是471,471的三次方是104487111,现在他想知道第m(m<=10000000000)个小光棍数是多少?输入有多组测试数据。第一行一个整数n,表示有n组测试数据。接下来的每行有一个整数m。
输出输出第m个小光棍数。
样例输入
1 1
样例输出
471
#include<stdio.h>#include<string.h>int main(){ int num,sum=0,i,len,m2[15]; char m1[15]; scanf("%d",&num); getchar(); while(num--) { gets(m1); len=strlen(m1); for(i=0;i<len;i++) m2[i]=m1[i]-'0'; m2[len-1]=m2[len-1]-1; for(i=len-1;i>0;i--) { if(m2[i]<0) { m2[i]=m2[i]+10; m2[i-1]=m2[i-1]-1; } } for(i=0;i<len;i++) if(m2[i]) break; for(;i<len;i++) printf("%d",m2[i]); printf("471\n"); } return 0;}
解题思路:发现一个数的三次方最后三位为111的数结尾都含有471.所以第一个小光棍数是0471;第二个小光棍数是1471;第三个小光棍数是2471;。。。那么第n个小光棍数是(n-1)471;注意这里的(n-1)代表的是个串;因为最后m会很大,我们将这个数当成字符串输入,然后给每一位都放入整形数组里面,然后求m-1;如要求第1000个光棍数,第1000个光棍数为999471则字符数组m1为{'1','0','0','0'}然后每位都减去字符'0',放到整型数组里面则整型数组m2为{1,0,0,0}然后从最后一位开始减去1则m2[3]=m2[3]-1=-1;m2[3]<0m2[3]=m2[3]+10=-1+10=9;m2[2]=m2[2]-1=-1;m2[2]<0m2[2]=m2[2]+10=-1+10=9;m2[1]=m2[1]-1=0-1=-1;m2[1]<0m2[1]=m2[1]+10=-1+10=9;m2[0]=m2[0]-1=1-1=0此时整型数组m2中的值变为{0,9,9,9}然后将整型数组m2从第一位非零位全部输出,在之间printf("471\n");即为答案。
相关文章推荐
- 安卓实现沉浸式效果,状态栏变色
- tarjan算法不是很懂先mark一下。
- multipart/form-data
- linux /etc/fstab
- Golden Dream-9月
- iOS--多线程GCD延迟执行--07
- 剑指offer--替换空格
- Ant和Maven特点
- 读构建之法的读书笔记
- Carousel 旋转画廊特效的疑难杂症
- 第二周【项目3-体验复杂度】(2)汉诺塔
- Android手机平板两不误,使用Fragment实现兼容手机和平板的程序
- idea2016 修改jsp页面需要重新部署项目的问题
- sed 命令
- Qt官网
- 取出字符串中的数字求和(c语言)
- 优化php效率,提高php性能的一些方法
- HBase管理 HBase数据备份方式对比
- poj3237 Tree
- 开发过程中dubbo 实体序列化问题