(3N + 1)の推定(25ポイント)C言語バージョン
Kharazi(Callatz)推測の説明は、1001に与えられています。このトピックでは、状況は多少複雑です。
ダブルカウントを避けるために、番号が遭遇した各再帰的に記録することができたとき、私たちはKharaziの推測を検証する場合。例えば、n = 3の場合は、検証のために、我々は、我々は、n = 5,8,4,2を確認する場合、3,5,8,4,2,1を計算する必要がある、それはKharazi推測直接決定することができます検証に遭遇したとき、それは数4 3を持っているので信憑性は、ダブルカウントせずに、我々は数の5,8,4,2 3「報道」と呼ばれています。私たちは、nは、シリーズの他の図でカバーすることができない場合は、「キーの数」の数であるn個の列に番号を呼び出します。
今検証する一連の番号に与えられた、我々は唯一のそれらのいくつかのキー番号を確認する必要がある、あなたは残りの番号を確認するために繰り返されている必要はありません。あなたの仕事は降順に出力することによると、これらのキー数値を見つけることです。
入力フォーマット:
各テストは、テスト入力を備え、第一行がK(<100)整数正が与えられ、互いに異なる正の整数を認証するためにK線2を与えるN(1 <n≤100 )スペースで区切られた数字の間の値。
出力形式:
出力用の各試験行、次出力キー数値を降順です。数字の間の空間によって分離されたが、スペースを含まない行の後、最後の番号。
サンプル入力:
6
3 5 6 7 8 11
出力例:
7 6
#include <stdio.h>
int cx(int x)
{
if(x%2==0)
return x/2;
else
return (3*x+1)/2;
}
int sort(int *y,int z)
{
int temp,b=0;
for(int j=0;j<z-1;j++)
{
for(int k=0;k<z-1-j;k++)
{
if(y[k]<y[k+1])
{
temp=y[k];
y[k]=y[k+1];
y[k+1]=temp;
b++;
}
}
if(b==0)
break;
else
b=0;
}
return 0;
}
int main()
{
int n;
scanf("%d",&n);
int a[100],b[100]={0};
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int j=0;j<n;j++)
{
for(int k=0;k<n;k++)
{
int t=cx(a[k]);
while(t!=1)
{
if(a[j]==t)
{
b[j]=1;
break;
}
else
t=cx(t);
}
if(b[j]==1)
break;
}
}
int m=0,c[100];
for(int l=0;l<n;l++)
{
if(b[l]==0)
c[m++]=a[l];
}
sort(c,m);
for(int d=0;d<m-1;d++)
printf("%d ",c[d]);
printf("%d",c[m-1]);
return 0;
}
後は非常にそれを行うことに興奮。。。
コードビット長ったらしい、どのように多くのforループの使用A思い出すことができません。
主なアイデアは:最初の2つのメモリアレイは、それぞれ、測定された要素に対応する(0は代表キーワードで標識された)マーク確立次いで、全ての中間の数字(Iコード自体を含む)再帰推測循環要素そして試験のすべての要素の比較は、変更フラグに要素が「被覆」されています。最後に、出力(最後の数字は、スペースが続かないことに注意してください)に、降順に並んだ要素をマークします。