每日一练26-37

26.回文数

#include<stdio.h>

int main(){
	for(int i=1;i<=9;i++){
		for(int j=0;j<=9;j++)
		printf("%d\n",i*1000+j*100+j*10+i);
	}
	return 0;
} 

27.特殊回文数  

#include<stdio.h>

int main(){
	int n;
	scanf("%d",&n);
	for(int i=1;i<=9;i++){
		for(int j=0;j<=9;j++)
			for(int m=0;m<=9;m++){
				if((m+i+j)*2==n)
					printf("%d\n",i*100000+j*10000+m*1000+m*100+j*10+i);
			}
	}
	return 0;
} 

29.特殊的数字  153、370、371、407

#include<stdio.h>

int main(){
	for(int i=1;i<=9;i++){
		for(int j=0;j<=9;j++){
			for(int m=0;m<=9;m++){
				if((i*100+j*10+m)==(i*i*i+j*j*j+m*m*m))
				printf("%d\n",i*100+j*10+m);
			}
		}
	}
	return 0;
}

30.查找整数

#include<stdio.h>

int main(){
	int n,x;
	scanf("%d",&n);
	int a[n];
	for(int i=0;i<n;i++)
		scanf("%d",&a[i]);
	scanf("%d",&x);
	for(int i=0;i<n;i++){
		if(a[i]==x){
			printf("%d",i+1);
			break;
		}
		else if(i==n-1&&a[i]!=x)
		printf("-1");	
	}
}

31.操作盒子

#include<stdio.h>

int main(){
	int m,n,p,x,y,max=0,sum;
	scanf("%d %d",&n,&m);
	int a[n];
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
	}
	while(m--){
		scanf("%d %d %d",&p,&x,&y);
		if(p==1){
			a[x-1]=y;	
		}
		else if(p==2){
			sum=0;
			for(int i=x-1;i<y;i++){
				sum+=a[i];
			}
			printf("%d\n",sum);
		}
		else if(p==3){
			for(int i=x-1;i<y;i++){
				if(a[i]>=max)
				max=a[i];
			}
			printf("%d\n",max);
		}
	}
	return 0;
}

32.n阶高精度算法

#include<stdio.h>

int fact(int n){
	if(n==1||n==0)
		return 1;
	else
		return n*fact(n-1);
}
int main(){
	int n;
	scanf("%d",&n);
	printf("%d",fact(n));
	return 0;
}

这种算递归的方法不行,随着结果变大,会溢出,需要定义数组来输出结果。

下面这种算法是看了理解的,为了得出下一个数据,个十百千……倒叙排列,用每一位去乘i,然后用求余得出这一位,下一位则加上除以的结果。要注意的是,要赋初值,因为在过程中f[j]参与运算时需要有一个值,而不是直接被赋值。

#include<stdio.h>
#define N 10000
//1-10000
int main(){
	int f[N],n;
	for(int i=0;i<N;i++)
		f[i]=0;
	scanf("%d",&n);
	f[0]=1;
	for(int i=2;i<=n;i++){
		int c=0;
		for(int j=0;j<N;j++){
			int s=f[j]*i+c;
			f[j]=s%10;
			c=s/10;
		}
	}
	for(int i=N-1;i>=0;i--){
		if(f[i]){
			for(int j=i;j>=0;j--)
				printf("%d",f[j]);
			break;
		}
	} 
	return 0;
}

1.买中性笔 

3月份,sudoku同学开始准备考研了,他需要去商店买n支中性笔,毕竟考研复习要用很多中性笔。

他发现商店一共有3种包装的中性笔,不同包装内的中性笔数量有可能不同,价格也有可能不同。

为了公平起见,sudoku决定只买同一种包装的中性笔。

商店不允许将中性笔的包装拆开,因此sudoku可能需要购买超过n支中性笔。

现在sudoku想知道,在商店每种包装的数量都足够的情况下,要买够至少n支中性笔最少需要花费多少钱。

#include<stdio.h>

int main(){
	int n,cost=0,min=100000000;
	scanf("%d",&n);
	int a[3][2];
	for(int i=0;i<3;i++){
		for(int j=0;j<2;j++){
			scanf("%d",&a[i][j]);
		}
	}
	for(int i=0;i<3;i++){
		if(n%a[i][0]!=0)
			cost=a[i][1]*(n/a[i][0]+1);
		else if(n%a[i][0]==0)
			cost=n/a[i][0]*a[i][1];
		if(cost<min)
		min=cost;
	
	}
	printf("%d",min);
	return 0;
}

2.图书馆,这个题好像还是错了,我觉得很哈皮的是为啥在我自己dec++和计蒜客跑出来结果不一样,我也是很蒙

图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个正整数。每位借书的读者手中有一个需求码,这个需求码也是一个正整数。

如果一本书的图书编码恰好以读者的需求码结尾,那么这本书就是这位读者所需要的。

小明刚刚当上图书馆的管理员,他知道图书馆里所有书的图书编码,他请你帮她写一个程序,

对于每一位读者,求出他所需要的书中图书编码最小的那本书,如果没有他需要的书,请输出−1。

#include<stdio.h>

int main(){
	int n,cost=0,min=100000000;
	scanf("%d",&n);
	int a[3][2];
	for(int i=0;i<3;i++){
		for(int j=0;j<2;j++){
			scanf("%d",&a[i][j]);
		}
	}
	for(int i=0;i<3;i++){
		if(n%a[i][0]!=0)
			cost=a[i][1]*(n/a[i][0]+1);
		else if(n%a[i][0]==0)
			cost=n/a[i][0]*a[i][1];
		if(cost<min)
		min=cost;
	
	}
	printf("%d",min);
	return 0;
}

33.老鼠走迷宫,遍历

#include<stdio.h>
int maze[7][7]={{2,2,2,2,2,2,2},
				{2,0,0,0,0,0,2},
				{2,0,2,0,2,0,2},
				{2,0,0,2,0,2,2},
				{2,2,0,2,0,2,2},
				{2,0,0,0,0,0,2},
				{2,2,2,2,2,2,2}};
int starti=1,startj=1;
int endi=5,endj=5;
int success=0;

int visit(int i,int j){
	maze[i][j]=1;
	if(i==endi&&j==endj)
		success=1;
	if(success!=1&&maze[i][j+1]==0)visit(i,j+1);
	if(success!=1&&maze[i+1][j]==0)visit(i+1,j);
	if(success!=1&&maze[i][j-1]==0)visit(i,j-1);
	if(success!=1&&maze[i-1][j]==0)visit(i-1,j);
	if(success!=1)
		maze[i][j]=0;
	return success;
}

int main(){
	for(int i=0;i<7;i++){
		for(int j=0;j<7;j++){
			if(maze[i][j]==2) printf("▉");
			else printf(" ");
		}
		printf("\n");
	}
	if(visit(starti,startj)==0)
		printf("没有找到出口\n");
	else{
		for(int i=0;i<7;i++){
			for(int j=0;j<7;j++){
				if(maze[i][j]==2) printf("▉");
				else if(maze[i][j]==1)printf("◇");
				else if(maze[i][j]==0)printf(" ");
		}
		printf("\n");
	}
	}
	return 0;
}

34. 待解决

35.数列排序

#include<stdio.h>

int main(){
	int n,temp;
	scanf("%d",&n);
	int a[n];
	for(int i=0;i<n;i++)
		scanf("%d",&a[i]);
	for(int i=0;i<n;i++){
		for(int j=i+1;j<n;j++){
			if(a[j]<a[i]){
				temp=a[i];
				a[i]=a[j];
				a[j]=temp;
			}
		}
	}
	for(int i=0;i<n;i++)
		printf("%d ",a[i]);
	return 0;
}

37.第39台阶

第一种(自上而下),才开始写的是这种,

#include<stdio.h>
int total=0;
int f(int n,int step){
	if(n<0)
		return 0;
	if(n==0&&step%2==0){
		total++;
		return 0;
	}
	f(n-1,step+1);
	f(n-2,step+1);
}
int main(){
	int n;
	scanf("%d",&n);
	f(n,0);
	printf("%d",total);
	return 0;	
}

 算出来少了1,再算结果不少了,奇怪,这上下一样,还是要掌握递归,重要在这两句。

f(n-1,step+1);
f(n-2,step+1);
#include<stdio.h>
int total=0;
int f(int n,int step){
	if(n<0)
		return 0;
	if(n==0&&step%2==0){
		total++;
		return 0;
	}
	f(n-1,step+1);
	f(n-2,step+1);
}
int main(){
	int n;
	scanf("%d",&n);
	f(n,0);
	printf("%d",total);
	return 0;	
}

第二种(自下而上)

#include<stdio.h>
int total=0;
int f(int n,int step,int sum){
	if(sum>n)
		return 0;
	if(n==sum&&step%2==0){
		total++;	
	}
	f(n,step+1,sum+1);
	f(n,step+1,sum+2);
	return total;
}
int main(){
	int n;
	scanf("%d",&n);
	printf("%d",f(n,0,0));
	return 0;	
}

第三种(不用递归)算出来的数据是错误的,不知道问题出在了哪,应该是double的精度还不够,但是也不应该啊,能除尽啊

#include<stdio.h>

int fact(int m,int n){
	double a=1,b=1,c=1;
	for(int i=m+n;i>0;i--)
		a=a*i;
	for(int i=m;i>0;i--)
		b=b*m;
	for(int i=n;i>0;i--)
		c=c*i;
	return a/(b*c);	
}
int main(){
	int n;
	int sum=0;
	scanf("%d",&n);
	for(int i=0;i<=n;i++){
		for(int j=0;j<=n/2;j++){
			if((i+j)%2==0&&(i+j*2)==n){
				sum+=fact(i,j);
			}		
		}
	}
	printf("%d",sum);
	return 0;	
}

第四种(原本想的是这一种,但是没有想透彻,f[n]=f[n-1]+f[n-2]是不区分左右脚的情况)

#include<stdio.h>

int f(int n);
int g(int n);
int main(){
	int n;
	scanf("%d",&n);
	printf("%d",f(n));
	return 0;
}
int f(int n){//必须是偶数步 
	if(n==2)
		return 1;
	else if(n==0||n==1) return 0;
	else
	return g(n-1)+g(n-2); 
}
int g(int n){//必须是奇数步 
	if(n==1||n==2||n==3)
		return 1;
	else
	return f(n-1)+f(n-2);
} 

现在是有一个25三色旗没弄明白 、34逆序对、还有一个图书馆,意识到定义数据类型真的很重要,会直接影响数据对错,比如说图书馆,数据太大,int就不够,还有39个楼梯第三种方法阶乘里float、double结果不一样,apply myself!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值