先用python算出n從1到10000,
(有python揪甘心)
的所有digits,之後做sort,
發現到最多次digit為n = 9981,
digit為9972。
所以MAX digit設為10000。
接著就是乘除大數版,
每次都把seq的位數 + 1,
並讓seq為1111...111的形式,
計算seq % n是否整除即可。
/* ACM 10127 Ones
* mythnc
* 2011/11/10 10:42:16
* run time: 1.34
*/
#include <stdio.h>
#define MAXD 10000
void initbig(int *, int *);
int modbig(int *, int, int);
int divbig(int *, int, int *, int);
void mulbig(int *, int, int, int);
int equalbig(int *, int *, int);
void plusbig(int *, int *);
int main(void)
{
int n, digit;
int seq[MAXD];
while (scanf("%d", &n) == 1) {
initbig(seq, &digit);
while (modbig(seq, digit, n) != 0)
plusbig(seq, &digit);
printf("%d\n", digit);
}
return 0;
}
/* initbig: initialzie big to 1 */
void initbig(int *seq, int *digit)
{
seq[0] = 1;
*digit = 1;
}
/* modbig: if seq % n == 0 return 0,
* else return 1 */
int modbig(int *seq, int digit, int n)
{
int q[MAXD] = { 0 };
int qd, i;
qd = divbig(seq, digit, q, n);
mulbig(q, qd, digit, n);
return equalbig(seq, q, digit);
}
/* divbig: do n divided by seq
* return the digit of quotient */
int divbig(int *seq, int digit, int *q, int n)
{
int i, r;
for (r = 0, i = digit - 1; i > - 1; i--) {
r = r * 10 + seq[i];
q[i] = r / n;
r %= n;
}
for (i = digit - 1; q[i] == 0 && i > -1; i--)
;
return i + 1;
}
/* mulbig: do q * n */
void mulbig(int *q, int qd, int d, int n)
{
int i;
for (i = 0; i < qd; i++)
q[i] *= n;
/* carry */
for (i = 0; i < d; i++)
if (q[i] > 9) {
q[i + 1] += q[i] / 10;
q[i] %= 10;
}
}
/* equalbig: if seq == q return 0
* else return 1 */
int equalbig(int *seq, int *q, int d)
{
int i;
for (i = 0; i < d; i++)
if (seq[i] != q[i])
return 1;
return 0;
}
/* plusbig: let the highest digit of big to be 1 */
void plusbig(int *seq, int *digit)
{
seq[(*digit)++] = 1;
}
沒有留言:
張貼留言