user-0 提问: 关于进制转换

回复:
user: user-1
content: #include <stdio.h>  int main() { 	int		n, i, res;    //int够用了 	while (scanf("%d", &n) == 1) 	{ 		for (i = 1, res = 1; i <= n; i++) 		{ 			if (i % 7 == 0) 				res *= i / 7; 			else 				res *= i % 7; 			res %= 7; 		}         printf("%d\n", res); 	}     return 0; }

user: user-1
content: 在1~n中，把7的倍数变小，除以7只留商；其余数除以7只留余数。如1~15得 1、2、3、4、5、6、1、1、2、3、4、5、6、2、1……。这些数相乘，每次乘积模7，得结果。

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉

user: user-3
content: 2-9进制都可以转换的程序。  #include <stdio.h> #define N 1024  void trans(int m, int k) {//请在这个函数里面修改你的代码 	int a[N], i; 	for(i = 0; m; i++) 	{ 		a[i] = m % k; 		m /= k; 	} 	i--; 	for(;i>=0;i--) 		printf("%d", a[i]); }  int main() { 	int m, k; 	scanf("%d%d", &m, &k); 	trans(m, k); 	printf("\n"); 	return 0; }

user: user-4
content: 显然能logn多项式做掉。注意到1*2*...*6和11*12*...*16对于最后一位的贡献是相同的。所以把1~n根据7因子个数分成log(n)组，每组计算有多少个1*2*...*6和尾数，然后全部乘起来就是。整个应该能log(n)^2。

user: user-1
content: #include <stdio.h>  int main() { 	int		n, i, t, res; 	while (scanf("%d", &n) == 1) 	{ 		for (i = 1, res = 1; i <= n; i++) 		{ 			t = i; 			while (t % 7 == 0) 				t /= 7; 			res *= t % 7; 			res %= 7; 		}         printf("%d\n", res); 	}     return 0; }

user: user-5
content: #include <stdio.h>  int factorial(int n) {     int num = 1;     if (n <= 1)       return 1;     num = n * factorial(n - 1);      return num; }  int get_num(int n) {     for (;;) {         if (n % 7 == 0)           n = n / 7;         else           return n % 7;     }    }  int main() {     int n, decimal, num;     for (;;) {         printf("Please input: ");         scanf("%d", &n);         decimal = factorial(n);         num = get_num(decimal);         printf("%d\n", num);     }        return 0; }

user: user-6
content: 当n很小的时候，直接计算n!，然后模7，如果等于0，用商继续模7.直到结果不为0，就是后缀第一个不为零的7进制数字 当n很大的时候，采用下面模公式 (a * b) % p = (a % p * b % p) % p  由于求n！中间过程已经完成求模运算，因此a*b最大就是36.可以生成一个大小37的表，进行优化，省去不必要的模运算

user: user-7
content: 常规方法： 1.计算n！，好像也没有什么好的公式，使劲乘呗 2.计算7进制的最后一个非零位：    unsigned int dat;//要计算的数    unsigned int yu;//余     do        {            unsigned int yu=dat%7;            dat=dat/7;        }while(yu==0);        return yu;  当然这题目肯定要通过数学方法改进，要不然n！太大了。