1001 害死人不偿命的(3n+1)猜想 (15分)
カラッツの推測:
正の整数nの場合、偶数の場合は半分にカットし、奇数の場合は(3n + 1)を半分にカットします。これは繰り返し繰り返されており、最終的にはあるステップでn = 1を取得する必要があります。カラズは1950年の世界数学者会議でこの推測を発表しました。伝説によると、エール大学の教師と学生は、この一見愚かで無実の提案を証明するために動員されました。その結果、学生は勉強することを嫌がりました。 +1)、これは陰謀だと言う人もいるので、カラズはアメリカの数学の教育と科学研究の進歩を故意に遅らせています...
今日のトピックは、カラズの推測を証明することではなく、1000を超えない任意の正の整数nを単純に数えることです。n= 1を取得するには何ステップ(数回カット)かかりますか?
入力形式:
各テスト入力には、正の整数nの値を与える1つのテストケースが含まれます。
出力形式:
nから1までの計算に必要なステップ数を出力します。
入力サンプル:
3
出力サンプル:
5
コード
#include<stdio.h>
int main()
{
int n;
int step=0;
scanf("%d",&n);
while(n!=1)
{
if(n%2==0)
n=n/2;
else
n=(3*n+1)/2;
step++;
}
printf("%d\n",step);
return 0;
}
実行スクリーンショット
この実行結果は、浙江大学PATの公式ウェブサイトでのテスト結果です。
テスト環境はgcc6.5.0です。
Visual Studioのコードはテストのコードとは異なり、実行できますが、PATテストの公式Webサイトでは実行できず、テストポイントにエラーがあります。
以下はVisualStudio2019のコードです
#include<stdio.h>
int main()
{
int n;
int step = 0;
scanf("%d", &n);
while (n != 1)
{
if (n % 2 == 0)
{
n = n / 2;
}
else
{
n = (3 * n + 1) / 2;
}
step++;
}
printf("step=%d\n", step);
return 0;
}
実行結果
はPATでコンパイルできますが、スコアは0です
。ここでの警告は、scanfの戻り値を使用しなかったことを通知するためのものです
。2つのコードがprintfの出力関数だけで異なり
、2番目のコードが異なることを確認するのは難しくありません。コードは、PATのgcc6.5.0コンパイラではコンパイルできません。
他の人のブログで
warning不会对程序本身逻辑造成影响,忽略即可。
程序未通过测试,要检查代码本身的错误
しかし、私はこのコードの論理的なエラーを見つけていません。
希望懂得的人不吝赐教
2つ目はPATのテストポイントです
。PATのテストポイントは与えられないようです。テストポイントが与えられれば、全員が満点になるはずです。
上記は私の経験とPATレベルB1001プログラムの質問の経験です。最初の質問は比較的簡単です。
良いコードを書くことを期待して、残りのトピックを更新し続けます。