竞赛讨论区 > 蕊蕊识数
头像
寒冰-侠客
发布于 2019-12-02 21:05
+ 关注

蕊蕊识数

从题意看,能被整除的数感觉不是2就是3(提交后发现大佬的确是这么做的),然而我并不能证明。所以暴力来一发(观察题目会发现除了初始的n和第一次的和可能较大,其他数字都是比较小的,因此枚举循环次数应该不多)。
从2枚举找到满足条件数字,由于n很大,作了一个高精度除法。
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
string s;
int a[100005];/**< a存储高精度 */
int test(int x)/**< 测试一下存在a数组的高精度数字能否被x整除 */
{
    int i,j,y=a[s.size()-1];
    for(i=s.size()-2; i>=0; i--)
        y=y%x*10+a[i];
    if(y%x==0)
        return 1;
    else
        return 0;
}
int main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    int i,j,t,sum;
    cin>>t;
    while(t--)
    {
        memset(a,0,sizeof(a));
        sum=0;
        cin>>s;
        for(i=0; i<s.size(); i++)
        {
            a[i]=s[s.size()-1-i]-'0';
            sum+=a[i];
        }
        int b[10],total=1;
        b[1]=sum;
        while(sum>=10)
        {
            int s=0;
            while(sum)
                s+=sum%10,sum/=10;
            sum=s;
            b[++total]=sum;
        }
        for(j=2;; j++)/**< 暴力检查满足条件的j,除了开始的n和第一次的sum外,其他数字都很小,因此考虑暴力枚举的方法 */
        {
            if(test(j)==1) /**< 能整除情况 */
            {
                for(i=1; i<=total; i++)
                {
                    if(b[i]%j!=0)
                        break;
                }
                if(i>total)
                {
                    cout<<j<<endl;
                    break;
                }
            }
            else/**< 不能整除情况 */
            {
                for(i=1; i<=total; i++)
                {
                    if(b[i]%j==0)
                        break;
                }
                if(i>total)
                {
                    cout<<j<<endl;
                    break;
                }
            }
        }
    }
    return 0;
}






全部评论

(2) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐