(1)设置10个元素的状态数组p,记录数字0~9在6位数和3位数中出现的情况。数组元素都赋值1,表示数字0~9没有被使用过。
(2)对尝试的每一个数3位数x,6位数=x*x,并取其各个位数字,数字作为数组的下标,若对应元素为1,则该数字第一次出现,
将对应的元素赋值为0,表示该数字已经出现一次。否则,若对应元素为0,则说明有重复数字,结束这次尝试。
(3)当状态数组p中9个元素为0时,就找到了问题的解。但这样判定有解,需要扫描一遍数组p。为避免这个步骤,
设置一个计数器k,在取x,x*x各个位数的过程中记录不同数字的个数,当k=9时就找到了问题的解。
1 #include<stdio.h> 2 int main() 3 { 4 long x; 5 int p[10]; 6 int i,t,k; 7 int num=0; 8 int n,f,y,m; 9 for(x=100;x<=999;x++) 10 { 11 for(i=0;i<=9;i++) 12 p[i]=1; 13 y=x*x; //y表示6位数 14 f=y; //将y暂时存放在f中 15 n=x; //n表示3位数 16 if(f<=999999) 17 { 18 k=0; 19 for(i=1;i<=6;i++) 20 { 21 t=n%10; 22 n=n/10; 23 m=f%10; 24 f=f/10; 25 if(m==t) 26 { 27 k=0; 28 break; 29 } 30 if(i<4) 31 if(p[t]==1) 32 { 33 p[t]=0; 34 k++; 35 } 36 else 37 { 38 k=0; 39 break; 40 } 41 if(p[m]==1) 42 { 43 p[m]=0; 44 k++; 45 } 46 else 47 { 48 k=0; 49 break; 50 } 51 } 52 if(k==9) 53 { 54 num=num+1; 55 printf("%ld\t%d\n",x,y); 56 } 57 } 58 else 59 continue; 60 } 61 printf("\n"); 62 printf("%d\n",num); 63 return 0; 64 }
原文地址:https://www.cnblogs.com/javaexplorer/p/9965421.html
时间: 2024-11-05 22:47:48