int ws(long long n) //位数 { int i=1,p; long long s,t,ss,tt; for (i=9;i>=0;i--) { ss=tenpow(i+1); tt=tenpow(i); s=n%ss; t=n%tt; if(n==s && n!=t){p=i+1;return p;} } }
int main() { int p,xx; int a[N],b[N],c[N]; //b[]大数,c[]小数 xx为下限 // long long n[N],big,small,jiangyou; //printf("请输入一个至少3位至多9位数"); while( scanf("%lld",&n[1])==1) { p=ws(n[1]); int count=1,j,l,k,m,flag=1,i,q,ff=1; small=0,big=0; for(j=1;j<=p;j++){a[j]=0;} jiangyou=n[count]; for(j=1;j<=p;j++) { a[p-j+1]=jiangyou%10; jiangyou/=10; } m=p*(p-1)/2; for(i=1;i<=10;i++){b[i]=a[i];c[i]=a[i];} for(i=1;i<=m;i++) { for(j=1;j<=p-1;j++) { if(b[j]>=b[j+1]) {q=b[j];b[j]=b[j+1];b[j+1]=q; } } } for(i=1;i<=m;i++) { for(j=1;j<=p-1;j++) { if(c[j]<=c[j+1]) {q=c[j];c[j]=c[j+1];c[j+1]=q; } } } int ccc=1; for(i=p;i>=1;i--)if(c[i]!=0)break;ccc=i++; int temp;//printf("%d 9%d\n",ccc,p); temp=c[ccc];c[ccc]=c[p];c[p]=temp; for(i=1;i<=p;i++){big+=b[i]*tenpow(i-1);} for(i=1;i<=p;i++){small+=c[i]*tenpow(i-1);} count++; n[count]=big-small; printf("%lld - %lld = %lld = 9 * %lld\n",big,small,n[count],n[count]/9); } return 0; }
long findVal (char number[], int len) { int var=0, count=0; long returnVal=0; for (var = len-1, count=0; var >= 0; --var, ++count) { returnVal += number[var]*tenpow(count); } return returnVal; }
/* generate a random number */ void gen_rand(int ans_digits[]) { srand((unsigned)time(NULL)); int ans = 1000 + (int)(8999.0*rand()/RAND_MAX); for(int i=0; i<4; i++) ans_digits[i] = (int)(ans/tenpow(3-i)) % 10; /* if 4 digits is not different from each other, regenerate it*/ while(ans_digits[0]==ans_digits[1] || ans_digits[1]==ans_digits[2] || ans_digits[2]==ans_digits[3] || ans_digits[0]==ans_digits[2] || ans_digits[0]==ans_digits[3] || ans_digits[1]==ans_digits[3]) { ans = 1000 + (int)(8999.0 * ((double)rand()/RAND_MAX)); for(int i=0; i<4; i++) ans_digits[i] = (int)(ans / tenpow(3-i))%10; } #ifdef DEBUG printf("%d\n", ans); #endif }
/* enter a 4-digit number */ int enter_number() { char mstr[5]={'\0','\0','\0','\0','\0'}; int c; int input; int in_digits[4]={0,0,0,0}; /* arrays for the 4 digits of input*/ bool reinput; do { reinput = false; printf(_("Input a 4-digit number:")); if(fgets(mstr, sizeof mstr, stdin) == NULL) err_exit(_("Something's got wrong, I'd better quit...\n")); // fgets appends the newline entered, if it appears in the first 4 // elements of mstr, then it's sure less than 4 digits are entered bool flag = false; if(mstr[0]!='\n'&& mstr[1]!='\n'&& mstr[2]!='\n' &&mstr[3]!='\n') /* discard the character */ while((c = getchar()) != '\n' && c != EOF) flag = true; if (flag == true) { fprintf(stderr, _("Input too long!\n")); reinput = true; continue; } input = atoi(mstr); if (input < 1000 || input > 9999) { fprintf(stderr, _("Must be a number between 1000 and 9999!\n")); reinput = true; continue; } for(int i=0; i<4; i++) in_digits[i]=(int) (input / tenpow(3-i) )%10; if(in_digits[0]==in_digits[1] || in_digits[1]==in_digits[2] || in_digits[2]==in_digits[3] || in_digits[0]==in_digits[2] || in_digits[0]==in_digits[3] || in_digits[1]==in_digits[3]) { fprintf(stderr, _("Four digits must be unique.\n")); reinput = true; continue; } }while(reinput); return input; }
int main(int argc, char *argv[]) { int opt = 0; int longIndex = 0; /* Initialize globalArgs before we get to work. */ globalArgs.version = NULL; /* false */ //prepare i18n setlocale(LC_ALL, ""); bindtextdomain("4digits", LOCALE_PATH); textdomain("4digits"); // Process the arguments with getopt_long(), then populate globalArgs opt = getopt_long(argc, argv, optString, longOpts, &longIndex); while(opt != -1) { switch(opt) { case 'v': globalArgs.version = VERSION_STRING; printf("%s\n%s\n%s", VERSION, _(COPYRIGHT), _(AUTHOR)); exit(1); case 'h': err_exit(_(HELP)); break; case '?': /* fall-through is intentional */ err_exit(_("Usage: 4digits [OPTION]...\n" "Try `4digits --help' for more information.")); break; case 0: /* long option without a short arg */ if(strcmp("version", longOpts[longIndex].name) == 0) break; break; default: /* You won't actually get here. */ break; } opt = getopt_long(argc, argv, optString, longOpts, &longIndex); } int ans_digits[4]; gen_rand(ans_digits); /* array for the 4 digits of n*/ time_t temp = time(NULL); time_t tic = temp; int guessed[8] = {0, 0, 0, 0, 0, 0, 0, 0}; int i; bool dup = false; for (int num_guess = 0; num_guess < 8; num_guess++) { int A = 0, B = 0; int input = enter_number(); for(int i=0; i < num_guess; i++) // duplicated input if (input == guessed[i]) { fprintf(stderr, _("You've already guessed it.\n")); --num_guess; dup = true; break; } if (dup == true) { dup = false; continue; } int in_digits[4]; /* arrays for the 4 digits of input*/ for(i=0; i<4; i++) { in_digits[i]=(int) (input / tenpow(3-i) )%10; } compare(in_digits, ans_digits, &A, &B); printf("%dA%dB ", A, B); if (num_guess != 7) printf(ngettext("\t %d time left.\n", "\t %d times left.\n", 7-num_guess), 7-num_guess); guessed[num_guess] = input; if(A == 4) { time_t toc = time(NULL); int score = (int)(toc-tic); printf(_("You win! :) Used %d sec.\n"), score); save_score(score); /* save score in the score file */ return 0; } } printf(_("\nHaha, you lose. It is ")); for(int i = 0; i < 4; i++) printf("%d", ans_digits[i]); printf(".\n"); return 0; }
int validateInputLength (long val) { if (val < tenpow(1) || val >= tenpow(MAX_DIGITS)) return 0; return 1; }
long tenpow(int n){ if (n <= 0) return 1; return 10*tenpow(n-1); }