sincerit 数学(跟Big Number思路一样)

链接:https://ac.nowcoder.com/acm/contest/280/B
来源:牛客网

题目描述
某年某月某天的数学课上,Actci正在遨游宇宙呢,对于他的屡教不改,她的数学老师决定难为一下Actci,将他叫醒。
“咳咳,我现在给出一个数a(0≤a≤1010000),判断a是否是3,5,8,11中某些数的的倍数,你只有一秒钟的时间,答不上来的话,呵,%#W %@# @…”。

作为他后桌的你怎么能看着Actci“受害”呢,于是你决定帮帮他。

输入描述:
一行,一个数 a。
输出描述:
两行。
第一行输出 Yes 或 No,表示这个数是否是这四个数中一个或几个数的倍数。
第二行,a是哪些数的倍数,每个数用空格隔开(顺序从小到大),若第一行为 No 则不用输出。
示例1
输入
复制
123456789
输出
复制
Yes
3
示例2
输入
复制
2341232402462055420
输出
复制
Yes
3 5
示例3
输入
复制
9741427
输出
复制
No

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
int ss[5] = {3, 5, 8, 11};
int ans[5];
int main() {
  char num[10005];
  while (~scanf("%s", num)) {
    int sum = 0, cnt = 0;
    if (strlen(num) == 1) {
      if (num[0] == '3' || num[0] == '5' || num[0] == '8') printf("Yes\n%c\n", num[0]);
      else printf("No\n");
    } else {
      char t = num[0];
      int flag = 0;
      for (int i = 1; i < strlen(num); i++) {
        if (t != num[i]) {
          flag = 1;
          break;
        }
      }
      for (int i = 0; i < 4; i++) {
        sum = 0;
        for (int j = 0; j < strlen(num); j++) {
          sum = (sum * 10 % ss[i] + (num[j] - '0') % ss[i]) % ss[i];
        }
        if (sum == 0) ans[cnt++] = ss[i];
      }
      if (flag == 0) {
        printf("Yes\n");
        if (t == '3' || t == '5' || t == '8') printf("%c ", t);
        printf("11\n");
      }
      else {
        if (cnt > 0) {
          printf("Yes\n");
          for (int i = 0; i < cnt; i++) printf("%d ", ans[i]);
          printf("\n");
        } else printf ("No\n");
      }
    }
  } 
  return 0;
}

猜你喜欢

转载自blog.csdn.net/sincerit/article/details/85217606