Plusieurs questions de base en langage C

1. factorielle récursive

Analyse : n!=1*2*...*n
Ensuite, nous avons deux méthodes

  • Récursifs
    idées : La loi factoriel n!=n*(n-1)!
    fonction définie par f (x), que la fonction retourne la x*f(x-1)valeur jusqu'à ce que n = 1. Trouvez le résultat après l'appel de la fonction elle-même.
    Code :

      #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;
      }
    

  • Idée circulaire : Parce que n!=n*(n-1)*...*1cela part de a = 1 et le multiplie par a après +1.
    Code :

      #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. Conversion de sous-système

Titre : Donnez un score de 100 points et demandez la note de sortie «A» (90 points et plus), «B» (80 à 89 points), «C» (70 à 79 points), «D» (60 à 60 points) 69 points), «E» (60 points ou moins).
Format d'entrée
Scores en pourcentage, entiers, par exemple, 100, 89
Format de sortie
Scores des notes, tels que A, B, C, etc.
eg85 B
Analyse : Cette question est très simple. Lorsque j'ai examiné la réécriture, j'ai trouvé qu'elle était plus concise qu'auparavant. Beaucoup, parce que l'idée de cartographie est utilisée, le score est réduit de 5 catégories à 3 catégories: 100 points, 60 à 99 points, 60 points ou moins.
Code :

#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. Déterminez s'il s'agit d'un nombre premier (<1000)

Analyse : Les nombres premiers sont des nombres qui ne peuvent être divisés que par 1 et eux-mêmes, nous pouvons donc parcourir tous les nombres inférieurs à 2 depuis le début.
Optimisation :
le multiple de 2 n'est pas un nombre premier, alors déterminez d'abord s'il s'agit d'un multiple de 2.
Lorsque vous jugez si un certain nombre est un facteur, vous pouvez déterminer si plusieurs nombres sont un facteur ensemble.
Par exemple, pour déterminer si 11 est un nombre premier, vous devez juger de 2 à 9, et 2 n'est pas un facteur, et vous pouvez également déterminer que 6 à 10 n'est pas non plus un facteur. Parce que 2 fois ces nombres sont supérieurs à 11, il est impossible d'avoir un nombre supérieur à 2 et 6 à 10 Multiplié par 11.
Code :

#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. Aujourd'hui est le jour

Titre : Entrez trois nombres entiers pour l'année, le mois et le jour, et la sortie est le jour de l'année,
par exemple: entrée: 1990 9 20 sortie: 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. Sortie selon les besoins

Titre : Écrivez un programme, l'entrée est de trois lignes, la première ligne est un entier a, la deuxième ligne est le caractère c et la troisième ligne est un entier b. (0 <a, b <100000).
Il y a quatre lignes de sortie. La première ligne génère séquentiellement a, b, c et les trois valeurs sont séparées par un espace; la seconde génère séquentiellement les valeurs de a + b, ab, a * b, a / b et a% b, entre chaque valeur Séparé par un espace; la troisième ligne affiche le rapport de a et b (virgule flottante, précise à deux décimales); la quatrième ligne affiche le pourcentage de a et b (virgule flottante, précise à deux décimales). Voir l'exemple de sortie pour le format spécifique.
Échantillon d'entrée
12
b
234
Échantillon de sortie
12 234 b
246 -222 2808 0 12
Le rapport de 12 contre 234 est de 0,05.
Le rapport de 12/234 est de 5,13%.
Code :

#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. Sortie au besoin

Titre : Un programme, l'entrée est un entier a, un nombre à virgule flottante f, un entier b. (-10000 <a, b, f <10000).
Il y a cinq lignes de sortie. La première ligne sort a, f, b dans l'ordre, chaque nombre occupe 10 bits de caractère, aligné à droite. Aucun espace n'est ajouté entre deux nombres, f est précis à une décimale près; la deuxième ligne affiche a, f, b dans l'ordre, chaque nombre occupe 10 caractères, avec des signes positifs et négatifs, alignés à gauche, f est précis à Deux décimales. Aucun espace n'est ajouté entre deux nombres. La fin de la chaîne de sortie est Hello; la troisième ligne génère 35 #; la quatrième ligne génère séquentiellement a, f, b, chaque nombre occupe 10 caractères, y compris les signes positifs et négatifs, alignés à droite, f précis avec deux décimales , Aucun espace n'est ajouté entre deux nombres; la cinquième ligne génère en continu trois groupes de 0123456789.
Échantillon d'entrée
12 34,567 89
Échantillon de sortie
12 34,6 89
+12 +34,57 +89 Bonjour
############################## ####
+ 12 34,57 +89
012345678901234567890123456789
code :

#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. Conversion de température

Code :

#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. Comparaison en virgule flottante

Problème : L'
entrée est une seule ligne et les trois nombres à virgule flottante a, b, c séparés par des espaces (0 <a, b, c <100) ne
sont également qu'une seule ligne. Si a-b est égal à c, alors oui est affiché, sinon non .
Échantillon d'entrée
3,4 2,2 1,3
Échantillon de sortie
sans
analyse :

  1. Utilisez double pour l'entrée en virgule flottante pour éviter que les données ne soient trop volumineuses
    2. Utilisez les fabs pour la comparaison en virgule flottante:
    égal: fabs (mn) <= 1E-6
    plage: fabs (mn)> 1E-6
    comparaison taille: (pour satisfaire la relation de taille et non Égal) m> n && fabs (mn)> 1E-6 ou mn> 1E-6
    principe: converti en stockage binaire, seuls les nombres à virgule flottante qui peuvent être exprimés en puissances de 2 multipliées par des nombres entiers peuvent être exprimés avec précision, le
    reste des nombres est
    Code approximatif :

     #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. Payez les frais de partie

Sujet : Revenu salarial mensuel (après impôt) inférieur à 3000 yuans (dont 3000 yuans), versez 0,5% du revenu salarial mensuel; de 3000 à 5000 yuans (dont 5000 yuans), payez 1%; de 5000 à Pour 10000 yuans (dont 10000 yuans), payez 1,5%; pour ceux de plus de 10000 yuans, payez 2%.
Maintenant, je voudrais vous demander d'écrire un programme pour calculer le montant des frais de fête qu'un membre enseignant du parti devrait payer dans un mois.
Le format d'entrée est
composé d'une seule ligne, qui est un salaire à virgule flottante (0 <salaire <20000), qui est le revenu mensuel de l'enseignant (après impôt).
Le format de sortie est
une seule ligne, qui est le montant des frais de fête que l'enseignant doit payer au cours du mois (conserver 1 décimale).
Échantillon d'entrée
3000
Échantillon de sortie code
15.0

#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. À suivre. . .

Je suppose que tu aimes

Origine www.cnblogs.com/shanestella/p/12700963.html
conseillé
Classement