Preguntas básicas de programación en lenguaje C (1)

contenido

1. Juicio principal

2. Determinación de los años bisiestos

3. Máximo común divisor

4. Cuenta el número de 9

5. Suma de puntos

6. Encuentra el valor máximo

7. Tabla de fórmulas de multiplicación

8. Cadena en orden inverso (implementación recursiva)

9. Calcular la suma de cada bit de un número (implementación recursiva)

10. Realización recursiva de n elevado a k

11. Operaciones de matrices

12. Intercambiar matrices

13. Encuentra el número de bits diferentes en el binario de dos números

14. Imprime dígitos pares e impares de números binarios enteros

15. Calcula la suma

16. Imprime el número de narcisos (versión mejorada)

17. Imprime el rombo

18. Problemas con el consumo de refrescos

19. Ajusta el orden impar-par

20. implementación de simulación strcpy


1. Juicio principal

Contenido del tema:

Para determinar si un número es primo, imprime los números primos entre 100 y 200 y calcula cuántos números primos hay.

#include <stdio.h>
#include <math.h>

//试除法
int main()
{
	int i = 0;
	int j = 0;
	int count = 0;
	for (i = 101; i <= 200; i+=2) //由于偶数一定不是素数 所以判断奇数即可
	{
		//sqrt是一个库函数,对i开平方 需要头文件<math.h>
		for (j = 2; j <= sqrt(i); j++) 
		{
			if (i % j == 0)
			{
				break;
			}
		}
		if (j > sqrt(i)) //上面循环有两种情况会退出:1:i % j == 0 2:j > sqrt(i) 情况2才能说明是素数
		{
			printf("%d ", i);
			count++;
		}
}
	printf("\n100--200共有:%d个素数\n", count);
	return 0;
}

Nota: si i = a * b, entonces uno de los factores (a o b) debe ser menor o igual que la raíz i 

Por ejemplo: 16 = 2 * 8 también = 4 * 4 donde tanto 2 como 4 son menores o iguales al signo raíz 16

Entonces: para juzgar si es un número primo (encontrar un factor pequeño ), solo necesita que el rango de j esté entre [ 2, sqrt(i)]

2. Determinación de los años bisiestos

Contenido del tema:

Imprime los años bisiestos entre 1000 y 2000.

#include <stdio.h>

int main()
{	
//判断闰年的规则:(满足1或2即可)
//1.能被4整除且不能被100整除
//2.能被400整除
	int year = 0;
	int count = 0;
	for (year = 1000; year <= 2000; year++)
	{
		if (((year % 4 == 0) && (year % 100 != 0)) || year % 400 == 0)
		{
			printf("%d ", year);
			count++;
		}
	}
	printf("\n共有%d个闰年",count);
	return 0;
}

3. Máximo común divisor

Contenido del tema:

Dados dos números, encuentra el máximo común divisor de los dos números

//辗转相除法
#include <stdio.h>

int main()
{	
	int a = 0;
	int b = 0;
	int c = 0;
	scanf("%d %d", &a, &b);
	while (c = a % b)
	{
		a = b;
		b = c;
	}
	printf("最大公约数为:%d",b);
	return 0;
}

//暴力求解
#include <stdio.h>
//先找到两个数中的最小值min(因为最大公约数最大能到min)
//暴力解出最大公约数
int main()
{	
	int a = 0;
	int b = 0;
	int min = 0;
	int i = 0;

	scanf("%d %d", &a, &b);
	if (a > b)
		min = b;
	else
		min = a;
	for (i = min; i > 0; i--)
	{
		if ((a % i == 0) && (b % i == 0))
			break;
	}
	
	printf("最大公约数为:%d",i);
	return 0;
}

4. Cuenta el número de 9

Contenido del tema:

Escriba un programa para contar cuántos números 9 aparecen en todos los números enteros del 1 al 100

#include <stdio.h>

int main()
{
	int i = 0;
	int count = 0;
	for (i = 1; i <= 100; i++)
	{
		if (i / 10 == 9)  //判断十位是否为9
			count++;
		if (i % 10 == 9)  //判断个位是否为9
			count++;
	}
	printf("\n1--100共有:%d个9\n", count);
	return 0;
}

5. Suma de puntos

Contenido del tema:

Calcula el valor de 1/1-1/2+1/3-1/4+1/5 ... + 1/99 - 1/100 e imprime el resultado

//不用逻辑判断的代码
#include <stdio.h>

int main()
{
    int i = 0;
    double sum = 0.0;
    int flag = 1;
    for (i = 1; i <= 100; i++)
    {
         sum += flag * 1.0 / i;
         flag *= -1;
    }
    printf("%lf", sum);
}


//常规思路代码
#include <stdio.h>

int main()
{
    int i = 0;
    double sum = 0.0;
    for (i = 1; i <= 100; i++)
    {
        if (0 == i % 2)
        {
            sum -= 1.0 / i;
        }
        else
            sum += 1.0 / i;
    }
    printf("%lf", sum);
}

Nota: El operador de división / Cuando ambos lados son enteros, realiza la división de enteros, como: 1/2 = 0, pero siempre que haya un número de punto flotante en ambos lados del operando, realiza la división de números flotantes. -números de puntos

6. Encuentra el valor máximo

Contenido del tema:

Encuentra el valor más grande entre 10 números enteros

#include <stdio.h>

int main()
{
    int arr[10] = { 0 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    int i = 0;

    for(i = 0; i < sz; i++)
    {
        scanf("%d", &arr[i]);
    }
    int max = arr[0]; //易出错的一步
    for (i = 0; i < 10; i++)
    {
        if (arr[i] > max)
            max = arr[i];
    }
    printf("max = %d", max);
    return 0;
}

Nota: Al definir el valor máximo, que sea igual al primer número de la matriz, no 0 (para evitar todos los números negativos en la matriz)

7. Tabla de fórmulas de multiplicación

Contenido del tema:

Muestra la tabla de fórmulas de multiplicación 9*9 en la pantalla

#include <stdio.h>

int main()
{
    int i = 0;
    //行数
    for (i = 1; i <= 9; i++)
    {
        int j = 0;
        //打印一行的多少列
        for (j = 1; j <= i; j++)
        {
            //打印一项
            printf("%d*%d = %-2d ", i, j, i * j);//如果不是%-2d会存在"错位"的现象
        }
        printf("\n");
    }

    return 0;
}

Preste atención al fenómeno de la "desalineación": use %2d (alineado a la derecha) o %-2d (alineado a la izquierda) para resolver

8.  Cadena en orden inverso (implementación recursiva)

Contenido del tema:

Escriba una función reverse_string(char * string) (implementación recursiva)

Implementación : organice los caracteres en la cadena de parámetros en orden inverso en lugar de imprimirlos en orden inverso.

por ejemplo:

char arr[] = "abcdef"; el contenido de la matriz después del orden inverso se convierte en: fedcba

Tome abcdef como ejemplo:

Idea recursiva: los caracteres 'a' y 'f' en ambos extremos se transponen, y la cadena restante "bcde" en el medio participa en la siguiente recursión

Por ejemplo, los pasos específicos del primer paso son:

① Crear almacenamiento tmp 'a'

②'f' reemplaza la posición de 'a'

3 Reemplace la posición original de 'f' con '\0' (el propósito de esto es encontrar la posición del penúltimo elemento e, porque la forma en que la función strlen calcula la longitud es encontrar la terminación de '\0', para que la mitad del orden inverso se pueda invertir. cadenas restantes )

④ Cuando se invierte la cadena del medio, coloque 'a' en la posición donde solía estar 'f'

Nota: Para los pasos de invertir la cadena intermedia, cuando la longitud de la cadena intermedia es mayor a 1, es necesario que continúen cambiando de posición y participando en la siguiente recursión

//递归版本
#include <stdio.h>
#include <string.h>

void reverse_string(char arr[])
{
	char tmp = arr[0];         //①
	int len = strlen(arr);
	arr[0] = arr[len - 1];    //②
	arr[len - 1] = '\0';      //③
	//中间字符串的逆序
	if (strlen(arr + 1) > 1)  //注
		reverse_string(arr + 1);
	arr[len - 1] = tmp;       //④
}
int main()
{
	char arr[100] = { 0 };
	//scanf("%s", arr);//有问题,遇到空格时就终止了
	gets(arr);//读取一行,有空格也会读取
	reverse_string(arr);
	printf("%s", arr);
	return 0;
}


//非递归版本
#include <stdio.h>
#include <string.h>

void reverse_string(char arr[])
{
	int left = 0;
	int right = strlen(arr) - 1;
	
	while (left < right)
	{
		char tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}

}
int main()
{
	char arr[100] = { 0 };
	//scanf("%s", arr);
	gets(arr);
	reverse_string(arr);
	printf("%s", arr);
	return 0;
}

9. Calcular la suma de cada bit de un número (implementación recursiva)

Contenido del tema:

Escriba una función recursiva DigitSum(n) que tome un número entero no negativo y devuelva la suma de los números que lo componen

Por ejemplo, llamar a DigitSum(1729) debería devolver 1+7+2+9 cuya suma es 19

Entrada: 1729, Salida: 19

Idea recursiva:

SumaDígitos(1719) ==> SumaDígitos(1719/10) + (1719%10)

#include <stdio.h>

int DigitSum(int n)
{
	if (n > 9)
		return DigitSum(n / 10) + n % 10;

	else		
	return n;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int sum = DigitSum(n);
	printf("%d", sum);
	return 0;
}

10. Realización recursiva de n elevado a k

Contenido del tema:

Escribe una función para implementar n elevado a k, usando recursividad.

Idea recursiva: n ^ k = n * (n ^ (k-1))

#include <stdio.h>

double Pow(int n, int k)
{
	if (k == 0)
		return 1.0;
	else if (k > 0)
		return (double)n * Pow(n, k - 1);
	else
		return 1.0 / Pow(n , -k);
}
int main()
{
	int n = 0;
	int k = 0;
	
	scanf("%d%d", &n,&k);
	double ret = Pow(n,k);
	printf("%lf", ret);
	return 0;
}

11. Operaciones de matrices

Contenido del tema:

Cree una matriz de enteros y complete la operación en la matriz

  1. Implemente la función init () para inicializar la matriz a todos 0
  2. Implemente print() para imprimir cada elemento de la matriz
  3. Implemente la función reverse() para invertir los elementos de una matriz.

Requisito: Diseñe los parámetros de las funciones anteriores usted mismo y devuelva el valor.

#include <stdio.h>

void init(int *a, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		*(a + i) = 0;
	}
}

void print(int* a, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(a + i));
	}
	printf("\n");
}

void reverse(int* a, int sz)
{
	int left = 0;
	int right = sz - 1;
	while (left < right)
	{
		int temp = a[left];
		a[left] = a[right];
		a[right] = temp;
		left++;
		right--;
	}
}


int main()
{
	int arr[5] = { 1, 2, 3, 4, 5 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	init(arr,sz);
	print(arr,sz);
	int brr[5] = { 1, 2, 3, 4, 5 };
	reverse(brr,sz);
	print(brr, sz);
	return 0;
}

Nota: Trate de no tener operaciones redundantes al escribir funciones (como: función de inicialización, solo inicialícela, no es necesario imprimirla), además, invertir una matriz requiere invertir los elementos de la matriz en lugar de simplemente imprimirlos en orden inverso.

12. Intercambiar matrices

Contenido del tema:

Intercambia el contenido de la matriz A con el contenido de la matriz B. (del mismo tamaño que la matriz)

#include <stdio.h>

void SwapArr(int* arr1, int* arr2, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		int temp = arr1[i];
		arr1[i] = arr2[i];
		arr2[i] = temp;
	}
}

int main()
{
	int arr1[] = { 1, 3, 5, 7, 9 };
	int arr2[] = { 2, 4, 6, 8, 0 };
	int sz = sizeof(arr1) / sizeof(arr1[0]);
	SwapArr(arr1, arr2, sz);
    return 0;
}

13. Encuentra el número de bits diferentes en el binario de dos números

Contenido del tema:

Implementación de programación: ¿Cuántos bits son diferentes en la representación binaria de dos enteros int (32 bits) m y n? 

Ejemplo de entrada:

1999 2299

Salida de ejemplo: 7

#include <stdio.h>


//方法一:
int get_diff_bit1(int m, int n)
{
	//一个数与1按位与,可知从右往左第一位是0还是1
	//eg:11 - 十进制
	//00000000000000000000000000001011 - 二进制
	//00000000000000000000000000000001 - 和1按位与 结果为1,若最右是0,则结果为1
	int i = 0;
	int count = 0;
	for (i = 0; i < 32; i++)
	{
		if (((m >> i) & 1) != ((n >> i) & 1))
			count++;
	}
	return count;
}


//方法二:
//要求m与n之间有多少位不同,就相当于求 m^n后二进制序列里有多少个1(因为异或相同为0相异为1)
//又已知a & (a - 1)可以使a从左往右第一个1变成0,所以代码如下:
int get_diff_bit2(int m, int n)
{
	int i = 0;
	int count = 0;
	int tmp = m ^ n;
	while (tmp)
	{
		tmp = tmp & (tmp - 1);
		count++;
	}
	return count;
}

int main()
{
	int m = 0;
	int n = 0;
	scanf("%d%d", &m, &n);
	
	int count = get_diff_bit2(m, n);

	printf("%d\n", count);
}

14. Imprime dígitos pares e impares de números binarios enteros

Contenido del tema:

Obtenga todos los bits pares e impares en una secuencia binaria entera e imprima la secuencia binaria respectivamente

#include <stdio.h>

int main()
{
	int m = 0;
	scanf("%d", &m);
	//eg:11
	//00000000000000000000000000001011

	//偶数位
	int i = 0;
	for (i = 31; i >= 1; i -= 2)
	{
		printf("%d ", (m >> i) & 1);
	}
	printf("\n");
	//奇数位
	for (i = 30; i >= 0; i -= 2)
	{
		printf("%d ", (m >> i) & 1);
	}
	return 0;
}

15. Calcula la suma

Contenido del tema:

Encuentra la suma de los primeros 5 términos de Sn=a+aa+aaa+aaaa+aaaaa, donde a es un número,

Por ejemplo: 2+22+222+2222+22222

#include <stdio.h>

int main()
{
	int a = 0;
	int n = 0;
	int i = 0;
	scanf("%d%d", &a, &n);
	int b = 0;
	int sum = 0;

	for (i = 0; i < n; i++)
	{
		b = b * 10 + a;
		sum += b;

	}
	printf("%d\n", sum);
	
	return 0;
}

16. Imprime el número de narcisos (versión mejorada)

Contenido del tema:

Encuentra todos los "narcisos" entre 0 y 100000 y salida.

"Número de narciso" se refiere a un número de n dígitos, y la suma de la n-ésima potencia de cada número es igual al número en sí, como: 153 = 1 ^ 3 + 5 ^ 3 + 3 ^ 3, entonces 153 es un "número de narciso".

int main()
{
	int i = 0;

	for (i = 0; i <= 100000; i++)
	{
		//判断i是否为自幂数
		//1. 计算i的位数 - n
		int tmp = i;
		int count = 1;
		int sum = 0; //*易错点*,每次循环开始时sum要归0,不能写在循环外面
		while (tmp /= 10)
		{
			count++;
		}
		//2.获得i的每一位,计算其每一位的n次方和
		tmp = i;
		while (tmp)
		{
			sum += pow(tmp % 10, count);//pow为求幂的库函数,需要头文件math.h
			tmp /= 10;
		}
		//3.比较并打印
		if (i == sum)
		{
			printf("%d ", i);
		}
	}
	return 0;
}

17. Imprime el rombo

Contenido del tema:

Muestra un diamante en la pantalla en lenguaje C.

#include <stdio.h>

int main()
{
	//打印一个菱形
	int line = 0; //行数
	int i = 0;

	scanf("%d", &line); //假设为6
	//菱形上半部分打印line行
	for (i = 0; i < line; i++)
	{
		//打印一行
		//先打印空格,再打印* 
		//第一行打印line - 1个空格,第二行line - 2个空格...
		int j = 0;
		for (j = 0; j < (line - 1 - i); j++)
		{
			printf(" ");
		}
		for (j = 0; j < (2 * i + 1); j++)
		{
			printf("*");
		}
		printf("\n");
	}
	//下半部分打印line - 1行
	for (i = 0; i < line - 1; i++)
	{
		 //打印一行
		//先打印空格,再打印*
		int j = 0;
		for (j = 0; j < i + 1; j++)
		{
			printf(" ");
		}
		for (j = 0; j <(line - 1 - i) * 2 - 1; j++)
		{
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

18. Problemas con el consumo de refrescos

Contenido del tema:

Beba refrescos, 1 botella de refresco cuesta 1 yuan, 2 botellas vacías se pueden cambiar por una botella de refresco, dé 20 yuanes, cuánto refresco puede ser (programado).

#include <stdio.h>

int main()
{
	int money = 0;
	int total = 0;  //总共换了多少瓶汽水
	int empty = 0;  //现在手里有多少空瓶

	scanf("%d", &money); //20
	total += money; //用钱买汽水
	empty = money;  //由汽水变空瓶

	while (empty >= 2)
	{
		total += empty / 2;//空瓶换来的汽水
		empty = empty / 2 + empty % 2;//*盘点手里的空瓶数
	}
	printf("total = %d\n", total);
	
	return 0;
}

19. Ajusta el orden impar-par

Contenido del tema:

Tome una matriz de enteros e implemente una función para ajustar el orden de los números en la matriz de modo que todos los números impares en la matriz estén en la primera mitad de la matriz y todos los números pares estén en la segunda mitad de la matriz.

Idea: Puntero doble: encuentre un número par de adelante hacia atrás en la matriz, encuentre un número impar de atrás hacia adelante, intercambie y mueva el puntero al medio

#include <stdio.h>

//简单的版本
void move_arr1(int *arr, int sz)
{
	int left = 0;
	int right = sz - 1;
	while (left < right)
	{
		if (arr[left] % 2 == 0)
		{
			if (arr[right] % 2 == 1)
			{
				int tmp = arr[left];
				arr[left] = arr[right];
				arr[right] = tmp;
			}
			else
			{
				right--;
			}
		}
		else
		{
			left++;
		}
	}
}

//更易理解的版本,但更复杂
//该方法要单独考虑数组全为奇数或全为偶数的情况:
//若全是奇数,left会一直++,出现越界的情况

void move_arr2(int* arr, int sz)
{
	int left = 0;
	int right = sz - 1;
	
	while (left < right)
	{
		//从左边找一个偶数
		while ((left < right) && arr[left] % 2 == 1)
		{
			left++;
		}
		//从右边找一个奇数
		while ((left < right) && arr[right] % 2 == 0)
		{
			right--; 
		}
		if (left < right)
		{
			int tmp = arr[left];
			arr[left] = arr[right];
			arr[right] = tmp;
		}
	}
}

int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	move_arr1(arr , sz);
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", *(arr + i));//验证
	}
	return 0;
}

20. implementación de simulación strcpy

Contenido del tema:

Simular la función de biblioteca strcpy

#include<stdio.h>
#include<assert.h>

char* my_strcpy(char* dest, const char* src) 
                //const为了保证拷贝的数组不发生变化,防止输错了的时候改变了原数组的值
{
	assert(dest && src); //assert:断言(当dest或src为空时,会报错),需要头文件<assert.h>                    
	char* ret = dest;
	while (*dest++ = *src++)
	{
		; //一举两得,既将arr1赋值了hello\0,且赋值\0后,循环条件判定为假,终止循环
	}
	return ret;
}

//简化前的代码
void my_strcpy2(char* dest, char* src)
{
	assert(dest != NULL);//断言
	assert(src != NULL);//断言
	while (*src != '\0')
	{
		*dest = *src;
		dest++;
		src++;
	}
	*dest = *src;//处理'\0'
}

int main()
{
	char arr1[20] = "xxxxxxxxxxxxx";
	char arr2[] = "hello";
    my_strcpy(arr1, arr2);
	printf("%s", arr1);
	printf("%s\n",my_strcpy(arr1, arr2));
	return 0;
}

Supongo que te gusta

Origin blog.csdn.net/m0_62934529/article/details/123215709
Recomendado
Clasificación