##1005 继续(3n+1)猜想 为啥只有第一个测试点过了

代码:


#include <iostream>
using namespace std;
int main()
{
    int n,a;
    cin >> n;
    int arr[100] = { 0 };
    int arr1[100] = { 0 };
    for (int i = 0; i < n; i++)
    {
        cin >> arr[i];
        if (arr[i] >= 1 && arr[i] <= 100)
        {
            arr1[i] = arr[i];
        }
        else
            arr1[i] = 1;
    }
    for (int i = 0; i < n && arr[i] != 1; i++)
    {
            if (arr[i] % 2 == 1)
                arr[i] = (3 * arr[i] + 1) / 2;
            else
                arr[i] = arr[i] / 2;
            for (int j = 0; j < n; j++)
            {
                if (arr[i] == arr1[j])
                    arr1[j] = 1;
            }
    }
    for (int i = 0; i < n-1; i++)
    {
        for (int j = i+1; j < n; j++)
        {
            if (arr1[i] < arr1[j])
            {
                a = arr1[i];
                arr1[i] = arr1[j];
                arr1[j] = a;
            }
        }
    }
    cout << arr1[0];
    for (int i = 1; i < n; i++)
    {
        if (arr1[i] != 1)
            cout << ' ' << arr1[i];
    }
    return 0;
}

测试结果:只有第一个测试点过了

img

题呢?

第8、9两行的 ={0}可以不要,第13行不能取1 if (arr[i] > 1 && arr[i] <= 100),第32行到第43行可以改成一个sort排序,最后的输出不太确定

       #include <algorithm>
#include <iostream>
using namespace std;

int main(){
    int hash[10000]={0};           //数组开大一点,不然会数组越界段错误(如n为95时可以达到485)
    int x,n,a[110],num=0;
    cin>>x;
    for(int i=0;i<x;i++){
        cin>>a[i];
        n=a[i];
        if(hash[n]==1)            //如在前面过程中已经出现覆盖过一次,直接跳过这个数(不可能合格)
            continue;
        while(n>1){
            if(n%2==0)
                n/=2;
            else n=(3*n+1)/2;
            hash[n]=1;
        }
    }
    sort(a,a+x);                  //默认从小到大排序,之后的循环从大到小输出
    for(int i=x-1;i>=0;i--){
        if(hash[a[i]]==0){
            num++;
            if(num>1) cout<<" ";  //非第一个合格的数时,先输出空格再输出数字
            cout<<a[i];
        }
    }
    return 0;
}