继续3n+1猜想
题目描述:
解题思路:
将一串数组放入a[]中,做循环:
1. 如果a[i]非零,对a[i]的中间值放入一个temp[]数组
循环temp[]
循环a[]
如果有temp[i]==a[j] a[j]=0;
得到的数组a[]中非零元素即为要求值,紧缩数组,排序输出即可
代码如下:
1 #include<stdio.h> 2 int n; 3 int temp[111];//0-100内的数,中间结果不会超过77+34次 4 int main() 5 { 6 scanf("%d",&n); 7 int a[100]; 8 for(int i=0;i<n;i++) scanf("%d",&a[i]); 9 10 for(i=0;i<n;i++) //将能被覆盖的设置为0 11 { 12 if(a[i]!=0) 13 { 14 int j=a[i],k=0; 15 while(j!=1) 16 { 17 if(j%2!=0) j=(3*j+1)/2; 18 else j/=2; 19 if(j!=1) 20 { 21 temp[k]=j; 22 k++; 23 } 24 } 25 for(int m=0;m<n;m++) 26 { 27 if(a[m]!=0) 28 { 29 for(int j=0;j<k;j++) 30 { 31 if(temp[j]==a[m]) 32 { 33 a[m]=0; 34 break; 35 } 36 } 37 } 38 } 39 } 40 } 41 42 int h=0,jj=0; 43 for(i=0;i<n;i++) //向前归总 44 { 45 46 if(a[i]!=0) 47 { 48 h++; 49 a[i-jj]=a[i]; 50 } 51 else jj++; 52 } 53 54 for(i=0;i<h-1;i++) //排序 55 { 56 int max=i,temp; 57 for(int j=i+1;j<h;j++) 58 { 59 if(a[max]<a[j]) max=j; 60 } 61 if(max!=i) 62 { 63 temp=a[max]; 64 a[max]=a[i]; 65 a[i]=temp; 66 } 67 } 68 printf("%d",a[0]); 69 for(i=1;i<h;i++) printf(" %d",a[i]); 70 printf("\n"); 71 return 0; 72 }
运行结果: