こんにちは、私はフェイ・ニャオです。お読みください。ご不明な点がございましたら、私と連絡を取り、それをフォローしてください(作成するのは簡単ではなく、売春を拒否することもできます)。
強引な列挙
帰納的推論を行う場合、特定の種類のイベントの考えられるすべての状況を1つずつ調べて、一般的な結論を導き出すと、この結論は信頼できます。この帰納法は、列挙法と呼ばれます。
-
列挙は、ブルートフォースとも呼ばれ、答えを1つずつ試すことに基づく問題解決戦略です。
-
あなたが最初にアルゴリズムに触れたとき、あなたが練習した基本的なアルゴリズムはすべて、9 * 9の掛け算の九九の印刷、水仙の数の検索、素数の検索などの列挙アルゴリズムに関するものでした。状況、契約条項。
-
列挙アルゴリズムの中心的なアイデアは、可能なすべてを列挙することです
年齢を推測する
問題の説明:
アメリカの数学者ウィーナー(N.ウィーナー)は早熟で、11歳で大学に進学しました。彼は1935年から1936年まで中国の清華大学で講義をするよう招待されました。かつて、彼は重要な会議に出席していて、彼の若い顔は印象的でした。そこで、年齢を尋ねると、「私の年齢の3乗は4桁の数字です。私の年齢は6桁の4乗です。これらの10の数字には、0から9までの正確に10の数字が含まれています。一度だけ。」当時の彼の若さを計算してください。その時点で彼の年齢番号を直接提出してください。
思考分析:
力ずくの方法で、年齢がx、10 ^ 3 = 1000、30 ^ 4 = 8100であると仮定して、おおよその年齢範囲を見つけます。これは、xの範囲が[10,30]の間にあることを示しています。
int main(){
for(int i = 10;i <= 30;i++)
{
printf("%d= %.0f %.0f\n",i,pow(i,3),pow(i,4));//pow指i的立方,i的四次方
}
return 0;
}
結果:
ユーザー年齢
問題の説明:
新しい友達が友達に会いました。彼の年齢について尋ねられたとき、彼のネチズンは言った:「私の年齢は2桁の数字です、私は私の息子より27歳年上です、
年齢の2桁を入れ替えると、たまたま息子の年齢になります。」
計算してください:ネチズンの年齢には、いくつの可能性のある状況がありますか?
ヒント:30歳は可能性の1つです。
考えられる状況の数を記入してください。
思考分析:
ネチズンの年齢は息子より27歳年上です。つまり、ネチズンは27歳以上です。つまり、初期値は27、最大の2桁の数字は99、範囲は[27、 99]。10桁は10aであり、彼の年齢番号の位置は正確に彼の息子の年齢であり、彼の息子の年齢は10 b + aであり、判断条件はネチズンの年齢から27を引いたものです。彼の息子の年齢に等しく、合計が累積されます。いくつかの可能性。
#include<stdio.h>
#include<math.h>
int main()
{
int i,a,b,son,sum=0;
for(i=27;i<100;i++){
a=i/10;
b=i%10; //例如41对10整除取4,对10取余得1,即他儿子14岁
son=(b*10)+a;
if(27==i-son){
printf("%d\n",i);
sum++;
}
}
printf("共有%d种可能性\n",sum);
return 0;
}
結果:
30
41
52
63
74
85
96
共有7种可能性
誕生日の年齢
問題の説明:
ある紳士は、ある年から毎年誕生日会を開いており、毎回同じ数のろうそくを吹き消さなければなりません。今数えて、彼は合計236本のろうそくを吹き消しました。
すみません、彼は何歳で誕生日パーティーを始めましたか?
彼が誕生日パーティーを始めた年齢を出力してください。
注:出力は整数である必要があり、不要なテキストや説明テキストは出力しないでください。
入力
入力なし。
出力
整数、つまり、ある紳士が誕生日パーティーを始めた年齢を出力します
ヒント
printfまたはcoutを使用して回答を出力します。
思考分析:
iが初期年齢、jが終了年齢、jがiより大きくなければならない場合、j = i + 1、ろうそくの数はkです。暴力が蓄積します。
int main()
{
for(int i=1;i<=100;i++)
{
for(int j=i+1;j<=100;j++)
{
int sum=0;
for(int k=i;k<=j;k++){
sum += k;
}
if(sum==236)
printf("%d",i);
}
}
return 0;
}
結果:26
数学の質問
問題の説明:
限定5桁
3で割り切れる6の1桁の5桁の数字はいくつありますか?
思考分析:
最初に5桁の範囲[10000、99999]を分析します。1桁は6で、これは少なくとも2桁を意味し、余りは3であり、ansが累積されます。
#include <stdio.h>
#include <stdlib.h>
int main() {
int ans=0;
for(int i=10000;i<=99999;i++){
if((i*10+6)%3==0){
ans++;
}
}
printf("能被3整除的有%d个",ans);
return 0;
}
結果:3000
3で割り切れる
ずさんな数学
問題の説明:
シャオ・ミンはせっかちな人で、小学生の頃、先生が黒板に書いた質問を間違えてコピーしてしまうことが多かった。かつて、先生は質問をしました:36 x 495 =?彼はそれをコピーしました:396 x 45 =?しかし、結果は非常に劇的でした、彼の答えは正しいことがわかりました!!36 * 495 = 396 * 45 = 1782ので、このような他の多くの偶然の一致があるかもしれません、例えば:27 * 594 = 297 * 54
abcdeが1から9までの5つの異なる数値を表すとします(これらは異なる数値であり、0を含まないことに注意してください)
次の形式で数式をいくつ使用できますか:ab * cde = adb * ce?コンピュータの利点を利用して、すべての可能性を見つけ、さまざまな計算の種類の数に答えてください。
乗算の可換法則を満たす式は異なる種類としてカウントされるため、答えは偶数でなければなりません。
回答はブラウザから直接送信されます。注:統計カテゴリの最終的な数を示す番号のみを送信し、解決プロセスやその他の不要なコンテンツは送信しないでください。
思考分析:
abcdeが1から9までの5つの異なる数値を表すと仮定すると、abcdeの範囲は[1,9]であり、ansによって累積される結果の数であり、条件ab cde = adb ceを判断して条件を満たし、 1が累積されます。その場合、a Itがbに等しい可能性があるため、aがbに等しくないという判断は否定され、他の文字についても同じことが言えます。
#include<stdio.h>
int main(){
int ans=0,m,n;
for(int a = 1;a<=9;a++){
for(int b = 1;b<=9;b++){
for(int c = 1;c<=9;c++){
for(int d =1;d<=9;d++){
for(int e =1;e<=9;e++){
m = (a*10+b)*(c*100+d*10+e);
n = (a*100+d*10+b)*(c*10+e);
if(m==n&&a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e){
ans++;
}
}
}
}
}
}
printf("一共%d种",ans);
return 0;
}
結果: 142
奇妙な分数
問題の説明:
小学生の頃、シャオミンは自分で新しいアルゴリズムを発明することが多かった。かつて、先生は質問をしました:1/4 x 8/5 Xiaomingは実際に分子と分母を一緒につなぎ合わせました、そして答えは:18/45でした。先生はただ彼を批判したかったのですが、考え直してみると、この答えはたまたま正しかったのです。
分子と分母の両方が1から9までの1桁である場合、この方法で他にどのような式を計算できますか?すべての異なる方程式の数を書き留めてください(質問の例を含む)。
明らかに、分子と分母を交換した後、たとえば:4/1 x 5/8で十分です。これは、別の式としてカウントされます。
しかし、分子と分母が同じ場合、2/2 x 3/3はタイプが多すぎて、数えられません。
注:答えは整数です(対称性を考慮すると偶数でなければなりません)。
ブラウザ経由で送信してください。余分なコンテンツを書かないでください。
思考分析:
実際、前のものと似ています。範囲を見つけ、判断条件を見つけ、不適合条件を見つけ、累積ansを使用します。
(a / b)*(c / d)==((a * 10 + c)/ b * 10 + d))は使用できませんが、数学では帰一算を使用することに注意してください。
#include<stdio.h>
int main(){
int ans=0;
for(int a=1;a<=9;a++){
for(int b =1;b<=9;b++){
for(int c =1;c<=9;c++){
for(int d=1;d<=9;d++){
if(a==b&&c==d)
continue;
int e = a*10+c,f = b*10+d;
if(a*c*f==b*d*e){
ans++;
}
}
}
}
}
printf("%d",ans);
return 0;
}
結果: 14
ジオメトリの問題
問題の説明:
Xiaolanには、たくさんの商品を収納できる特大の倉庫があります。現在、Xiaolanには倉庫に配置される商品の箱がn個あり、商品の各箱は通常の立方体です。Xiaolanは、長さ、幅、高さの3つの相互に垂直な方向を規定しており、商品の各ボックスの側面は、長さ、幅、高さに対して厳密に平行でなければなりません。リトルブルーは、すべての商品が大きな立方体になることを望んでいます。つまり、長さ、幅、高さの方向にそれぞれL、W、Hの商品を積み重ね、n=L×W×Hを満たします。nが与えられると、商品を積み重ねるためのオプションの数が要件を満たします。
たとえば、n = 4の場合、次の6つのスキームがあります:1×1×4、1×2×2、1×4×1、2×1×2、2×2×1、4×1×1
すみません、n = 2021041820210418(16桁あることに注意してください)の場合、合計でいくつのオプションがありますか?
ヒント:問題を解決するには、コンピュータープログラミングを使用することをお勧めします。
思考分析:
周期的な暴力の列挙の解決策は理論的には可能ですが、実現可能ではありません。思考を変換し、全体の数のすべての要因を(おおよそ)分解してから、すべての要因に2サイクルを列挙させて結果を計算します。
#include<stdio.h>
int judge(long long a,long long b,long long c)
{
if(a==b==c)//长宽高相同排列只有一种组合
return 1;
if(a==b&&a!=c||a==c&&a!=b||b==c&&a!=b) //长宽高 任意两个相同排列只有3种
return 3;
else
return 6; //长宽高都不相同排列只有6种
}
int mian()
{
long long n =2021041820210418;
long long L,W,H;
long long ans=0;
for(L=1;L*L*L<=n;L++) //l是最小的一方
{
if(n%L==0)//小优化
{
for(W=L;L*W*W<=n;W++)//l是第二大的一方,次数多
{
if(n%(L*W)==0)//小优化
{
H=n/L/W;
if(H>=W){
ans+=judge(L,W,H);
}
}
}
}
}
printf("%d",ans);
}
結果: 2430
観客の皆さん、それをクリックしてください!