关于进制转换

风云诀 2014-04-17 10:43:29
对于给定正整数n,将n!转换为7进制后,输出这串数字的最后一个非零项。
其中n!=1*2*3…*n。
若n=7,n!=1*2*3…*7=5040(十进制)=20460(七进制)。对于20460这串数字最后一个非零项为6,所以输出6。
输入:
多组输入数据,每组数组给出一个整数n。(1<=n<=1000,000,000.)
输出:
对于每一个n,输出答案。
样例输入:
7
10
样例输出:
6
1


这个应该怎么用C实现呢?
...全文
200 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
wang0635 2014-04-18
  • 打赏
  • 举报
回复
#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;
}
wang0635 2014-04-18
  • 打赏
  • 举报
回复
在1~n中,把7的倍数变小,除以7只留商;其余数除以7只留余数。如1~15得 1、2、3、4、5、6、1、1、2、3、4、5、6、2、1……。这些数相乘,每次乘积模7,得结果。
赵4老师 2014-04-18
  • 打赏
  • 举报
回复
#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汉
  • 打赏
  • 举报
回复
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;
}

FancyMouse 2014-04-18
  • 打赏
  • 举报
回复
显然能logn多项式做掉。注意到1*2*...*6和11*12*...*16对于最后一位的贡献是相同的。所以把1~n根据7因子个数分成log(n)组,每组计算有多少个1*2*...*6和尾数,然后全部乘起来就是。整个应该能log(n)^2。
wang0635 2014-04-18
  • 打赏
  • 举报
回复
#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;
}
??Pao? 2014-04-18
  • 打赏
  • 举报
回复

#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;
}
一根烂笔头 2014-04-18
  • 打赏
  • 举报
回复
当n很小的时候,直接计算n!,然后模7,如果等于0,用商继续模7.直到结果不为0,就是后缀第一个不为零的7进制数字 当n很大的时候,采用下面模公式 (a * b) % p = (a % p * b % p) % p 由于求n!中间过程已经完成求模运算,因此a*b最大就是36.可以生成一个大小37的表,进行优化,省去不必要的模运算
PDD123 2014-04-17
  • 打赏
  • 举报
回复
常规方法: 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!太大了。

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧