1450-wzy的刁难1

题目来源:http://acm.nyist.cf/problem/1450
题目描述:
众所周知,wzy可是新生赛AK大佬,为了让学弟学妹们同样能AK,他绞尽脑汁,使出浑身解数,终于想出了个简单题

以上为故事背景

给出一个数n(n<=1e8),现在有这样一个操作,将n变为n的所有位 上的数字之和;
比如12345经过这样一次操作就变成了 1+2+3+4+5=15
47905经过操作一次操作后就变成了 4+7+9+0+5=25
现在对n重复进行这个操作,直到n的位数只有1位时,停止
问在这个过程中出现过的所有数字,是否有素数
如果有输出YES,并输出这些素数,每个占一行
否则输出NO

输入描述:
多组输入,每行一个n(后台数据不超过50组)
输出描述:
每个输出均占一行(具体看样例)
样例输入:
45293
6
12
样例输出:
YES
45293
23
5
NO
YES
3
提示:
第一组
过程中出现素数,输出YES
45293,为素数,输出
4+5+2+9+3=23,为素数输出
2+3=5 ,为素数输出
5只有一位,停止操作
第二组,没出现过素数,输出NO
第三组
过程中出现素数,输出YES
12不是素数,不输出
1+2=3,是素数,输出
3只有一位,停止操作
思路:素数筛打表和存数组都会RE,只有一边判断一边输出;(比赛时候素数判断的平方根优化没有加等于号导致素数判断不完整,启示我要记版子并且要记熟悉,多练就好)
代码如下:

#include<bits/stdc++.h>
using namespace std;
int prime(int n)
{
    if(n<2)
        return 0;
    for(int i=2;i<=sqrt(n);i++)
        if(n%i==0)
        return 0;
    return 1;
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int len=0,falg=0;//falg记录是不是第一次输出,是的话就先输出YES;
        while(n>=10)
        {
            if(prime(n))
            {
                if(falg==0)
                {
                    printf("YES\n");
                    falg=1;
                }
                printf("%d\n",n);
            }
            int sum=0;
            while(n!=0)
            {
                sum+=n%10;
                n/=10;
            }
            n=sum;
        }
        if(n==2||n==3||n==7||n==5)
        {
            if(falg==0)
            {
                printf("YES\n");
                falg=1;
            }
            printf("%d\n",n);
        }
        if(!falg)
            printf("NO\n");
    }
    return 0;
}