Exemple #1
0
int main()
{
	int i, n;

	make();

	while (scanf("%d", &n) && n > 0) {
		printf("%d:\n", n);

		for (i = 0; i < nprime && prime[i] < n; i++)
			if (ISPRIME(n - prime[i])) {
				if (prime[i] <= (n - prime[i]))
					printf("%d+%d\n", prime[i], n - prime[i]);
				else
					printf("%d+%d\n", n - prime[i], prime[i]);
				goto ok;
			}

		printf("NO WAY!\n");
ok:
	}

	return 0;
}
Exemple #2
0
static int pass2(cn_t cn, const char *str){
  mpz_t comp;
  int ret = CN_OK;

  str = strchr(str+5, '(');
  str++;

  mpz_init(comp);
  cn_eval(comp, cn->n, cn->x);

  if(str[0] == '1' && str[1] == ')'){
    memcpy(cn->factor[0], comp, sizeof(mpz_t));
    cn->nfactors = 1;
  }else{
    int fix = 0;
    mpz_t tmpq, tmpr;
    mpz_init(tmpq);
    mpz_init(tmpr);
    do{
      mpz_t factor;
      int i = 0;
      while(*str >= '0' && *str <= '9'){
        buf[i++] = *str++;
      }
      buf[i] = '\0';
      mpz_init_set_str(factor, buf, 10);
      mpz_tdiv_qr(tmpq, tmpr, comp, factor);
      if(mpz_sgn(tmpr)){
        if(ret == CN_OK){
          ret = CN_DIV_ERROR(fix);
        }
      }else{
        mpz_set(comp, tmpq);
        if(!ISPRIME(factor)){
          if(ret == CN_OK){
            ret = CN_PRIMARITY_ERROR(fix);
          }
        }
        if(fix > 0 && mpz_cmp(cn->factor[fix-1], factor) > 0){
          if(ret == CN_OK){
            ret = CN_ORDER_ERROR(fix);
          }
        }
        memcpy(cn->factor[fix++], factor, sizeof(mpz_t));
      }
    }while(*str++ == ' ');
    mpz_clear(tmpq);
    mpz_clear(tmpr);
    memcpy(cn->factor[fix++], comp, sizeof(mpz_t));
    cn->nfactors = fix;
  }
  {
    char realflag;
    int realdigit;
    realflag = ISPRIME(comp) ? 'P' : 'C';
    if(cn->flag != realflag){
      ret |= CN_LF_PRIMARITY_ERROR;
    }
    if(cn->nfactors > 1 && realflag == 'P'
    && mpz_cmp(cn->factor[cn->nfactors-2], comp) > 0){
      ret |= CN_LF_ORDER_ERROR;
    }
    realdigit = strlen(mpz_get_str(buf, 10, comp));
    if(cn->lf_digit != realdigit){
      ret |= CN_LF_DIGIT_ERROR(realdigit);
    }
  }
  return ret;
}