/*求N的阶乘*/
(杭电---------N!)
代码如下:
#include<stdio.h>
#include<string.h>
#define M 10000000//刚开始开了100000结果溢出了
int a[M];
int main()
{
int n,p,h,i,j;
a[1]=1;p=1;h=0;//p表示每次运算时的位数,h表示进位
while(scanf("%d",&n)!=EOF)
{
memset(a,0,sizeof(a));
a[1]=1;p=1;h=0;
if(n==0)
{
printf("1\n");continue;}
for(i=1;i<=n;i++)
{
for(j=1;j<=p;j++)
{
a[j]=a[j]*i+h;
h=a[j]/10;
a[j]=a[j]%10;
}
while(h>0)//进位数可能大于10
{
a[j]=h%10;
h=h/10;
j++;
}
p=j-1;
}
for(i=p;i>=1;i--)
printf("%d",a[i]);
printf("\n");
}
return 0;
}
/*大数与斐波纳切数列*/
/*杭电 ----- -1sting*/
#include<stdio.h>
#include<string.h>
#define M 1000
int num[203][M];//用于大数计算
int len[1000];//记录每一个长度数组对应的输出结果的位数
int main()
{
int n,k,l,i,j;//k表示进位
char b[203];
len[1]=len[2]=1;
memset(num,0,sizeof(num));//二维数组也可以这样清零
num[1][0]=1;
num[2][0]=2;
for(i=3;i<203;i++)
{
k=0;
for(j=0;j<=len[i-1];j++)
{
l=num[i-1][j]+num[i-2][j]+k;
num[i][j]=l%10;
k=l/10;
}
if(num[i][j-1]!=0)
len[i]=len[i-1]+1;
else len[i]=len[i-1];
}
scanf("%d",&n);
getchar();
while(n--)
{
scanf("%s",b);
l=strlen(b);
for(i=len[l]-1;i>=0;i--)/*此处一定要注意 i=len[l]-1 ,因为num数组
是从第零列开始存入数据的 */
printf("%d",num[l][i]);
printf("\n");
}
return 0;
}
/*巧用二维数组模拟了大数相加*/
/*大数求余*/
/*杭电---BigNumber*/
#include<stdio.h>
#include<string.h>
#define M 1000
char a[M+5];
int main()
{
char b[7];
int l1,l2;
int x,y,j,i;
while(scanf("%s%s",a,b)!=EOF)
{
l1=strlen(a);
l2=strlen(b);
if(strcmp(a,b)==0)printf("0\n");
else if(l1<l2||(l1==l2&&strcmp(a,b)<0))printf("%s\n",a);
else
{
j=0;x=0;y=0;
for(i=0;i<l2;i++)
{
y=y*10+b[i]-'0';
}
for(i=0;i<l1;i++)
{
x=x*10+a[i]-'0';
if(x>=y)x=x%y;
}
printf("%d\n",x);
}
}
return 0;
}