概述
26.回文数
#include<stdio.h>
int main(){
for(int i=1;i<=9;i++){
for(int j=0;j<=9;j++)
printf("%dn",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("%dn",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("%dn",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("%dn",sum);
}
else if(p==3){
for(int i=x-1;i<y;i++){
if(a[i]>=max)
max=a[i];
}
printf("%dn",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!!!
最后
以上就是含糊项链为你收集整理的每日一练26-37的全部内容,希望文章能够帮你解决每日一练26-37所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复