高精度 万进制

时间:2021-09-03 03:35:09
亲的们~~~~高精度 万进制 怎么用哈

#############################################
N!读为N的阶乘,这里的N是非负的,例如: 
 
你的任务就是写一个程序计算出给出的数的阶乘结果的最后一位非0数字 (0

Input 

输入数据包含一个或几个非整数且不会大于10000,每个数字占有独立的一行.对于每个N,读入N,并计算出N!的最后一位不为0的数字。

Output 

对于每个输入数字,你的输出要单独占一行.每行先输出N占5个字符,且靠右对齐.然后输出” -> “最后输出N!的最后一位不为0的数字。

###############################
如果输入的数很大了 十进制就不行了~~求万进制 解法~~~~~~~~~~~~~~~~~~~

15 个解决方案

#1


网上有高精度阶乘算法啊。在输出时加上最后一位非0的判断即可。
#include <stdio.h>
#define N 5000 // modify it to hold larger number
int main(void) {

    int n, i, j, s, up, f[N] = {0};
    scanf("%d", &n);

    for (i = 2, f[0] = 1; i <= n; i++)
        for (j = up = 0; j < N; j++) {
            s = f[j] * i + up;
            f[j] = s % 10;
            up = s / 10;
        }
    for (i = N-1; f[i] == 0; i--) ;
    for (; i >= 0; i--) printf("%d", f[i]) ;
    printf("\n");
    return 0;

}

#2


所谓万进制就是每位数字的范围为0000..9999
比如两位万进制数(1234)(5678)对应十进制数(1234)*10000+(5678)==12345678

#3


引用 1 楼 ljljlj 的回复:
网上有高精度阶乘算法啊。在输出时加上最后一位非0的判断即可。
C/C++ code
#include <stdio.h>
#define N 5000 // modify it to hold larger number
int main(void) {

    int n, i, j, s, up, f[N] = {0};
    scanf("%d", &amp;n);

    fo……


求N!的最后一位非零的数字,不需要求N!的具体值....

int main(void) {
    int n, val;
    scanf("%d", &n);
    if(n<1)
    {
        printf("Input Number Error\n");
        return 0;
    }
    val = 1;
    for(int i = 2; i <= n; i++)
    {
        val *= i;
        while(val%10 == 0)  //去掉val后面的0
           val /= 10; 
        val %= 100; // 只保留 最后2位非零数字即可,前面的数字统统丢掉。
    }

    printf("%d", val%10); 输出val的个位数字,就是N!的最后一位非0数字。
    printf("\n");
    return 0;
}

#4


3楼做得太精妙了,其实我也是按你的路子搞了3个小时,始终有误,看了你的代码发现你是取2位有效数字,而我只取了1位.汗颜啊.

#5


引用 4 楼 ljljlj 的回复:
3楼做得太精妙了,其实我也是按你的路子搞了3个小时,始终有误,看了你的代码发现你是取2位有效数字,而我只取了1位.汗颜啊.


之所以取2位有效数字是因为:
14 * 5 = 70
24 * 5 = 120

虽然被乘数都是以4结尾,但是乘以5以后一个编程7,一个变成2了。

#6


该回复于2011-07-30 15:08:11被版主删除

#7


该回复于2011-07-30 15:04:05被版主删除

#8


引用 5 楼 zhangxfeng112 的回复:
引用 4 楼 ljljlj 的回复:

3楼做得太精妙了,其实我也是按你的路子搞了3个小时,始终有误,看了你的代码发现你是取2位有效数字,而我只取了1位.汗颜啊.


之所以取2位有效数字是因为:
14 * 5 = 70
24 * 5 = 120

虽然被乘数都是以4结尾,但是乘以5以后一个编程7,一个变成2了。


佩服!

#9


玛雅文明 是 20进制

#10


学习 一个 语言 是学习一种 文化,

学习 一个 算法 是学习一种 文明,

#11


学习了。

#12


应该说val=%100只能保证100以内的阶乘数的最后非零数计算正确
譬如125*8=1000,应为1;若保留两位则是25*8=200,为2;若保留一位则是5*8=40,为4.后两种都是错误的。
针对N<5000,应该保留三位吧!    还有前面例子应该是25*4=100出现问题。
      这些都是我们专业的牛人搞出来的!

#13


不对应该保留五位。见高手分析:这显然不对,x5 * 8就不一定是x40了,受了x的最后一位的影响
就拿你这个来说,5000*4999*4998=124925010000
还是说这个例子,记录下后面有4个0,中间结果就需要5位,正确的算法是
5000*4999=95000
95000*4998=10000
要预先算好有多少个0,然后取相应位数。当然在中间计算时末尾的0可以省掉,直接算95*4998=74810

#14


为什么不用Python语言直接算N!呢?

#15


引用 13 楼 javkburd 的回复:
不对应该保留五位。见高手分析:这显然不对,x5 * 8就不一定是x40了,受了x的最后一位的影响
就拿你这个来说,5000*4999*4998=124925010000
还是说这个例子,记录下后面有4个0,中间结果就需要5位,正确的算法是
5000*4999=95000
95000*4998=10000
要预先算好有多少个0,然后取相应位数。当然在中间计算时末尾的0可以省掉,直接算95……

178125 *128=22800000
278125 *128=35600000

#1


网上有高精度阶乘算法啊。在输出时加上最后一位非0的判断即可。
#include <stdio.h>
#define N 5000 // modify it to hold larger number
int main(void) {

    int n, i, j, s, up, f[N] = {0};
    scanf("%d", &n);

    for (i = 2, f[0] = 1; i <= n; i++)
        for (j = up = 0; j < N; j++) {
            s = f[j] * i + up;
            f[j] = s % 10;
            up = s / 10;
        }
    for (i = N-1; f[i] == 0; i--) ;
    for (; i >= 0; i--) printf("%d", f[i]) ;
    printf("\n");
    return 0;

}

#2


所谓万进制就是每位数字的范围为0000..9999
比如两位万进制数(1234)(5678)对应十进制数(1234)*10000+(5678)==12345678

#3


引用 1 楼 ljljlj 的回复:
网上有高精度阶乘算法啊。在输出时加上最后一位非0的判断即可。
C/C++ code
#include <stdio.h>
#define N 5000 // modify it to hold larger number
int main(void) {

    int n, i, j, s, up, f[N] = {0};
    scanf("%d", &amp;n);

    fo……


求N!的最后一位非零的数字,不需要求N!的具体值....

int main(void) {
    int n, val;
    scanf("%d", &n);
    if(n<1)
    {
        printf("Input Number Error\n");
        return 0;
    }
    val = 1;
    for(int i = 2; i <= n; i++)
    {
        val *= i;
        while(val%10 == 0)  //去掉val后面的0
           val /= 10; 
        val %= 100; // 只保留 最后2位非零数字即可,前面的数字统统丢掉。
    }

    printf("%d", val%10); 输出val的个位数字,就是N!的最后一位非0数字。
    printf("\n");
    return 0;
}

#4


3楼做得太精妙了,其实我也是按你的路子搞了3个小时,始终有误,看了你的代码发现你是取2位有效数字,而我只取了1位.汗颜啊.

#5


引用 4 楼 ljljlj 的回复:
3楼做得太精妙了,其实我也是按你的路子搞了3个小时,始终有误,看了你的代码发现你是取2位有效数字,而我只取了1位.汗颜啊.


之所以取2位有效数字是因为:
14 * 5 = 70
24 * 5 = 120

虽然被乘数都是以4结尾,但是乘以5以后一个编程7,一个变成2了。

#6


该回复于2011-07-30 15:08:11被版主删除

#7


该回复于2011-07-30 15:04:05被版主删除

#8


引用 5 楼 zhangxfeng112 的回复:
引用 4 楼 ljljlj 的回复:

3楼做得太精妙了,其实我也是按你的路子搞了3个小时,始终有误,看了你的代码发现你是取2位有效数字,而我只取了1位.汗颜啊.


之所以取2位有效数字是因为:
14 * 5 = 70
24 * 5 = 120

虽然被乘数都是以4结尾,但是乘以5以后一个编程7,一个变成2了。


佩服!

#9


玛雅文明 是 20进制

#10


学习 一个 语言 是学习一种 文化,

学习 一个 算法 是学习一种 文明,

#11


学习了。

#12


应该说val=%100只能保证100以内的阶乘数的最后非零数计算正确
譬如125*8=1000,应为1;若保留两位则是25*8=200,为2;若保留一位则是5*8=40,为4.后两种都是错误的。
针对N<5000,应该保留三位吧!    还有前面例子应该是25*4=100出现问题。
      这些都是我们专业的牛人搞出来的!

#13


不对应该保留五位。见高手分析:这显然不对,x5 * 8就不一定是x40了,受了x的最后一位的影响
就拿你这个来说,5000*4999*4998=124925010000
还是说这个例子,记录下后面有4个0,中间结果就需要5位,正确的算法是
5000*4999=95000
95000*4998=10000
要预先算好有多少个0,然后取相应位数。当然在中间计算时末尾的0可以省掉,直接算95*4998=74810

#14


为什么不用Python语言直接算N!呢?

#15


引用 13 楼 javkburd 的回复:
不对应该保留五位。见高手分析:这显然不对,x5 * 8就不一定是x40了,受了x的最后一位的影响
就拿你这个来说,5000*4999*4998=124925010000
还是说这个例子,记录下后面有4个0,中间结果就需要5位,正确的算法是
5000*4999=95000
95000*4998=10000
要预先算好有多少个0,然后取相应位数。当然在中间计算时末尾的0可以省掉,直接算95……

178125 *128=22800000
278125 *128=35600000