c++ - Apakah prinsip operasi faktorial berketepatan tinggi ini?
黄舟
黄舟 2017-05-16 13:28:11
0
3
737
#include <iostream>
#include <string.h>
#include <stdio.h> 
using namespace std;
const int max=3000;
int f[3000];
int main()
{ 
    int i,j,n;
    scanf("%d",&n);
    memset(f,0,sizeof(f));
    f[0]=1;
    for(i=2;i<=n;i++)            //从i乘到n 
    {
        int c=0;
        for(j=0;j<3000;j++)     //每一位在乘法时的调整 
        {
            int s=f[j]*i+c;     
            f[j]=s%10;
            c=s/10;
        }
    }
    for(j=3000-1;j>=0;j--)              
    if(f[j]) break;
    for(i=j;i>=0;i--)
    cout<<f[i];
    
     
        return 0;
}

Saya ingin menulis komen untuk membantu diri saya memahami, tetapi saya tidak boleh terus menulis separuh jalan. Mengapa tiga baris di tengah untuk ditulis seperti itu?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

membalas semua(3)
習慣沉默

Nampaknya hanya pengiraan pendaraban menegak biasa, tiada apa yang perlu diperkatakan

左手右手慢动作
#include <iostream>
#include <string.h>
#include <stdio.h> 
using namespace std;
const int maxn = 3000;//3000意指结果最多含3000个数字
int f[maxn];//结果存储器.下标大的元素对应结果的高位.即f[0]对应结果的个位.
//每次运行,f[]的每个元素初始值都是0.
//这里为了便于理解修改成了maxn,且避免与<algorithm>以及<cmath>库中的同名函数重复.
int main()
{ 
    //初始化开始
    int i,j,n;
    scanf("%d",&n);
    f[0]=1;
    //memset(f,0,sizeof(f)); //f声明在main外头,初始值都为0,不需要memset
    //初始化结束

    //开始计算阶乘
    for(i=2;i<=n;i++)//从2乘到n.
    {
        int c=0;//进位存储器.
        for(j=0;j<maxn;j++)//每一位都乘个i.
        {
            int s=f[j]*i+c;//f[j]是当前被乘i的那一位上的数字,"+c"是进位;s的值最大是9*9=81,最小是0,不会超过两位数
            f[j]=s%10;//模10,意在取计算结果个位上的数字,赋值给f[j]
            c=s/10;//除10,意在取十位上数字.
            //若无十位上的数字,则c为0;因为c++中,整型除法向0取整(理解起来等价于舍去小数部分),如9/10=0;
        }
    }
    //计算结束

    //输出开始
    for(j=maxn-1;j>=0;j--)              
        if(f[j]) break;
    for(i=j;i>=0;i--)
        cout<<f[i];
        /*这两句的意思很简单,假设f[]是这样的:(这边是f[2999]->)0000000...(省略若干个0)...00123123123(<-f[0]在这边)
         *先从高位开始往低位找,找到第一个不为零的数字,记下标为j,
         *然后再从j到0依次输出f[]中每一位的值
         */

    //输出结束
    return 0;
}

给我你的怀抱

Oleh kerana pendaraban akan melebihi int atau panjang panjang, ketepatan tinggi diperlukan.
Idea ketepatan tinggi ialah menggunakan tatasusunan untuk menyimpan setiap digit nombor, dan kemudian mensimulasikan kaedah pendaraban menegak bagi pengiraan pendaraban manusia.
Anda boleh mempertimbangkan cara mengira tatasusunan a dengan panjang n darab nombor x, dengan mengandaikan bahawa a disimpan dari rendah ke tinggi (contohnya, nombor 12345, tatasusunan ialah a[1]=5,a[2]= 4,a [3]=3,a[4]=2,a[5]=1).
Pertama sekali, semua orang ialah [1]x%10, tetapi apakah digit sepuluh Ia sepatutnya (a[2]x+bawaan digit sebelumnya)%10
Jadi di sini, c mewakili bawaan? daripada digit sebelumnya , f[j] mewakili bit ke-j bagi (i-1) sebelum menggelung ke j, dan selepas menggelung ke j, ia mewakili bit ke-j bagi i!.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan