1、大数乘法关于数字的阶乘
#include
#include
using namespace std;
const int maxn=5000;
int b[maxn];//´æ½á¹û
int main()
{
int n;
cin>>n;
b[0]=1;
int i,j,s;
for(i=2;i<=n;i++)
{
int c=0;
for(j=0;j<=maxn;j++)
{
s=b[j]*i+c;
b[j]=s%10;
c=s/10;
}
}
//处理多余的0
for(i=maxn;i>=0;i–)
{
if(b[i])
break;
}
//倒序输出
for(j=i;j>=0;j–)
{
cout<<b[j];
}
cout<<endl;
}
2、大数字相加杭电1250
注意把它定义成二维字符串数组来存储
#include
#include
using namespace std;
string add(string a,string b)
{
string max,min;
max=a;min=b;
if(a.length()<b.length())
{
max=b;min=a;
}
int lmax,lmin,l;
lmax=max.size();
lmin=min.size();
l=lmax-1;
for(int i=lmin-1;i>=0;–i)
{
max[l–]+=min[i]-‘0’;
}
for(int j=lmax-1;j>=1;j–)
{
if(max[j]>‘9’)
{
max[j]-=10;
max[j-1]++;
}
}
if(max[0]>‘9’)
{
max[0]-=10;
max=‘1’+max;
}
return max;
}
int main()
{
string f[8000];
f[1]="1";f[2]="1";f[3]="1";f[4]="1";
for(int i=5;i<8000;++i)
{
f[i]=add(add(add(f[i-1],f[i-2]),f[i-3]),f[i-4]);
}
int n;
while(cin>>n)
cout<<f[n]<<endl;
return 0;
}
3、大数相乘模板
#include
#include
#include
using namespace std;
int main()
{
char a1[100],b1[100];
int a[100],b[100],c[100],lena,lenb,lenc,i,j,x;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof©);
scanf("%s %s",a1,b1);
lena=strlen(a1);lenb=strlen(b1);
for (i=0;i<=lena-1;i++) a[lena-i]=a1[i]-48;
for (i=0;i<=lenb-1;i++) b[lenb-i]=b1[i]-48;
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) //删除前导0
lenc–;
for (i=lenc;i>=1;i–)
cout<<c[i];
cout<<endl;
return 0;
}
4、大数除法和求模
#include
#include
#include
#include
char num1[111], num2[111];
char num3[111];
int d, b = 0;
using namespace std;
int main(){
int i;
int len1;
printf(“被除数 = “);
scanf(”%s”,num1);
printf(“除数 = “);
scanf(”%d”,&d);
len1 = strlen(num1);
for(i = 0; i < len1; i++){
b = b * 10 + num1[i] - ‘0’;
num3[i] = b / d + ‘0’;
b = b % d;
}
i = 0;
while(num3[i] == ‘0’)
i++;
printf(“商 = “);
for( ; i < len1; i++){
printf(”%c”,num3[i]);
}
printf("\n");
printf(“余数 = “);
printf(”%d\n”,b);
return 0;
}
5、大数相加模板
#include
#include
using namespace std;
string add(string a,string b)
{
string max,min;
max=a;min=b;
if(a.length()<b.length())
{
max=b;min=a;
}
int lmax,lmin,l;
lmax=max.size();
lmin=min.size();
l=lmax-1;
for(int i=lmin-1;i>=0;–i)
{
max[l–]+=min[i]-‘0’;
}
for(int j=lmax-1;j>=1;j–)
{
if(max[j]>‘9’)
{
max[j]-=10;
max[j-1]++;
}
}
if(max[0]>‘9’)
{
max[0]-=10;
max=‘1’+max;
}
return max;
}
int main()
{
string s1,s2;
cin>>s1>>s2;
cout<<add(s1,s2)<<endl;
}
6、回文数
【问题描述】
若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 10进制数 56,将 56加 65(即把56从右向左读),得到 121是一个回文数。又如,对于10进制数87,
STEPl: 87+78= 165 STEP2: 165+561= 726 STEP3:726+627=1353 STEP4:1353+3531=4884 在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。
写一个程序,给定一个N(2<N<=10或N=16)进制数 M.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible”
【输入样例】:9 87
【输出样例】:6
【算法分析】
N进制运算
1、当前位规范由%10改为% n
2、进位处理由/10改为/n
3、其他运算规则不变
#include
#include
using namespace std;
int n,a[101],b[101],ans,i;
void init(int a[]) //将数串s转化为整数数组a
{
string s;
cin>>n>>s; //读入字符串s
memset(a,0,sizeof(a)); //数组a清0
a[0]=s.length(); //用a[0]计算字符串s的位数
for(i=1;i<=a[0];i++)
if(s[a[0]-i]>=‘0’&&s[a[0]-i]<=‘9’) a[i]=s[a[0]-i]-‘0’;
else a[i]=s[a[0]-i]-‘A’+10;
}
bool check(int a[]) //判别整数数组a是否为回文数
{
for(i=1;i<=a[0];i++)
if(a[i]!=a[a[0]-i+1])return false;
return true;
}
void jia(int a[]) //整数数组a与其反序数b进行n进制加法运算
{
for(int i=1;i<=a[0];i++)b[i]=a[a[0]-i+1]; //反序数b
for(int i=1;i<=a[0];i++) a[i]+=b[i]; //逐位相加
for(int i=1;i<=a[0];i++) //处理进位
{
a[i+1]+=a[i]/n;
a[i]%=n;
}
if(a[a[0]+1]>0) a[0]++; //修正新的a的位数(a+b最多只能的一个进位)
}
int main()
{ init(a);
if(check(a)){cout<<0<<endl;return 0;}
ans=0; //步数初始化为0
while(ans++<=30)
{ jia(a);
if(check(a)){cout<<ans<<endl;return 0;}
}
cout<<“Impossible”; //输出无解信息
return 0;
}
7、求阶乘后面0的个数
顾名思义,0是由5和2相乘得到的,所以只要求5的个数就可以
#include
#include
using namespace std;
int main()
{
long long n;int cnt=0;
while(cin>>n)
{
cnt=0;
while(n>=5)//小于5的时候没有0
{
n=n/5;
cnt=cnt+n;
}
cout<<cnt<<endl;
}
}