POJ 1047 Round and Round We Go (大数乘法) 水

     这题貌似没什么技巧。。。

     看discuss上有个什么算法,没深究了。。。反正自己的A了,继续水……

 


 

#include <cstdio>
#include <cstring>
#define MAX 61
char chNum[MAX];
int iNum[MAX + 100];
int num[10], numForUse[10];   // 计算输入的大数中数字 0-9 的个数,用来在test()中判断是否为“cyclic“  
int curNum[MAX + 100];
int length;
bool judge();                  // 判断是否为cyclic  
void multiple(int n);          // 大数乘法
bool test();                   // 判断 乘以 1 -> length 是否都符合
int main()
{
    while(scanf("%s", chNum) != EOF)
    {
        memset(num, 0, sizeof(num));
        memset(iNum, 0, sizeof(iNum));
        length = strlen(chNum);
        int i, j;
        for(i = 0, j = length - 1; i < length; i++, j--)
        {
            num[chNum[j] - '0']++;    // 计算每个数出现几次,比如数组num[n] 就是指数字n在该数中有几个  
            iNum[i] = chNum[j] - '0';
        }
        if(judge() == true)
            printf("%s is cyclic\n", chNum);
        else
            printf("%s is not cyclic\n", chNum);

    }
}

bool judge()
{
    int i;
    for(i = 1; i <= length; i++)
    {
        multiple(i);
        if(test() == false)
            break;
    }
    return i == length + 1 ? true : false;


}

void multiple(int n)
{
    int i;
    for(i = 0; i < length; i++)
    {
        curNum[i] = iNum[i] * n;
    }
    int d;
    for(i = 0; i < length; i++)
    {
        d = curNum[i] / 10;
        curNum[i] = curNum[i] % 10;
        curNum[i + 1] += d;
    }
    while(d > 0)
    {
        curNum[i++] = d % 10;
        d /= 10;
    }
}

bool test()
{
    int i;
    for(i = 0; i < 10; i++)
        numForUse[i] = num[i];
    for(i = 0; i < length; i++)
    {
        numForUse[curNum[i]]--;
        if(numForUse[curNum[i]] < 0)
            return false;
    }
    return true;
}


 

你可能感兴趣的:(ACM,ACM,poj,poj,poj,大数运算,大数乘法,1047)