排它平方数
2016-03-08 22:31
204 查看
排它平方数
才疏学浅,资历欠佳,难免有误,望有心人批评指正。
小明正看着 203879 这个数字发呆。原来,203879 * 203879 = 41566646641 这有什么神奇呢?仔细观察,203879 是个6位数,并且它的每个数位上的数字都是不同的,并且它平方后的所有数位上都不出现组成它自身的数字。具有这样特点的6位数还有一个,请你找出它!再归纳一下筛选要求:1. 6位正整数
2. 每个数位上的数字不同
3. 其平方数的每个数位不含原数字的任何组成数位
关键是这里的数比较大,6位数,6位数的平方最大12位数,int和long都存不下,使用一个20位的数组来存放 i*i 的结果,采用 i 的每一位数字 * i,之后再将所得的6个数各位相加,得到各个位置的数字,最后与 i 中的数字比较(i中存放的是 相应位置处的数字在 i 中的个数),只有当 i中以i*i 中各位数字为下标处的值为 0 时,才表示获得了最终结果。
#include <stdio.h> int n[10]; int ch[20];//存放i*i的乘积 int isDifferent(int num) { int ok = 1,i; n[num%10] ++; while((num/=10)!=0) n[num%10] ++; //存在某数字就将其位 置为1 for(i=0;i<10;i++) if(n[i]>1)//若某位超过1,则说明有重复数字存在 {ok = 0;break;} return ok; } void init() { int i; for( i=0;i<10;i++) n[i]=0; for(i=0;i<20;i++) ch[i]=0; } int main() { int i,j; for(i=1e5;i<1e6;i++) { if(isDifferent(i))//将i中有重复数字的排除 { int tmp = i; for(j=0;j<6;j++) { int mul = (tmp%10)*i; int index = j; do { ch[index]+= mul%10; //每位数分别相乘i,个位存入,逢十进一 if(ch[index]>=10) ch[index+1]+=ch[index]/10; ch[index]%=10; index++; } while((mul/=10)!=0); tmp/=10; } int ok =1,m,z; for(m=20;ch[m]==0;m--) ;//找到i*i的个位数所在的位置 for(;m>=0;m--) for(z=0;z<10;z++) if(ch[m]==z&&n[z]==1)//判断该数字是否i中已有 ok=0; if(ok) printf("%d\n",i); } init(); } return 0; }
相关文章推荐
- 高斯日记
- IOS-UITableViewStyle设置Group、Plain问题
- 2016-03-08
- iOS开发中的好工具
- 多如牛毛,乱迷人眼
- ExpandableListView的首次加载全部展开,并且点击Group不收缩
- json_encode 用法
- 研究推荐系统心得
- 最大子数组
- 回调函数
- [logstash-input-http] 插件使用详解
- 一生一个博客够了
- 2016蓝桥杯假期任务之《连号区间数》
- 将android的adb命令工具作用于mac全局
- NSRunLoop和NSTimer
- URL之资源下载整理
- 离职风波
- 条件结构
- Oracle学习之段区块初步概念
- bootsrtap 主题元素