第三周学习笔记

递归应用:上楼梯,一次可以上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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值