いくつかの基本的なC言語の質問

1.再帰的な階乗

分析n!=1*2*...*n
次に2つの方法があります

  • 再帰的
    思考:階乗の法則に従ってn!=n*(n-1)!
    関数f(x)を定義し、x*f(x-1)n = 1になるまで関数によって返される値を作成します。関数呼び出し自体の後で結果を見つけます。
    コード

      #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;
      }
    
  • 循環的な
    アイデアn!=n*(n-1)*...*1なので、a = 1から始まり、後の+1を乗算します。
    コード

      #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.サブシステム変換

タイトル:100ポイントのスコアを付けて、出力グレード「A」(90ポイント以上)、「B」(80〜89ポイント)、「C」(70〜79ポイント)、「D」(60〜60ポイント)を要求します69点)、「E」(60点以下)。
入力形式
パーセンテージスコア、整数、たとえば100、89
出力形式
グレードスコア(A、B、Cなど)
eg85 B
分析:この質問は非常に単純です。書き換えを確認したところ、以前よりも単純であることがわかりました多くの場合、マッピングのアイデアが使用されているため、スコアは5つのカテゴリーから3つのカテゴリー(100ポイント、60〜99ポイント、60ポイント以下)に減少します。
コード

#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.それが素数(<1000)かどうかを判別する

分析:素数は、1とそれ自体でのみ割り切れる数なので、最初から2未満のすべての数をループできます。
最適化
2の倍数は素数ではないため、最初に2の倍数であるかどうかを判断します。
特定の数値が因子であるかどうかを判断するときに、複数の数値が一緒に因子であるかどうかを判断できます。
たとえば、11が素数であるかどうかを判断するには、2から9までを判断する必要があり、2は因数ではないこともわかります。また、6から10も因数ではないと判断することもできます。これらの数の2倍は11より大きいため、2と6から10より大きい数にすることはできません。 11を掛けた
コード

#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.今日がその日

タイトル:年、月、日の3つの整数を入力します。出力はその年の日です。
例:入力:1990 9 20出力: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.必要に応じて出力

タイトル:プログラムを作成します。入力は3行で、1行目は整数a、2行目は文字c、3行目は整数bです。(0 <a、b <100000)。
出力は4行あります。1行目はa、b、cを順に出力し、3つの値はスペースで区切られています。2行目は、各値の間のa + b、ab、a * b、a / b、およびa%bの値を順番に出力しますスペースで区切られます。3行目はaとbの比率を出力し(浮動小数点、小数点以下2桁まで正確)、4行目はaとbのパーセント率を出力します(浮動小数点、小数点以下2桁まで正確)。特定の形式については、出力サンプルを参照してください。
入力サンプル
12
b
234
出力サンプル
12 234 b
246 -222 2808 0 12
12対234
の比率は0.05です。12/ 234 の比率は5.13%です。
コード

#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.必要に応じて出力

タイトル:プログラム、入力は整数a、浮動小数点数f、整数bです。(-10000 <a、b、f <10000)。
5行の出力があります。最初の行は、a、f、bを順に出力します。各数値は、右揃えで10文字ビットを占めます。2つの数値の間にスペースは追加されません。fは小数点以下1桁まで正確です。2行目は、a、f、bを順に出力します。各数値は10文字を占め、正負符号が左揃えで、fは次のように正確です小数点以下2桁。2つの数値の間にスペースは追加されません。出力文字列の終わりはHelloです。3行目は35#を出力します。4行目はa、f、bを順に出力します。各数値は、正負符号を含む10文字を占め、右揃え、小数点以下2桁まで正確です。 、2つの数値の間にスペースは追加されません。5行目は0123456789の3つのグループを継続的に出力します。
入力サンプル
12 34.567 89
出力サンプル
12 34.6 89
+12 +34.57 +89 Hello
############################## ####
12 34.57 89
012345678901234567890123456789
コード

#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.温度変換

コード

#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.浮動小数点の比較

問題
入力は1行のみであり、スペースで区切られた3つの浮動小数点数a、b、c(0 <a、b、c <100)
も1行のみです。a-bがcと等しい場合、yesが出力され、それ以外の場合はno 。
サンプル入力しない
3.4 2.2 1.3
出力サンプルに
何の
分析を

  1. 浮動小数点入力にdoubleを使用して、データが大きくなりすぎないようにします
    。2.浮動小数点比較にfabsを使用します。
    等しい:fabs(mn)<= 1E-6
    範囲:fabs(mn)> 1E-6
    比較サイズ:(サイズの関係を満たすために、等しい)m> n && fabs(mn)> 1E-6またはmn> 1E-6の
    原則:バイナリストレージに変換され、2の累乗に整数を掛けたものとして表現できる浮動小数点数のみを正確に表現でき、
    残りの数はおおよその
    コード

     #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.パーティー料金を支払う

トピック:月額給与(税抜)3,000元未満(3,000元を含む)、月額給与の0.5%、3,000元〜5,000元(5,000元を含む)、1%、5,000元〜 1万元(1万元を含む)は1.5%、1万元以上は2%払います。
さて、私はあなたに、教員の奉仕党員が1か月に支払うべき党費の額を計算するプログラムを書くことをお願いしたいと思います。
入力形式は
1行のみで、これは浮動小数点給与(0 <給与<20000)であり、教師の月収(税引後)です。
出力形式は
1行のみです。これは、教師がその月に支払う必要のあるパーティー料金の金額です(小数点第1位を保持)。
入力サンプル
3000
出力サンプル
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.継続する。

おすすめ

転載: www.cnblogs.com/shanestella/p/12700963.html