Varias preguntas básicas del lenguaje C

1. Factorial recursivo

Análisis : n!=1*2*...*n
entonces tenemos dos métodos


  • Pensamiento recursivo : n!=n*(n-1)!
    defina la función f (x) de acuerdo con la ley de factorial y haga x*f(x-1)el valor devuelto por la función hasta n = 1. Encuentre el resultado después de que la función se llame a sí misma.
    Código :

      #include<stdio.h>
      int cnt(int n);//调用声明函数
      int main()
      {
      	int n;
      	scanf("%d",&n);
      	printf("%d",cnt(n));
      	return 0;
      }
    
      int cnt(int n)//定义声明函数
      {
      	if(n>0)
      	n*=cnt(n-1);
      	else n=1;
      	return n;
      }
    

  • Idea circular : porque n!=n*(n-1)*...*1comienza desde a = 1 y lo multiplica por un después de +1.
    Código :

      #include<stdio.h>
      int main()
      {
      	int n;
      	scanf("%d",&n);
      	int a=1;	//a要初始化为1 
      	for(int i=1;i<=n;i++) //注意i应从1取到n,因此判断条件为<=
      	a=a*i;
      	printf("%d",a);
      	return 0;
      }
    

2. Conversión del subsistema

Título : Dé una puntuación de 100 puntos y solicite la calificación de salida 'A' (90 puntos y más), 'B' (80 a 89 puntos), 'C' (70 a 79 puntos), 'D' (60 a 60 puntos) 69 puntos), 'E' (60 puntos o menos).
Formato de entrada
Porcentaje de puntajes, enteros, por ejemplo, 100, 89
Formato de salida
Calificaciones de grados, como A, B, C, etc.
Ej . 85
Análisis B : Esta pregunta es muy simple. Cuando revisé la reescritura, encontré que era más concisa que antes. Bastante, debido a que se utiliza la idea de mapeo, el puntaje se reduce de 5 categorías a 3 categorías: 100 puntos, 60 a 99 puntos, 60 puntos o menos.
Código :

#include<stdio.h>
int main()
{
	int s;
	scanf("%d",&s);
	s/=10;//成绩映射为0-10 
	if(s==10)//10(满分)的情况 
	printf("A");
	else if(s>=6)//将6到9转换为字母等级 
	printf("%c",('E'-s+5));
	else printf("E");//小于6(不及格)的情况
	return 0;
}

3. Determine si es un número primo (<1000)

Análisis : los números primos son números que solo se pueden dividir entre 1 y ellos mismos, por lo que podemos recorrer todos los números menores que 2 desde el principio.
Optimización :
el múltiplo de 2 no es primo, así que primero determine si es un múltiplo de 2.
Al juzgar si un número determinado es un factor, puede determinar si varios números son un factor juntos.
Por ejemplo, para determinar si 11 es un número primo, debe juzgar de 2 a 9, y 2 no es un factor, y también puede determinar que 6 a 10 tampoco es un factor. Debido a que 2 veces estos números son mayores que 11, es imposible tener un número mayor que 2 y 6 a 10 Multiplicado por 11.
Código :

#include<stdio.h>
int main()
{
	int n;
	int r=1; //用r记录是否为素数。1为素数0非素数 
	scanf("%d",&n);
	//大于2的偶数非素数
	if((n/2>1)&&(n%2==0)) 
	r=0;
	//判断是否为素数
	for(int i=3;r==1&&i*i<=n;i+=2) //更新直接+2,因到只用判断奇数
	{
		if(n%i==0) 
		{
			r=0;
			break; //跳出for循环
		}
	}
	//通过r的值(是否为素数)进行输出
	if(r==0)
	printf("NO");
	else
	printf("YES");
	return 0;
}

4. Hoy es el día

Título : Ingrese tres enteros para el año, mes y día, y la salida es el día del año,
por ejemplo: entrada: 1990 9 20 salida: 263

#include<stdio.h>
int main()
{
	int y,m,d;
	scanf("%d%d%d",&y,&m,&d);
	int r=d; //结果初始化为天数d
	for(int i=1;i<m;i++)//逐月增加天数:从1月加到m-1月 
	{
		switch(i) 
		{
			case 2:
			r+=28;
			break;
			case 4:
			case 6:
			case 9:
			case 11:
			r+=30;
			break;
			default://31天的月份较多放在default中 
			r+=31;			
		}
	}
	//判断平年闰年,若为闰年2月有29天,再加1
	if((y%400==0)||((y%4==0)&&(y%100!=0))) 
	r++;
	printf("%d",r);
	return 0;
}

5. Salida según sea necesario

Título : escriba un programa, la entrada es de tres líneas, la primera línea es un número entero a, la segunda línea es el carácter c y la tercera línea es un número entero b. (0 <a, b <100000).
Hay cuatro líneas de salida. La primera línea emite secuencialmente a, b, c, y los tres valores están separados por un espacio; la segunda emite secuencialmente los valores de a + b, ab, a * b, a / b, y un% b, entre cada valor Separado por un espacio; la tercera línea genera la relación de ayb (coma flotante, con precisión a dos decimales); la cuarta línea emite la tasa porcentual de ayb (coma flotante, con precisión a dos decimales) Vea la muestra de salida para el formato específico.
Muestra de entrada
12
b
234
Muestra de salida
12 234 b
246 -222 2808 0 12
La relación de 12 frente a 234 es 0.05.
La relación de 12/234 es 5.13%.
Código :

#include<stdio.h>
 int main()
 {
	//输出控制字符:加\;输出%:%% 
	long long a,b; //整型出现乘法:用lld
	char c;
	scanf("%lld",&a);
	scanf("\n%c",&c);
//scanf:1.按格式要求。2.输入非c时自动忽略前导空白符号,不用加\n。
//3.输入为c时会读入空白符号->如何解决上一行的换行符残留:加\n或用getchar 
	scanf("%lld",&b);
	printf("%lld %lld %c\n",a,b,c);
	printf("%lld %lld %lld %lld %lld\n",a+b,a-b,a*b,a/b,a%b);
	printf("The ratio of %lld versus %lld is %.2lf.\n",a,b,(double)a/b);
	printf("The ratio of %lld / %lld is %.2lf%%.",a,b,100*(double)a/b);
	return 0;
 }

6. Salida según sea necesario

Título : Un programa, la entrada es un número entero a, un número de coma flotante f, un número entero b. (-10000 <a, b, f <10000).
Hay cinco líneas de salida. La primera línea emite a, f, b en secuencia, cada número ocupa 10 bits de caracteres, alineados a la derecha. No se agrega espacio entre dos números, f tiene una precisión de un decimal; la segunda línea genera una secuencia a, f, b, cada número tiene 10 caracteres, con signos positivos y negativos, alineados a la izquierda, f es precisa Dos decimales. No se agregan espacios entre dos números. El final de la cadena de salida es Hola; la tercera línea emite 35 #; la cuarta línea emite secuencialmente a, f, b, cada número ocupa 10 caracteres, incluidos signos positivos y negativos, alineados a la derecha, f tiene una precisión de dos decimales , No se agrega espacio entre dos números; la quinta línea genera continuamente tres grupos de 0123456789.
Muestra de entrada
12 34.567 89
Muestra de salida
12 34.6 89
+12 +34.57 +89 Hola
############################## ####
12 89 34,57
012345678901234567890123456789
Código :

#include<stdio.h>
int main()
{
	int a,b;
	double f;
	scanf("%d %lf %d",&a,&f,&b); //double类型输入用lf
	//+为整数时显示+;-左对齐(默认右对齐);
	//%a.bf保留小数点后b位,所占长度至少为a
	printf("%10d%10.1lf%10d\n",a,f,b);
	printf("%-+10d%-+10.2lf%-+10dHello\n",a,f,b);
	printf("###################################\n");
	printf("%+10d%+10.2lf%+10d\n",a,f,b);
	for(int i=0;i<3;i++)
	printf("0123456789");
	return 0;
}

7. Conversión de temperatura

Código :

#include<stdio.h>
//宏定义提高代码可读性 
#define bei 1.8 
#define cha 32
#define low -273.15
int main()
{
	double num;
	char c;
	scanf("%lf %c",&num,&c);
	if(c=='C'&&num>=low)
	printf("%.2lf F",num*bei+cha);
	else if(c=='F'&&(num-cha)/bei>=low)
	//计算转化后的是否满足高于绝对零度 
	printf("%.2lf C",(num-cha)/bei);
	else
	printf("invalid");
	return 0;
}

8. Comparación de punto flotante

Problema : la
entrada es solo una línea, y los tres números de coma flotante a, b, c separados por espacios (0 <a, b, c <100)
también son solo una línea. Si a-b es igual a c, entonces sí es salida, de lo contrario no .
Muestra de entrada
3.4 2.2 1.3
Muestra de salida
sin
análisis :

  1. Use el doble para la entrada de punto flotante para evitar que los datos sean demasiado grandes
    2. Use fabs para la comparación de punto flotante:
    igual: fabs (mn) <=
    rango 1E-6 : fabs (mn)>
    tamaño de comparación 1E-6 : (para satisfacer la relación de tamaño y no Igual) m> n && fabs (mn)> 1E-6 o mn> 1E-6
    principio: convertido en almacenamiento binario, solo los números de coma flotante que se pueden expresar como potencias de 2 multiplicados por números enteros se pueden expresar con precisión, el
    resto de los números son
    Código aproximado :

     #include<stdio.h>
     #include<math.h>//fabs函数需要引入数学库
     int main()
     {
     	double a,b,c;
     	scanf("%lf %lf %lf",&a,&b,&c);
     	if(fabs(a-b-c)<1E-6)
     	printf("yes");
     	else printf("no");
     	return 0;
      } 
    

9. Paga la tarifa de la fiesta

Tema : Ingresos salariales mensuales (después de impuestos) de menos de 3.000 yuanes (incluidos 3.000 yuanes), 0,5% de los ingresos salariales mensuales; de 3.000 a 5.000 yuanes (incluidos 5.000 yuanes), 1%; a partir de 5.000 yuanes Por 10.000 yuanes (incluidos 10.000 yuanes), pague el 1.5%; para los que superen los 10.000 yuanes, pague el 2%.
Ahora me gustaría pedirle que escriba un programa para calcular el monto de las tarifas de la fiesta que un miembro del grupo maestro debe pagar en un mes.
El formato de entrada es
solo una línea, que es un salario de punto flotante (0 <salario <20000), que es el ingreso mensual del maestro (después de impuestos).
El formato de salida es
solo una línea, que es el monto de la tarifa de la fiesta que el maestro debe pagar en el mes (retener 1 lugar decimal).
Muestra de entrada
3000
Muestra de salida
15.0
código

#include<stdio.h>
#include<math.h>
int main()
{
	const double rate[4]={0.005,0.01,0.015,0.02};
	//党费比例写在数组中,代码可读性高 
	double s,d;
	scanf("%lf",&s);
	if(s<3000||fabs(s-3000)<=1E-6)//小于等于一个浮点数的判断方法 
	d=rate[0]*s;
	else if(s<5000||fabs(s-5000)<=1E-6)
	d=rate[1]*s;
	else if(s<10000||fabs(s-10000)<=1E-6)
	d=rate[2]*s;
	else
	d=rate[3]*s;
	printf("%.1lf",d);
	return 0;
}

10. Continuará. . .

Supongo que te gusta

Origin www.cnblogs.com/shanestella/p/12700963.html
Recomendado
Clasificación