codeforces 389A. Fox and Number Game

题目链接[CF 389A.] (http://codeforces.com/problemset/problem/389/A):
题目描述:
A. Fox and Number Game
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
Fox Ciel is playing a game with numbers now.

Ciel has n positive integers: x1, x2, …, xn. She can do the following operation as many times as needed: select two different indexes i and j such that xi > xj hold, and then apply assignment xi = xi - xj. The goal is to make the sum of all numbers as small as possible.

Please help Ciel to find this minimal sum.

Input
The first line contains an integer n (2 ≤ n ≤ 100). Then the second line contains n integers: x1, x2, …, xn (1 ≤ xi ≤ 100).

Output
Output a single integer — the required minimal sum.

Sample test(s)
input
2
1 2
output
2
input
3
2 4 6
output
6
input
2
12 18
output
12
input
5
45 12 27 30 18
output
15
Note
In the first example the optimal way is to do the assignment: x2 = x2 - x1.

In the second example the optimal sequence of operations is: x3 = x3 - x2, x2 = x2 - x1.

言简意赅:
此题题意为可以连续多次利用ai=ai-aj,直到把ai中的每一个数变成最小且相等时,既满足题意中的条件不再能进行操作了,所以可以借助于直接暴力的代码进行实现.

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int a[105];
int main()
{
    int n;
    int flag;
    while(scanf("%d",&n)!=EOF)
    {
        flag=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        while(1)
        {
            sort(a,a+n,greater<int>());
            flag=0;
            for(int i=0;i<n-1;i++)
            {
                if(a[i]>a[i+1])
                a[i]=a[i]-a[i+1];
                else flag++;
            }
            if(flag==n-1)
            break;
        }
        printf("%d\n",n*a[0]);
    }
    return 0;
}

当然此题的本意可以简化为要去求解所有数的最大公约数的问题,代码实现如下:

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int gcd(int a,int b)
{
    if(!b)
    return a;
    else return gcd(b,a%b);
}

int a[105];
int main()
{
    int n;
    int k;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
        }
        k=gcd(a[0],a[1]);
        for(int i=2; i<n; i++)
        {
            k=gcd(k,a[i]);
        }
    printf("%d\n",n*k);
    }
    return 0;
}

如果代码还不能A掉,那就不能去睡觉。

你可能感兴趣的:(数论,gcd)