高精度

1. 高精度求n的阶乘(ni)

题解:

#include<bits/stdc++.h>
#define MAX 1000000+5 
using namespace std;
 
int a[MAX];
int main()
	{
		int n;
		scanf("%d",&n);
		int carry,cnt = 0;
		a[0] = 1;//别忘记初始化 
		for(int i = 2; i <= n; ++i){
			carry = 0;
			for(int j = 0; j <= cnt; ++j){
				a[j] = a[j]*i+carry; // 模拟 手算每次 先乘 后加上进位(而不是加上进位后乘) 
				carry = a[j]/10000;
				a[j] %= 10000;
			}
			if(carry)//注意 如果 最后有进位的情况 
				a[++cnt] = carry;
		}
		//输出要注意每组是4位(最高的一组单独处理) 其余的需要考虑0的情况输出 
		printf("%d",a[cnt]);
		for(int i = cnt-1; i >= 0; --i){
			printf("%04d",a[i]);
		}
		
		
		return 0;	
	} 

https://blog.csdn.net/Tianweidadada/article/details/80034492

A/B的高精度值(ab)

#include<stdio.h>
int main()
{
   int a,b,i,j,t,c[21];
   scanf("%d",&t);
   while(t--)
   {
      scanf("%d%d",&a,&b);
      printf("%d/%d=%d.",a,b,a/b);
      for(i=0;i<20;i++)
        {
           a=(a%b)*10;  // 除法运算基本公式 
           c[i]=a/b;
        }
      while(i--)if(c[i])break;  // 保证后面不为零 
      printf("%d",c[0]);  // 至少保留一个零 
      for(j=1;j<=i;j++)
        printf("%d",c[j]);
      printf("\n");
   }
   return 0;
}

https://blog.csdn.net/u014760201/article/details/38844529

3.求n累加和(ja)

#include<iostream>
using namespace std;
#define MAX_LENGTH 1000
int a[MAX_LENGTH];
 
int main(){
    int n;
    cin>>n;
    int digit=1,x;
    for(int i=1;i<=n;i++){
        x=0;
        for(int j=0;j<digit;j++){
            if(j==0){
                a[j]=a[j]+i+x;
                x=a[j]/10;
                a[j]=a[j]%10;
            }
            else{
                a[j]=a[j]+x;
                x=a[j]/10;
                a[j]=a[j]%10;
            }
         }
            if(x>0)
                a[digit++]=x;
 
    }
 
    for(int i=digit-1;i>=0;i--)
      cout<<a[i];
}

https://blog.csdn.net/qq873044564/article/details/88932144

4.阶乘和(sum)

#include <bits/stdc++.h>
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=10000;
int main()
{
    int n,k,i,j,t;
    while(cin>>n){
        int a[maxn]={},sum[maxn]={};
        sum[0]=0;
        k=1,t=1;
        for(int e=1;e<=n;e++){
            a[0]=1;
            for(i=1;i<=e;i++){
                for(j=0;j<k;j++){    
                    a[j]=a[j]*i;        
                }
                for(j=0;j<k;j++){
                    if(a[j]>=10){
                        a[j+1]+=a[j]/10;
                        a[j]=a[j]%10;
                        if(j==k-1) k++; 
                         
                    }       
                }
            }
            for(int p=0;p<k;p++){
                sum[p]=sum[p]+a[p];
            }   
            for(int p=0;p<t;p++){
                if(sum[p+1]>=10){
                    t++;
                }
                if(sum[p]>=10){
                    sum[p+1]+=sum[p]/10;
                    sum[p]=sum[p]%10;
                }       
            }
            for(int q=1;q<k;q++){
                a[q]=0;
            }
        }
        for(i=k-1;i>=0;i--){
            cout<<sum[i]<<"";
        }
        cout<<endl;
    }
}

https://blog.csdn.net/zwu_2017010405/article/details/81226826

5.高精度求积(multiply)

题目描述

#include <bits/stdc++.h>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
    char a1[100],b1[100];
    int a[100],b[100],c[205],lena,lenb,lenc,i,j,x;
 
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
 
    scanf("%s%s",a1,b1);
    
    lena=strlen(a1);lenb=strlen(b1);
    for(i=0;i<=lena-1;i++) a[lena-i]=a1[i]-'0';
    for(i=0;i<=lenb-1;i++) b[lenb-i]=b1[i]-'0';
    for(i=1;i<=lena;i++)
    {
        x=0;
        for(j=1;j<=lenb;j++)
        {
            c[i+j-1]=a[i]*b[j]+x+c[i+j-1];
            x=c[i+j-1]/10;
            c[i+j-1]%=10;
        }
        c[i+lenb]=x;
    }
    lenc=lena+lenb;
    while(c[lenc]==0&&lenc>1)
        lenc--;
    for(i=lenc;i>=1;i--)
    {
        cout<<c[i];
    }
    return 0;
}

https://blog.csdn.net/h2017010687/article/details/81260537

6.天使的起誓(yubikili)

题面

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    int n;
    char s[10009];
    int a[10009];
    while(cin>>n>>s)
    {
        memset(a,0,sizeof a);
        int len=strlen(s);
       for(int i=0;i<len;i++)
        a[i]=s[i]-'0';
        int x=0;//储存余数
        for(int i=0;i<len;i++)
         x=(x*10+a[i])%n;//取余式
       if(x==0) cout<<n<<endl;
       else cout<<x<<endl;
    }
    return 0;
}

https://blog.csdn.net/davenny/article/details/54342244

7.Haoni双塔问题(Noip2007)

#include <iostream> 
#include <cstdio> 
using namespace std;    
int n,c,a[22],i,j;    
int main()    
{    
    cin>>n;    
    a[1]=2;                
    for(i=2;i<=n;i++)        
    {    
        c=0;                     
        for(j=1;j<=20;j++)        
        {    
            a[j]=a[j]*2+c;        
            if(j==1)   
               a[j]+=2;      
            c=a[j]/10000;         
            a[j]%=10000;          
        }    
    }    
    i=20;    
    while(i>1&&!a[i])   
          i--;     
    cout<<a[i];                   
    while(--i)    
          printf("%04d",a[i]);     
    cout<<endl;    
    return 0;    
}

https://blog.csdn.net/zjy2015302395/article/details/54628895
https://blog.csdn.net/zsjzliziyang/article/details/86602273

2017ACM/ICPC 解析(***立大学): https://www.youtube.com/watch?v=66PKEENd4ZU

国内:

浙江大学 http://acm.zju.edu.cn/

北京大学ACM网址:http://acm.pku.edu.cn
哈尔宾工业大学ACM网址:http://acm.hit.edu.cn
南京理工大学: http://icpc.njust.edu.cn

国外:

USACO:http://ace.delos.com/usacogate/
西班牙网站http://acm.uva.es
俄罗斯站点http://acm.timus.ru

讨论区

武汉大学、北京大学、南京大学、上海交大、中山大学BBS的ACM/ICPC讨论区
ICPC官方网站:http://icpc.baylor.edu/icpc/