递归应用:上楼梯,一次可以上1或2或3层,共有n层,则共有多少方法上楼梯?
代码如下:
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
int pa(int n);
int d;
d=pa(n);
printf("%d",d);
return 0;
}
int pa(int n)
{
if(n==1)
return 1;
else if(n==2)
return 2;
else if(n==3)
return 4;
else
return(pa(n-1)+pa(n-2)+pa(n-3));
}
三连击:
题目背景
本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。
题目描述
将 1, 2, \ldots , 91,2,…,9 共 99 个数分成 33 组,分别组成 33 个三位数,且使这 33 个三位数构成 1 : 2 : 31:2:3 的比例,试求出所有满足条件的 33 个三位数。
输入格式
无
输出格式
若干行,每行 33 个数字。按照每行第 11 个数字升序排列。
#include<stdio.h>
#include<string.h>
int a[10]={0};
void intal(int x)
{
int o;
o=x/100;
a[o]++;
o=x%10;
a[o]++;
x/=10;
o=x%10;
a[o]++;
}
int main()
{
int i,j,k;
int n,count=0,m;
for(i=123;i<=329;i++)
{
j=2*i;
k=3*i;
intal(i);
intal(j);
intal(k);
for(n=1;n<=9;n++)
{
if(a[n]==1)
count++;
if(count==9)
{
printf("%d %d %d\n",i,j,k);
}
}
count = 0;
for(m=1;m<=9;m++)
a[m]=0;
}
return 0;
}
高精度算法
简易高精度加法的代码
#include<stdio.h>
#include<string.h>
int max(int x,int y)
{
return x>y?x:y;
}
int main()
{
char a[505],b[505];
scanf("%s %s",a,b);
int x,y,c[505]={0},d[505]={0},i;
int j,k;
x=strlen(a);
j=x;
y=strlen(b);
k=y;
//printf("%d %d",j,k);
while(x>0)
{
a[x-1]-='0';
c[i]=a[x-1];
x--;
i++;
}
i=0;
while(y>0)
{
b[y-1]-='0';
d[i]=b[y-1];
y--;
i++;
}
j-=1;
k-=1;
for(i=0;i<=max(j,k);i++)
{
c[i]+=d[i];
if(c[i]>=10)
{
c[i]-=10;
c[i+1]++;
}
}
if(c[i]==0)
i--;
for(i;i>=0;i--)
printf("%d",c[i]);
}
其中核心算法也可以这样写
c[i]+=d[i];
c[i+1]=c[i]/10;
c[i]%=10;
高精度减法核心代码:
if(a[i]<b[i])
{
a[i+1]--;
a[i]+=10;
}
c[i]=a[i]+b[i];//首先要被减数大于减数即结果为正
完整代码如下
#include<stdio.h>
#include<string.h>
char s1[10090],s2[10090],s3[10090];
int a[10090]={0},b[10090]={0},c[10090]={0};
int f=1;
int main()
{
int i=0;
scanf("%s %s",s1,s2);
int j=strlen(s1),k=strlen(s2);
if(j<k)
{
f=-1;
strcpy(s3,s1);
strcpy(s1,s2);
strcpy(s2,s3);
}//交换大减小
j=strlen(s1);k=strlen(s2);
while(j>0)
{
s1[j-1]-='0';
a[i]=s1[j-1];
j--;
i++;
}
i=0;
while(k>0)
{
s2[k-1]-='0';
b[i]=s2[k-1];
k--;
i++;
}//转变数字倒序存入
j=strlen(s1);k=strlen(s2);
for(i=0;i<j-1;i++)
{
if(a[i]<b[i])
{
a[i+1]--;
a[i]+=10;
}
c[i]=a[i]-b[i];
}
if(a[i]<b[i])
{
c[i]=b[i]-a[i];
f=-1;
}
if(c[i]==0)
i--;
if(f==-1)
printf("-");
for(i;i>=0;i--)
printf("%d",c[i]);
return 0;
}
这段代码在计算相同位数的小减去大时没有进行交换,会出现错误,因为刚开始的判断不准确,改进如下
#include<stdio.h>
#include<string.h>
char s1[10090]={0},s2[10090]={0},s3[10090]={0};
int a[10090]={0},b[10090]={0},c[10090]={0};
int f=1;
int main()
{
int i=0;
int p,q;
scanf("%s %s",s1,s2);
int j=strlen(s1),k=strlen(s2);
if(j<k)
{
f=-1;
strcpy(s3,s1);
strcpy(s1,s2);
strcpy(s2,s3);
}
if(j==k)
{
if(s1[j-1]<s2[j-1])
{
f=-1;
strcpy(s3,s1);
strcpy(s1,s2);
strcpy(s2,s3);
}
}
j=strlen(s1),k=strlen(s2);
p=j;q=k;
while(j>0)
{
s1[j-1]-='0';
a[i]=s1[j-1];
j--;
i++;
}
i=0;
while(k>0)
{
s2[k-1]-='0';
b[i]=s2[k-1];
k--;
i++;
}//转变数字倒序存入
for(i=0;i<p;i++)
{
if(a[i]<b[i])
{
a[i+1]--;
a[i]+=10;
}
c[i]=a[i]-b[i];
}
while(c[i]==0&&i>0)
i--;
if(f==-1)
printf("-");
for(i;i>=0;i--)
printf("%d",c[i]);
return 0;
}