2020-11-21

标题 找子串

题目: 计算字符串中子串出现的次数。
要求:用一个子函数substring()实现,参数为指向字符串和要查找的子串的指针,返回次数。
#include<stdio.h>
int substring(char str1[],char str2[])
{
int sum=0;
char *p,*q;
p=str1;
q=str2;
while(*p!=’\0’)
{
if(*p==*q)
{
while(*p==*q&&*q!=’\0’)
{
p++;
q++;
}
}
else
p++;
if(q==’\0’)
sum++;
q=str2;
}
return sum;
}
int main(void)
{
char a[20],b[20];
scanf("%s%s",a,b);
printf("%d",substring(a,b));
return 0;
}
**刚开始写的时候给substring函数的形参放的是两个字符指针,就说值传不进去,下边实参对应的是两个数组的首地址,实参和形参要相互对应,不然会报错。
通过
指针的加减来对应字符串和子串中的每一个字符来判断子串出现的次数,子串出现’\0’就再循环重新判断一次。字符串到\0就跳出循环,返回次数sum。函数有返回值时主函数要有printf才能输出返回值

标题 围圈数数

题目:有n个人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡是报到3的人退出圈子。
问最后留下的是原来第几号的那位。
#include<stdio.h>
int main(void)
{
int n;
scanf("%d",&n);//先输入人数
int a[n+1],i,k,t=0;
k=n;
for(i=1;i<=n;i++)
{
a[i]=1;//有人代表是1
}
for(i=1;;i++)//惊奇的发现判断的限制条件可以不写;不过后面必须有break,不然死循环
{
if(in+1)//转过一圈后从第一个人重新开始数
i=1;
if(a[i]!=0)
t++;
else
continue;
if(t%3
0)
{
a[i]=0;
k–;
}
if(k==1)
break;//跳出循环
}
for(i=1;i<=n;i++)
{
if(a[i]!=0)
printf("%d",i);
}
return 0;
}
上面的continue用的十分精髓,它是跳出本次循环,进入下次循环。不然如果t刚好等于3的时候下一个a[i]也刚好等于0.t不加一,下面的if语句又会进去,下面的k会多减,最终剩下数组中有1的不止一个,会输出好多个人。

标题 数的转移

题目:有n个整数。使其前面各各数顺序向后移m个位置,最后m个数变成最前面的m个数。
要求:用函数,且原本的顺序不变。
#include<stdio.h>
int move(int a,int n,int m)//这块用a和a[]都可以,好像表示同一个意思,貌似发现了新大陆
{
int t[100],i;
for(i=0;i<n;i++)
{
t[i]=a[i];//先把原数组中的数值传到t数组中,用两个数组,方便转移。
}
for(i=0;i<m;i++)
{
a[i]=t[n-m+i];//把a数组后面第n-m个及到后面最后一个的全部转移到a数组中第一个到第m-1个
}
for(i=m;i<n;i++)
{
a[i]=t[i-m];把a数组第1个到第m个的值赋给a数组第m个到最后一个
}
}
int main(void)
{
int n,m,i,a[20];
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
move(a,n,m);
for(i=0;i<n;i++)
{
printf("%d ",a[i]);
}
return 0;
}

标题 比大小

题目:比较三个数字的大小
要求:必须使用指针和函数
#include<stdio.h>
void swap(inta,intb)
{
int p;
p=*a;
*a=*b;
*b=p;
}
int main(void)
{
int z,x,c;
scanf("%d%d%d",&z,&x,&c);
if(z<x)
swap(&z,&x);
if(z<c)
swap(&z,&c);
if(x<c)
swap(&x,&c);
printf("%d %d %d",z,x,c);
return 0;
}
这道题本身不怎么难,但是它主要考察的是函数值交换的问题,在函数中直接用变量交换,传到主函数中变量本身的值还是不会交换。用指针就可以解决这一问题。

标题 数字的插入

题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将他插入数组中。
要求:首先判断此数是否大于最后一个数,然后再考虑插入中间的数的情况,插入此元素之后的数,依次后移一个位置。
#include<stdio.h>
int main(void)
{
int a[11]={1,4,6,9,13,16,19,28,40,100},k,t,end,j,i,p;//注意,是有序数组
scanf("%d",&k);
end=a[9];
if(end<k)
a[10]=k;
else
{
for(i=0;i<9;i++)//从第一个数开始判断,如果k小于,就把那个数组中的值取出来赋给t,把k值放进去
{
if(a[i]>k)
{
t=a[i];
a[i]=k;
for(j=i+1;j<11;j++)
{
p=a[j];//把下一个数组中的值取出来赋给p
a[j]=t;//把前一个数组中的值给后一个数组
t=p;//灵魂所在,把这个数组的值给t,进行下一个数组的值的交换,不断循环下去
}
break;
}
}
}
for(i=0;i<11;i++)
{
printf("%d ",a[i]);
}
return 0;
}
这个题的思想类似于插入排序,先和最后一个作比较,比最后一个大直接放到a[10]这个空间中,

标题 下面这些题都是逻辑问题

题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
#include<stdio.h>
int main(void)
{
float s=0,a=2,b=1,t;
int i;
for(i=1;i<=20;i++)
{
s=s+a/b;
t=a;
a=a+b;
b=t;
}
printf("%f",s);
return 0;
}

这个主要考了下思想,逻辑问题,下一个分数的分子,是上一个分子分母的和,下一个分数的分母,等于上一个分数的分子。

题目:一球从100m高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少m?第十次反弹多高?
#include<stdio.h>
int main(void)
{
	float a,h=100.0,s=h/2;
	int i; 
	for(i=1;i<10;i++)
	{
		h=h+2*s;
		s=s/2;
	}
	printf("总共%f米。\n",h);
	printf("第十次%f高。",s);
	return 0;
}
当时记这道题的时候,感觉这道题还有点那味儿,现在看起来,挺简单的,主要是逻辑问题,先求和算总高度,第十次弹起算第11次的高度。

加粗样式
题目:猴子吃桃问题,猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又将又将又吃掉剩下桃子的一半,又多吃一个,以后每天早上都吃了前一天剩下的一半零一个,到第10天早上想再吃时,见只剩下一个桃子了,问第一天共摘多少?
#include<stdio.h>
int main(void)
{
int day=9,x1=1,x2;//x1是最后一天剩余的桃,
while(day>0)
{
x2=(x1+1)*2;//算出x1的前一天的桃数,
x1=x2;//这一行是关键,x1对应倒数第二天,最后循环到第一天;
day–;
}
printf("%d",x1);
return 0;
}
这道题考了逆向思维,留这,算是一种思想;

标题 一些代码题的判断

** int d= -4;
unsigned e=2;
if(c<e)
printf("ok \n ");
else
printf(“no”)

    这道题输出的是no,int的负四比无符号的2大,这个我到现在其实也不是很懂,感觉是计算机算的时候,二进制转成补码,无符号第一位是大小,而int型第一位表示的是符号,无符号是0到255的话,有符号是-128到127,算的时候出现了某些变化,等啥时候搞懂了再记,先在这留个底

**#include <stdio.h>
#define X(x) x;x;x;x;x;x;x;x;x;x;
int main(void)
{
int x = 1;
X(X(printf("%d ", x++)));
return 0;
}
在现在这里插入图片描述
这代码我也是看的马马虎虎,感觉有递归那味了,先记下它的计算逻辑,等以后变强了再回过头看。
加粗样式
int main(void)
{
int a = 0X7FFFFFFF;
if(a+1 > a)
{
printf(“ok \n”);
else
{
printf(“no \n”);
}
在这里插入图片描述
a+1溢出上限了,从a=2147483647,加一之后转一圈到-2147483648最小值。
加粗样式
int b =20;
float c =19.9;
if(b-c == 0.1)
{
printf(“ok \n”);
}
else
{
printf(“no \n”);
}
输出的是no实数减浮点数20-19.9=0,原因不知,先当个结论记下,
但要注意的是,整型除浮点型除出来是浮点型

标题 伟大的鸡兔同笼

鸡兔共30只,脚共90个,编写一个程序,求鸡、兔各多少只
#include<stdio.h>
int main(void)
{
int sum=30,jiao=90,ji,tu,k,t;
tu=(jiao-sum*2)/2;
ji=sum-tu;
printf(“ji=%d\ntu=%d\n”,ji,tu);
return 0;

}
常规方法就是用循环然后加if语句从1开始判断,直到相等,就可得出结果代码找不到了,就在这不放了
下面说下我比较邪恶的方法,即我上面这串代码,把兔子每只砍两只脚就和鸡每只的腿数一样,用总脚减去鸡兔总数乘以2,剩下的就是砍去的兔子的脚,除以二就是兔子的个数。

加粗样式
#include<stdio.h>
int main(void)
{
int a[5];
printf("%p\n", a);
printf("%p\n", a+1);
printf("%p\n",&a);
printf("%p\n", &a+2);
printf("%p\n", &a+1);
return 0;
}
在这里插入图片描述

第一个输出的是a数组的首地址
第二个输出的是a[1]的地址
第三个是把a的首地址取出来输出的也是a的首地址
第四个 是把整个数组取出来,步长是整个数组,
a和&a指向的是同一块地址,但他们+1后的效果不同,a+1是一个元素的内存大小(增加4),而&a+1增加的是整个数组的内存
大小(增加40)。既a和&a的指向和&a[0]是相同的,但性质不同!
这段代码会输出整个数组的内存大小,而不是首元素的大小,由此我们是否联系到,sizeof(a)这里的a和
&a有些相同之处呢?! 是的,没错,&a取都得是整个数组的地址!既数组名取地址等价于对数组取地址。
其实a和 &a结果都是数组的首地址,但他们的类型是不一样。
a表示&a[0],也即对数组首元素取地址,a+1表示首地址+sizeof(元素类型)。
&a虽然值为数组首元素地址,但类型为:类型 (*)[数组元素个数],所以&a+1大小为:首地址+sizeof(a)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值