#include<iostream> #include<string> //大整数减法 std::string Substract(std::string s1, std::string s2) { std::string result; int carry = 0; int i = s1.length()-1; int j = s2.length()-1; while(i >= 0 || j >= 0 || carry)//从后往前遍历,依次对应相减 { int x = i >= 0 ? s1[i--] - '0' : 0;//位数不够就赋值为0 int y = j >= 0 ? s2[j--] - '0' : 0; int diff = x - y - carry; if(diff < 0)//这里运用了补码的思想,如果小于0说明不够减,加上10为正确结果,同时进位变为1 { diff += 10; carry = 1; }else{ carry = 0;//够减则进位为0 } //将相减的结果从头不断加入字符串 result = std::to_string(diff) + result; } //移除数字前面的0 while (result.length() > 1 && result[0] == '0') { result = result.substr(1); } return result; } //大整数除法 bool divide(std::string dividend, std::string divisor) { std::string quotient; std::string reminder = ""; for(char digit : dividend) { reminder += digit;//先找到大于除数的部分 int count = 0; while(std::stoi(reminder) >= std::stoi(divisor)) { //除法本质上就是减法,不断相减,直到小于除数 reminder = Substract(reminder, divisor); count++;//每减一次该位的商就加1 } quotient.push_back(count + '0'); } while (quotient.length() > 1 && quotient[0] == '0') { quotient = quotient.substr(1); } // if(quotient.empty()) // { // return "0"; // } while (reminder.length() > 1 && reminder[0] == '0') { reminder = reminder.substr(1); } if(reminder == "0" ) { return true; }else{ return false; } } int main() { std::string s; while(std::cin >> s) { if(s == "-1") break; std::string result = ""; for(int i = 2;i <= 9;i++) { if(divide(s, std::to_string(i))) { result = result + std::to_string(i) + " "; } } if(result.empty()) { result = "none"; }else{ result.erase(result.length() - 1); } std::cout << result << std::endl; } }