高精度
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
国内:
北京大学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/