第一题
思路:当第一次跳一级时还有f(n-1)种请款,当第一次跳两级时有f(n-2)种情况;类似于斐波拉契数列f(n)=f(n-1)+f(n-2);
知识点:函数的循环和范围
问题:该题目第一次输入为0,结果为0不为1
#include <stdio.h>
int fibonacci(int n)
{
int num1=1,num2=1,num3=0,i=0,num4=0;
if(n<=1){
return num1;
}
for(i=1;i<n;i++){
num3=num1+num2;
num1=num2;
num2=num3;
}
return num3;
}
int main()
{
int num,ret=0;
scanf("%d",&num);
ret=fibonacci(num);
printf("%d",ret);
return 0;
}
第二题
思路:先以1 2 3
4 5 6
7 8 9为例,顺时针螺旋顺序为往右3位,下2位,左2位,上1位,右1位,发现他的顺序为水平位移一位一位减少,竖直位移也减少,则循环4次,后依次循环
知识点:二维数组的运用,还有要细心,方向容易搞错
#include <stdio.h>
int main(){
int matrix[100][100];
int m,n;
scanf("%d%d",&m,&n);
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
scanf("%d",& matrix[i][j]);
}
}
int a=0,b=m-1,right=n-1,left=0;
int i=0,j=0;
while(1){
for(i=a,j=left;j<=right;++j){
printf("%d", matrix[i][j]);
}
++a;
for(i=a,j=right;i<=b;++i){
printf("%d", matrix[i][j]);
}
--right;
for(i=b,j=right;j>=left;--j){
printf("%d", matrix[i][j]);
}
--b;
for(i=b,j=left;i>=a;--i){
printf("%d", matrix[i][j]);
}
++left;
}
return 0;
}
第三题
思路:十进制整数转换为N进制整数采用“除N取余,逆序排列”法。具体做法是;
将N作为除数,用十进制整数除以N,可以得到一个商和余数;
保留余数,用商继续除以N,又得到一个新的商和余数;
仍然保留余数,用商继续除以N,还会得到一个新的商和余数;
……
如此反复进行,每次都保留余数,用商接着除以N,直到商为0时为止
把先得到的余数作为N进制数的低位数字,后得到的余数作为N进制数的高位数字,依次排列起来,就得到了N进制数字。
知识点:对于16进制,10 11 12要用A B C 等表示,取得的余数还要逆序排列
#include <stdio.h>
int main(){
int i,j,n,m ,x;
char a[50];
scanf("%d%d",&n,&m);
if(m<10){
x=n;
for(i=0;x!=0;i++){
a[i]=x%m;
x=x/m;
}
for(j=i-1;j>=0;j--){
printf("%d",a[j]) ;
}
}
if(m>10)
{
x=n;
for(i=0;x!=0;i++){
if(x%m>9){
a[i]=x%m-10+'A';
}
else{
a[i]=x%m- 0 + '0';
}
x = x/ m;
}
for(j=i-1;j>=0;j--){
printf("%c",a[j]) ;
}
}
return 0;
}