ACM杭電のAC回顧--2028

2224 ワード

慣例はまず問題を出して、後で解析して、最後に自分のコードを書きます
タイトル
Lowest Common Multiple Plus
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 47706 Accepted Submission(s): 19782
Problem Descriptionはn個の数の最小公倍数を求める.
Input入力には複数のテストインスタンスが含まれており、各テストインスタンスの最初は正の整数n、次いでnの正の整数である.
Outputは、テストデータのセットごとに出力される最小公倍数であり、各テストインスタンスの出力は1行を占める.最後の出力は32ビットの整数だと仮定できます.
Sample Input 2 4 6 3 2 5 7
Sample Output 12 70
问题解析个人的には、この问题は本当に面白いと思います.具体的にはどこが面白いですか.彼は头を使って彼の解法を考えているからです.この問題の求めはn個の数の最小公倍数であり、最小にするには一連の数を直接列挙して各数字で除去することができ、最小ですべて除去できる数を見つけるまで、私たちは最初の数の倍数をこの一連の数として選択することができ、その後、一つのサイクルで他の数を繰り返して求めることができ、もし余剰数が発見されたら、それは除去できないことを説明します.では、この数を倍にして、次の数で同じことをします.しかし、リサイクルの中でどうやって彼に再びそうさせたのだろうか.ポイントですが、以前forループをして変数を再修正したときにループ用の変数を誤って変更したことはありませんか?(どうせ私はこの愚かなことをしたことがあります)ここで私たちはこのようにしなければなりません.そうすれば、私たちのループを再開することができます.私たちがその変数を最初の値に変更すれば、このループを再開することができます.しかし、ここで注意してください.forループは内部文を実行した後、最後にその変数操作の文を実行します.だから値を変更するのは開始値より小さいです
/********************
 n        。
**********************/

#include
void main()
{
    int a[200],n,i;
    int m;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=1;i<=n;i++)
        scanf("%d",&a[i]);
        m=a[1];
        for(i=2;i<=n;i++)
        {
            if(a[1]%a[i]!=0)
            {
                a[1]=a[1]+m;
                i=1;
            }
        }
        printf("%d
"
,a[1]); } }

最后にみんなのACが楽しいことを祈ります:)