PAT:1005 繼續(3n+1)猜想(25 分)C語言
阿新 • • 發佈:2018-11-23
PAT 1005 繼續(3n+1)猜想(25 分) C語言
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
//輸入n個整數
int zs[n];
for(int i=0;i<n;i++)
{
scanf("%d", &zs[i]);
}
/*
主要思想:設定一個標誌陣列,預設情況陣列值為0;然後將對應下標為輸入資料 i 的標誌設為1;
如果資料 i 在遞推過程中出現,那麼標誌位陣列下標為i的那個陣列值設為2。
然後將下標值為1的存入一個數組,按降序排序輸出
*/
int biaozhi[101] = {0};
int save[10000] = {0};
int sub=0;
int temp;
for(int i=0;i<n;i++)
{
int m = zs[i]; //某個輸入
if(biaozhi[m] == 2) //如果其標誌為2,則跳過
{
continue;
}
biaozhi[m] = 1; //否則設為1
while(m!=1)
{
if (m%2==1)
{
m = (3*m+1)/2; //遞推過程出現的數字
biaozhi[m] = 2;
}
else
{
m = m/2; //遞推過程出現的數字
biaozhi[m] = 2;
}
}
}
//將陣列值為1的下標存入另一個數組
for(int k=0;k<101;k++)
{
if (biaozhi[k] == 1)
{
save[sub] = k;
sub++;
}
}
//降序排序
for(int i=0;i<sub;i++)
{
for(int j=i+1;j<sub;j++)
{
if(save[i]<save[j])
{
temp = save[i];
save[i] = save[j];
save[j] = temp;
}
}
}
for(int k=0;k<sub-1;k++)
{
printf("%d ", save[k]);
}
printf("%d", save[sub-1]);
}