面试之C语言基础算法系列(一)

前沿

  著名计算机科学家沃思(Nikiklaus Wirth)提出一个公式: 算法 + 数据结构 = 程序

  基础算法是面试中必须要克服的障碍,因此,开始基础算法系列的旅程吧!


算法之旅

1. Fibonacci数列

[1]. 快乐的LeetCode — 面试题10- I. 斐波那契数列
[2]. 剑指offer面试题09----斐波拉契数列

2. 回文检查

给出的数在逆序后可能超过int范围,可以赋值给long后再逆序。

#include <stdio.h>
int main()
{
	int x;
	scanf("%d", &x);

    if (x < 0)
        printf("%d is not a palindrome.\n",x);
    long temp = x, y = 0;
    while (temp) {
        y = y * 10 + temp % 10;
        temp /= 10;
    }

    if (x == y)
		printf("%d is a palindrome.\n",x);
	else
		printf("%d is not a palindrome.\n",x);
	return 0;
}

3. 质数检查

#include <stdio.h>
int main()
{
	int x, i, flag=0;
	scanf("%d", &x);

	for(i=2;i<x/2;i++)
		if (x % i == 0){
			flag = 1;
			break;
		}

	if (flag == 0)
		printf("%d is a prime number.\n",x);
	else
		printf("%d is not a prime number.\n",x);

	return 0;
}

4. 打印金字塔和三角形

使用 * 建立三角形

*
* *
* * *
* * * *
* * * * *
#include <stdio.h>
int main()
{
	int i,j,n;
	scanf("%d", &n);

	for(i=1;i<=n;i++){
		for(j=1;j<=i;j++)
			printf("*");
		printf("\n");
	}

	return 0;
}

使用 * 建立三角形

	    *
	  * * *
	* * * * *
  * * * * * * *
* * * * * * * * * *
#include <stdio.h>
int main()
{
	int i,j,k,n;
	scanf("%d", &n);

	for(i=1;i<=n;i++){
		for(k=i;k<=n-1;k++){
			printf(" ");
		}
		for(j=1;j<=(2*i)-1;j++){
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

5. 简单的加减乘除计算器

# include <stdio.h>
int main()
{
	char o;
	float num1,num2;
	printf("Enter operator either + or - or * or divide : ");
	scanf("%c",&o);
	printf("Enter two operands: ");
	scanf("%f%f",&num1,&num2);
	switch(o) {
		case '+':
			printf("%.1f + %.1f = %.1f",num1, num2, num1+num2);
			break;
		case '-':
			printf("%.1f - %.1f = %.1f",num1, num2, num1-num2);
			break;
		case '*':
			printf("%.1f * %.1f = %.1f",num1, num2, num1*num2);
			break;
		case '/':
			printf("%.1f / %.1f = %.1f",num1, num2, num1/num2);
			break;

		default:
			/* If operator is other than +, -, * or /, error message is shown */
			printf("Error! operator is not correct");
			break;
		}
	return 0;
}

6. 检查一个数能不能表示成两个质数之和

# include <stdio.h>
int main()
{
	int n, num, i, flag;
	int prime(int x);
	printf("Enter one number :");
	scanf("%d", &n);
	
	for(i=2; i<n-1; i++){
		flag = 0; 
		if(prime(i)){
			num = n - i;
			if (num >= i && num < n-1 && prime(num))
				flag = 1;
		}
		if (flag == 1){
			printf("%d + %d = %d", i, num, n);
			printf("\n");
		}
	}
	return 0;
}

int prime(int x)
{
	int k, flag=0;

	for(k=2;k<x/2;k++)
		if (x % k == 0){
			flag = 1;
			break;
		}

	if (flag == 0)
		return true;
	else
		return false;

	return 0;
}

7. 用递归的方式颠倒字符串

# include <stdio.h>
int main()
{
	void Reverse();
	printf("Enter a sentence:\n");
	Reverse();
	printf("\n");
	return 0;
}

void Reverse()
{
	char c;
	scanf("%c", &c);
	if(c != '\n')
	{
		Reverse();
		printf("%c",c);
	}
}

8. 实现二进制与十进制之间的相互转换

#include <stdio.h>
#include <math.h>
int binary_decimal(int n);
int decimal_binary(int n);

int main()
{
	int n;
	char c;
	printf("Instructions:\n");
	printf("1. Enter alphabet 'd' to convert binary todecimal.\n");
	printf("2. Enter alphabet 'b' to convert decimal tobinary.\n");
	scanf("%c",&c);

    if(c =='d' || c == 'D')
	{
		printf("Enter a binary number: ");
		scanf("%d", &n);
		printf("%d in binary = %d in decimal", n, binary_decimal(n));
	}
	if(c =='b' || c == 'B')
	{
		printf("Enter a decimal number: ");
		scanf("%d", &n);
		printf("%d in decimal = %d in binary", n, decimal_binary(n));
	}
	return 0;
}

int decimal_binary(int n) /* Function to convert decimal to binary.*/
{
	int rem, i=1, binary=0;
	while (n!=0)
	{
		rem=n%2;
		n/=2;
		binary+=rem*i;
		i*=10;
	}
	return binary;
}

int binary_decimal(int n) /* Function toconvert binary to decimal.*/
{
	int decimal=0, i=0, rem;
	while (n!=0)
	{
		rem = n%10;
		n/=10;
		decimal += rem*pow(2,i);
		++i;
	}
	return decimal;
}

9. 实现二进制与十进制之间的相互转换

#include <stdio.h>

int main(){
	int r,c,a[100][100],b[100][100],sum[100][100],i,j;

	printf("Enter number of rows (between 1 and 100): ");
	scanf("%d", &r);
	printf("Enter number of columns (between 1 and 100): ");
	scanf("%d", &c);

	/* Storing elements of first matrix enteredby user. */
	for(i=0;i<r;i++)
	{
		for(j=0;j<c;j++){
			printf("Enter element a%d%d: ",i+1,j+1);
			scanf("%d", &a[i][j]);
		}
	}

	/* Storing elements of second matrixentered by user. */
	for(i=0;i<r;i++)
	{
		for(j=0;j<c;j++){
			printf("Enter element b%d%d: ",i+1,j+1);
			scanf("%d", &b[i][j]);
		}
	}
	
	/*Adding Two matrices */
	for(i=0;i<r;i++)
	{
		for(j=0;j<c;j++)
			sum[i][j] = a[i][j] + b[i][j];
	}

	/* Displaying the resultant sum matrix. */
	for(i=0;i<r;i++)
	{
		for(j=0;j<c;j++){
			printf("%d", sum[i][j]);
			printf(" ");
			if(j==c-1)
				printf("\n");
		}
	}
	return 0;
}

10. 矩阵转置

#include <stdio.h>

int main(){
	int r,c,a[100][100],b[100][100],i,j;
	printf("Enter number of rows (between 1 and 100): ");
	scanf("%d", &r);
	printf("Enter number of columns (between 1 and 100): ");
	scanf("%d", &c);


	/* Storing element of matrix entered byuser in array a[][]. */
	for(i=0;i<r;i++)
	{
		for(j=0;j<c;j++){
			printf("Enter element a%d%d: ",i+1,j+1);
			scanf("%d", &a[i][j]);
		}
	}

	/* Finding transpose of matrix a[][] and storing it in array b[][]. */
	for(i=0;i<r;i++)
	{
		for(j=0;j<c;j++)
			b[j][i] = a[i][j];
	}


	/* Displaying the transpose,i.e, Displayingarray trans[][]. */
	for(i=0;i<c;i++)
	{
		for(j=0;j<r;j++){
			printf("%d", b[i][j]);
			printf(" ");
			if(j==r-1)
				printf("\n");
		}
	}

	return 0;
}

题目来源

moyouyou123

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章