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; }
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; }