排它平方数

来源:互联网 发布:mac最好用的虚拟机 编辑:程序博客网 时间:2024/05/13 01:36
//排它平方数://    1. 6位正整数//    2. 每个数位上的数字不同//    3. 其平方数的每个数位不含原数字的任何组成数位//203879 * 203879 = 41566646641//203879 是个6位数,并且它的每个数位上的数字都是不同的,//并且它平方后的所有数位上都不出现组成它自身的数字。#include <stdio.h>#include <time.h> long create( long l_old );char square( long l_base);long judge ( long l_old);int main( ){volatile long l_val = 123456;/*************************************************************/clock_t start, finish;  start = clock(); /*************************************************************/start = clock(); //网上的方法:算法快且清楚易懂do{l_val++;l_val = judge (l_val);}while( (l_val<1000000));finish = clock();  printf( "\n\n\n程序运行时间:%.3f ms\n", (double)(finish - start));//自己的算法,太复杂start = clock(); do{++l_val;l_val = create(l_val); if( square(l_val) );elseprintf("%ld\n", l_val);}while(l_val<987600);/*************************************************************/finish = clock();  printf( "\n\n\n程序运行时间:%.3f ms\n", (double)(finish - start));/*************************************************************/return 0;}//传入一个数old,计算出比old大的六位不相同的new数long create( long l_old ){char c_arr[6]={0};char c_i = 0;char c_j = 0;long l_new = 0;for( ; l_old<=987654; ++l_old){l_new = l_old;//分离l_old六位数for(c_i=0; c_i<6; c_i++){c_arr[c_i] = l_new%10;l_new /= 10;//printf("%d\n", c_arr[c_i]);}//将前面的数一位一位的和后面对比for(c_i=0; c_i<5; c_i++){//若数字重复,结束此轮比较,将old值增一for(c_j=c_i+1; c_j<6; c_j++){if(c_arr[c_i] == c_arr[c_j])break;}if(c_j<6){break;}}//若找到六位数字不一样的数字,就返回调用函数if(c_i==5){l_new = l_old;break;}}return l_new;}char square(long l_base){char c_flag = 1;char c_i    = 0;char c_j    = 0;char c_basearr[6] = {0};char c_squarearr[12] = {10,10,10,10,10,10,10,10,10,10,10,10};long l_base_temp = l_base;__int64 ll_square = 0;ll_square = (__int64 )l_base*l_base;//先将两个数分离for(c_i=0; c_i<6; c_i++){c_basearr[c_i] = l_base%10;l_base /= 10;}for(c_j=0; c_j<12; c_j++){c_squarearr[c_j] = ll_square%10;ll_square /= 10;if(ll_square<1)break;}for(c_i=0; c_i<6; c_i++){//若数字重复,结束此轮比较,将old值增一for(c_j=0; c_j<12; c_j++){if((c_basearr[c_i] == c_squarearr[c_j]))break;}if(c_j<12){break;}}//若找到六位数字不一样的数字,就返回调用函数if(c_i==6){if(c_j==12)c_flag = 0;}return c_flag;}long judge(long l_old){__int64  l_big=1;long l_backups = l_old;char temp = 0;char c_arr[10] = {0};//将对应位设置为占有,若发现此位已被占,表明不是这个数字。while(l_old>0){temp = l_old%10;if(c_arr[temp])break;elsec_arr[temp]= 1;l_old /= 10;}// 若发现又一个六位不同的数,则检查此数是否为排它平方数 if(0 == l_old){//必须强制转换,会溢出 l_big = (__int64 )l_backups*l_backups;//检查对应位是否占有,while(l_big>0){temp = l_big%10;if(c_arr[temp])break;l_big /= 10;}if(0 == l_big)printf("%ld\n", l_backups);}return l_backups;}


 

原创粉丝点击