C++ 语言课程笔记

news2024/11/17 23:38:08

C++ 语言课程笔记

C语言程序设计第四版——谭浩强著,此书中的代码题大部分已经在本文中展示,以及南开大学 C 语言上机题库 100 题的作答,如果有作答不正确的地方或者可优化的地方,欢迎指正,谢谢!

001 屏幕输出指定信息

【题目】要求再屏幕上输出以下一行信息

This is a C program.

【代码】

#include <stdio.h> 
​
int main(){
    printf("This is a C program.\n");
    return 0;
} 

002 求两个整数之和

【题目】a + b = ?

【代码】

#include <stdio.h> 
​
int main(){
    int a,b,sum;
    a = 123;
    b = 456;
    sum = a + b;
    printf("sum = %d\n",sum); 
    return 0;
} 

003 求两个整数中较大者

【题目】求两个整数中较大者

【代码】

#include <stdio.h> 
​
int max(int x,int y);
​
int main(){
    int a,b,c;
    scanf("%d,%d",&a,&b);
    c = max(a,b);
    printf("max = %d\n",c);
    return 0;
} 
//求两个整数中较大者 
int max(int x,int y){
    return x>y?x:y; 
}

004 求三个整数中的最大者

【题目】编写一个 C 程序,输入 a,b,c 三个整数,输出其中最大者

【代码】

  • Example 01:

#include <stdio.h> 
​
int max(int x,int y,int z);
​
int main(){
    int a,b,c,d;
    scanf("%d,%d,%d",&a,&b,&c);
    d = max(a,b,c);
    printf("max = %d\n",d);
    return 0;
} 
//求3个整数中较大者 
int max(int x,int y,int z){
    int t;
    if(x>y) {
        if(x>z){
            t = x;
        }else {
            t = z;
        }
    }else if(y<z){
            t = z;
        }else{
            t = y;
        }
    return t; 
}
  • Example 02:对 01 代码进行了优化

#include <stdio.h> 
​
int max(int x,int y,int z);
​
int main(){
    int a,b,c,d;
    scanf("%d,%d,%d",&a,&b,&c);
    d = max(a,b,c);
    printf("max = %d\n",d);
    return 0;
} 
//求3个整数中较大者 
int max(int x,int y,int z){
    int max = x;
    if(max<y){
        max = y;
    }
    if(max<z){
        max = z;
    }
    return max; 
}

005 求1×2×3×4×5

【题目】求1×2×3×4×5

【代码】

#include <stdio.h> 
​
int factorial(int n);
​
int main(){
    int result;
    result = factorial(5); 
    printf("1×2×3×4×5 = %d\n",result);
    return 0;
} 
//求1×2×3×4×5 (5! 阶乘)
int factorial(int n){
    int i=2,t=1;
    while(i<=n){
        t *= i;
        i++;
    }
    return t; 
}

006 求多项式1-1/2+1/3-1/4+...+1/99-1/100

【题目】求多项式1-1/2+1/3-1/4+...+1/99-1/100

【代码】

#include <stdio.h> 
​
double sum(int n);
​
int main(){
    printf("%lf\n",sum(100));
    return 0;
}
​
double sum(int n){
    int sign = 1;
    double result = 1.0;
    int i = 2;
    while(i<=n){
        sign = -sign;
        result += (double)sign/i;
        i++;
    }
    return result;
}

007 输出给定小写字母

【题目】给定一个大写字母,要求用小写字母输出

【代码】

#include <stdio.h> 
​
int main(){
    char c1,c2;
    c1 = 'A';
    c2 = c1 + 32;
    printf("%c\n",c2);
    printf("%d\n",c2);
    return 0;
}

008 从键盘输入字符输出

【题目】从键盘输入BOY 3个字符,然后把他们输出到屏幕

【代码】

#include <stdio.h> 
​
int main(){
    char a,b,c;
    a = getchar();
    b = getchar();
    c = getchar();
    putchar(a);
    putchar(b);
    putchar(c);
    putchar('\n');
    return 0;
}

009 输出任意小写字母

【题目】改写 007,从键盘上输入一个大写字母,在显示屏上显示对应的小写字母

【代码】

#include <stdio.h> 
​
int main(){
    char c1,c2;
    c1 = getchar();
    c2 = c1 + 32;
    putchar(c2);
    putchar('\n');
    return 0;
}

010 判别是否为大写字母

【题目】输入一个字符,判别它是否为大写字母,如果是,将它转换成小写字母;如果不是,则不转换。然后输出最后得到的字符

【代码】

#include <stdio.h> 
​
int main(){
    char c;
    scanf("%c",&c);
    c = (c>='A'&&c<='Z')?(c+32):c;
    printf("%c\n",c); 
    return 0;
}

011 成绩按等级输出

【题目】要求按照考试成绩的等级输出百分制分数段,A等为85分以上,B等为70 ~ 84,C等60 ~ 69,D等为60分以下。成绩的等级由键盘输入

【代码】

#include <stdio.h> 
​
int main(){
    char grade;
    scanf("%c",&grade);
    printf("Your score:");
    switch(grade){
        case 'A': printf("85-100\n");break;
        case 'B': printf("70-84\n");break;
        case 'C': printf("60-69\n");break;
        case 'D': printf("<60\n");break;
        default:  printf("enter data error!\n");
    }
     
    return 0;
}

012 判断闰年

【题目】写一程序,判断某一年是否为闰年

【代码】

#include <stdio.h> 
#include <stdbool.h>
​
bool isLeap(int year);
​
int main(){
    int year;
    scanf("%d",&year);
    if(isLeap(year)){
        printf("%d is ",year);
    }else{
        printf("%d is not ",year);
    }
    printf("a leap year.\n");
     
    return 0;
}
​
bool isLeap(int year){
    bool leap = false;
    if((year%4==0 && year%100!=0)||(year%400==0)){
        leap = true;
    }
    return leap;
}

013 求1+2+3+...+100

【题目】

【代码】

  • Example 01:[ while 语句实现 ]

#include <stdio.h> 

int sum(int n);

int main(){
	printf("%d\n",sum(100));
	return 0;
}

int sum(int n){
	int result = 0;
	int i = 1;
	while(i<=n){
		result += i;
		i++;
	}
	return result;
}
  • Example 02:[ do...while 语句实现 ]

#include <stdio.h> 

int sum(int n);

int main(){
	printf("%d\n",sum(100));
	return 0;
}

int sum(int n){
	int result = 0;
	int i = 1;
	do{
		result += i;
		i++;
	}while(i<=n);
	return result;
}
  • Example 03:[ for 语句实现 ]

#include <stdio.h> 

int sum(int n);

int main(){
	printf("%d\n",sum(100));
	return 0;
}

int sum(int n){
	int result = 0;
	int i;
	for(i=1;i<=n;i++){
		result += i;
	}
	return result;
}

014 输出以下4*5的矩阵

【题目】输出以下4*5的矩阵

1 2 3 4 5

2 4 6 8 10

3 6 9 12 15

4 8 12 16 20

【代码】

#include <stdio.h> 

int main(){
	int i,j;
	for(i=1;i<=4;i++){
		for(j=1;j<=5;j++){
			printf("%d\t",i*j);
			if(j%5 == 0){
				printf("\n");
			}		
		}
		printf("\n");
	}
	return 0;
}

015 求最大公约数和最小公倍数

【题目】输入两个正整数m和n,求其最大公约数和最小公倍数

【思路】

  • 思路一:辗转相除法

    • 有两整数a和b:

    • ① a%b得余数c

    • ② 若c=0,则b即为两数的最大公约数

    • ③ 若c≠0,则a=b,b=c,再回去执行①

  • 思路二:相减法

    • 有两整数a和b:

    • ① 若a>b,则a=a-b

    • ② 若a<b,则b=b-a

    • ③ 若a=b,则a(或b)即为两数的最大公约数

    • ④ 若a≠b,则再回去执行①

  • 思路三:穷举法

    • ① i= a(或b)

    • ② 若a,b能同时被i整除,则i即为最大公约数,结束

    • ③ i–,再回去执行②

【代码】

  • Example 01:[ 辗转相除法求最大公约数 ]

#include <stdio.h> 

int main(){
	int m,n,a,b,c;
	scanf("%d,%d",&m,&n);
	a = m;
	b = n;
	// 辗转相除法求最大公约数 
	while(b){
		c = a%b;
		a = b;
		b = c;
	}
	printf("最大公约数为%d\n",a);
	//最小公倍数=两整数的乘积÷最大公约数
	printf("最小公倍数为%d\n",m*n/a);
	
	return 0;
}
  • Example 02:

#include <stdio.h> 

int gcd(int a,int b);
 
int main(){
	int m,n;
	scanf("%d,%d",&m,&n);
	int a = gcd(m,n);
	printf("最大公约数为%d\n",a);
	//最小公倍数=两整数的乘积÷最大公约数
	printf("最小公倍数为%d\n",m*n/a);
	
	return 0;
}
//求最大公约数
int gcd(int a,int b)
{
	int c;
	// 辗转相除法求最大公约数 
	while(b){
		c = a%b;
		a = b;
		b = c;
	}
	return a;
}
  • Example 03:

#include <stdio.h> 

int gcd(int a,int b);
 
int main(){
	int m,n;
	scanf("%d,%d",&m,&n);
	int a = gcd(m,n);
	printf("最大公约数为%d\n",a);
	//最小公倍数=两整数的乘积÷最大公约数
	printf("最小公倍数为%d\n",m*n/a);
	
	return 0;
}
//求最大公约数
int gcd(int a,int b)
{
	int g;
	if(b==0)g=a;
	else g=gcd(b,a%b);
	return g;
}
  • Example 04:[相减法]

#include <stdio.h> 

int gcd(int a,int b);
 
int main(){
	int m,n;
	scanf("%d,%d",&m,&n);
	int a = gcd(m,n);
	printf("最大公约数为%d\n",a);
	//最小公倍数=两整数的乘积÷最大公约数
	printf("最小公倍数为%d\n",m*n/a);
	
	return 0;
}
//求最大公约数
int gcd(int a,int b)
{
	// 相减法求最大公约数 
	while(a != b){
		if(a>b){
			a -= b;
		}else{
			b -= a;
		}
	}
	return a;
}
  • Example 05:[穷举法]

#include <stdio.h> 

int gcd(int a,int b);
 
int main(){
	int m,n;
	scanf("%d,%d",&m,&n);
	int a = gcd(m,n);
	printf("最大公约数为%d\n",a);
	//最小公倍数=两整数的乘积÷最大公约数
	printf("最小公倍数为%d\n",m*n/a);
	
	return 0;
}
//求最大公约数
int gcd(int a,int b)
{
	int c;
	// 穷举法求最大公约数 
	for(c=a;c>0;c--){
		if(a%c==0&&b%c==0){
			break;
		}
	}
	return c;
}

016 数组元素逆序输出

【题目】对10个数组元素依次赋值为0,1,2,3,4,5,6,7,8,9 要求按逆序输出

【代码】

  • Example 01:( 直接赋初值)

#include <stdio.h> 

int main(){
	int i,a[10]={0,1,2,3,4,5,6,7,8,9};
	
	for(i=9;i>=0;i--){
		printf("%d ",a[i]);
	}
	printf("\n");
	
	return 0;
}
  • Example 02:( for 循环赋初值)

#include <stdio.h> 

int main(){
	int i,a[10];
	for(i=0;i<10;i++){
		a[i] = i;
	}
	for(i=9;i>=0;i--){
		printf("%d ",a[i]);
	}
	printf("\n");
	
	return 0;
}

017 数组求Fibonacci数列问题

【题目】使用数组求Fibonacci数列问题

【代码】

#include <stdio.h> 
#define _Max 20

int main(){
	int i;
	int f[_Max]={1,1};
	for(i=2;i<_Max;i++){
		f[i] = f[i-2] + f[i-1];
	}
	for(i=0;i<_Max;i++){
		if(i%5==0){
			printf("\n");
		}
		printf("%12d",f[i]);
	}
	printf("\n");
	
	return 0;
}

018 对n个数升序排序

【题目】对n个数按升序排序

【代码】

  • Example 01:( 冒泡法排序 )

#include <stdio.h> 
#define N 5

int main(){
	int a[N];
	int i,j,t;
	printf("input %d numbers:\n",N);
	for(i=0;i<N;i++){
		scanf("%d",&a[i]);
	}
	printf("\n");
	for(i=0;i<N-1;i++){
		for(j=0;j<N-1-i;j++){
			if(a[j]>a[j+1]){
				t = a[j];
				a[j] = a[j+1];
				a[j+1] = t;
			}
		}
	}
	for(i=0;i<N;i++){
		printf("%d ",a[i]);
	}
	printf("\n");
	
	return 0;
}

019 二维数组行列元素互换

【题目】将一个二维数组行与列的元素互换,存到另一个二维数组中,比如:

$$
a = \left[ \begin{matrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{matrix} \right] b = \left[ \begin{matrix} 1 & 4 \\ 2 & 5 \\ 3 & 6 \end{matrix} \right]
$$

【代码】

#include <stdio.h> 
#define M 2
#define N 3

int main(){
	
	int a[M][N] = {{1,2,3},{4,5,6}};
	int b[N][M];
	int i,j;
	printf("array a:\n");
	for(i=0;i<M;i++){
		for(j=0;j<N;j++){
			printf("%5d",a[i][j]);
			b[j][i] = a[i][j];
		}
		printf("\n");
	}
	printf("array b:\n");
	for(i=0;i<N;i++){
		for(j=0;j<M;j++){
			printf("%5d",b[i][j]);
		}
		printf("\n");
	}
	return 0;
}

020 输出已知的字符串

【题目】输出一个已知的字符串。

【代码】

  • Example 01:利用字符数组

#include <stdio.h>

int main(){
	char c[15] = {'I',' ','a','m'};
	int i;
	for(i=0;i<15;i++){
		printf("%c",c[i]);
	}
	printf("\n");
	return 0;
} 
  • Example 02:

#include <stdio.h>

int main(){
	char c[15] = {"I am"};
	printf("%s\n",c);
	return 0;
} 
  • Example 03:使用 puts(str);

#include <stdio.h>

int main(){
	char c[15] = {"I am"};
	puts(c);
	return 0;
} 

021 统计单词个数

【题目】输入一行字符,统计其中有多少个单词,单词之间用空格分隔开。

【思路】

【代码】

#include <stdio.h> 

int main(){
	char string[81];
	int i,num = 0,word = 0;
	char c;
	gets(string);
	for(i=0;(c=string[i])!='\0';i++){
		if(c == ' '){
			word = 0;
		}else if(word == 0){
			word = 1;
			num++;
		}
	}
	printf("There are %d words in this line.\n",num);
	
	return 0;
}

022 字符串中找最大者

【题目】有3个字符串,要求找出其中最大者

【思路】

【代码】

#include <stdio.h>
#include <string.h> 

int main(){
	char str[3][20];	//定义二维字符数组 
	char string[20];	//定义一维字符数组,作为交换字符串时候的临时字符数组	 
	int i;
	for(i=0;i<3;i++){
		gets(str[i]);
	}
	if(strcmp(str[0],str[1])>0){
		strcpy(string,str[0]);
	}else{
		strcpy(string,str[1]);
	}
	if(strcmp(str[2],string)>0){
		strcpy(string,str[2]);
	}
	printf("\nThe largest string is:%s\n",string);
	
	return 0;
}

023 筛选法求素数

【题目】用筛选法求 100 之内的素数

【代码】

#include <string.h> 

int main(){
	int i,j,a[100];
	for(i=2;i<100;i++){
		a[i] = i;
		for(j=2;j<=i;j++){
			if(j<i && a[i]%j==0){
				break;
			}
			if(a[i] == j){
				printf("%5d",a[i]);
			}
		}
		
	}
	return 0;
}

024 选择法排序

【题目】用选择法对 10 个整数排序

【代码】

  • Example 01:

#include <stdio.h>
#include <string.h> 

int main(){
	int i,j,a[10],t;
	for(i=0;i<10;i++){
		scanf("%d",&a[i]);
	}
	for(j=1;j<10;j++){
		for(i=0;i<10-j;i++){
			if(a[i]>a[i+1]){
				t = a[i];
				a[i] = a[i+1];
				a[i+1] = t;
			}
		}
	}
	for(i=0;i<10;i++){
		printf("%5d",a[i]);
	}
	return 0;
}
  • Example 02:

#include <stdio.h>
#define N 10

void sort(int array[],int n);

int main(){
	int a[N];
	int i;
	for(i=0;i<N;i++){
		scanf("%d",&a[i]);
	}
	sort(a,N);
	for(i=0;i<N;i++){
		printf("%d ",a[i]);
	}
	printf("\n");
	return 0;
}

void sort(int array[],int n){
	int i,j,k,t;
	for(i=0;i<n-1;i++){
		k = i;
		for(j=i+1;j<n;j++){
			if(array[j]<array[k]){
				k = j;
			}
		}
		t = array[k];
		array[k] = array[i];
		array[i] = t;
	}
}

025 对角线元素之和

【题目】求一个3×3矩阵对角线元素之和

【代码】

#include <stdio.h>
#include <string.h> 

int main(){
	int i,j,a[3][3],s1,s2;
	for(i=0;i<3;i++){
		for(j=0;j<3;j++){
			scanf("%d",&a[i][j]);
		}
	} 
	s1 = a[0][0] + a[1][1] + a[2][2];
	s2 = a[0][2] + a[1][1] + a[2][0];
	printf("s1 = %d, s2 = %d\n",s1,s2);
	return 0;
}

026 用递归方法求 n!

【题目】用递归方法求 n!

【思路】

image-20200318165046564

【代码】

#include <stdio.h>
int fac(int n); 

int main(){
	int n;
	int y;
	scanf("%d",&n);
	y = fac(n);
	printf("%d!=%d\n",n,y);
	
	return 0;
}

int fac(int n){
	int f;
	if(n<0){
		printf("n<0,data error!");
	}else if(n==0||n==1){
		f = 1;
	}else{
		f = fac(n-1)*n;
	}
}

027 Hanoi(汉诺)塔问题

【题目】

image-20200318170450483

【代码】

#include <stdio.h>

void hanoi(int n,char one,char two,char three);
void move(char x,char y);
 
int main(){
	int m;
	scanf("%d",&m);
	hanoi(m,'A','B','C');
	return 0;
}

void hanoi(int n,char one,char two,char three){
	if(n == 1){
		move(one,three);
	}else{
		hanoi(n-1,one,three,two);
		move(one,three);
		hanoi(n-1,two,one,three);
	}
}

void move(char x,char y){
	printf("%c->%c\n",x,y);
}

028 数组输出元素

【题目】输入10个数,要求输出其中值最大的元素和该数是第几个数。

【代码】

#include <stdio.h>
#define N 10

int max(int x,int y);

int main(){
	int a[N];
	int i,t,number = 0;
	printf("enter 10 integer numbers:");
	for(i=0;i<N;i++){
		scanf("%d",&a[i]);
	} 
	printf("\n");
	t = a[0];
	for(i=1;i<N;i++){
		if(max(t,a[i])>t){
			t = max(t,a[i]);
			number = i;
		}
	}
	printf("The largest number is %d\nit is the %d number.\n",t,number+1);
	return 0;
}

int max(int x,int y){
	return x>y?x:y;
}

029 删除字符串中指定字符

【题目】有一个字符串,内有若干个字符,现输入一个字符,要求程序将字符串中该字符删去。

【代码】

#include <stdio.h>
#define N 80

void enterString(char str[]);
void deleteString(char str[],char ch);
void printString(char str[]);

int main(){
	char c,str[N];
	enterString(str);
	scanf("%c",&c);  //要求删的字符
	deleteString(str,c);
	printString(str); 
	return 0;
}

void enterString(char str[]){
	gets(str);
}

void deleteString(char str[],char ch){
	int i,j;
	for(i=0,j=0;str[i]!='\0';i++){
		if(str[i]!=ch){
			str[j++] = str[i];
		}
	}
	str[j] = '\0';
}

void printString(char str[]){
	printf("%s\n",str);
}

030 指针访问整型变量

【题目】通过指针变量访问整型变量

【代码】

#include <stdio.h>

int main(){
	int a = 100;
	int *p;
	p = &a;
	printf("*p = %d\n",*p);
	return 0;
}

031 逆序的三位数

【题目】

程序每次读入一个正三位数,然后输出逆序的数字。

注意,当输入的数字含有结尾的 0 时,输出不应带有前导的 0 。比如输入 700 ,输出应该是 7 。

提示:用 %10 可以得到个位数,用 /100 可以得到百位数...。将这样得到的三个数字合起来:百位 * 100 + 十位 * 10 + 个位,就得到了结果。

【输入格式】

每个测试是一个3位的正整数。

【输出格式】

输出逆序的数。

【输入样例】

123

【输出样例】

321

【时间限制】

500ms内存限制:32000kb

【参考代码】

  • C 版

#include <stdio.h>
int main()
{
    int t1,t2,mt1,mt2,mt3;
    
    scanf("%d",&t1);	//输入
     
    mt1=t1/100; mt2=(t1-mt1*100)/10; mt3=t1%10;
    t2=mt3*100+mt2*10+mt1;
    
    printf("%d\n",t2);	//输出
     
    return 0;
}

032 数位数

  • Example 01:先判断后执行

int main()
{
	int x;
	int count = 0;
	
	printf("请输入一个任意数:"); 
	scanf("%d",&x); 
	
	count++;
	x /= 10;
	while(x > 0)
	{
		count++;
		x /= 10;
	}
	
	printf("该数有 %d 位!\n",count);
    
    return 0;
}
  • Example 02:先执行后判断

#include <stdio.h>
//数位数 
int main()
{
	int x;
	int count = 0;
	
	printf("请输入一个任意数:"); 
	scanf("%d",&x); 
	
	do
	{
		x /= 10;
		count++;
	}while(x>0);
	
	printf("该数有 %d 位!\n",count);
    
    return 0;
}

033 求阶乘n!

【题目】写一个程序,让用户输入n,然后计算输出n! 【代码】

  • Example 01:

#include <stdio.h>
//求阶乘n! 
//题目:写一个程序,让用户输入n,然后计算输出n! 
int main()
{
	int n;
	int i=1;
	int fact = 1;//阶乘 
	
	printf("请输入一个任意数n:"); 
	scanf("%d",&n); 
	
/*	while(i<=n)
	{
		fact *= i; 
		i++;
	}*/
	for(i=2;i<=n;i++)
	{
		fact *= i; 
	}
	
	printf("%d!= %d\n",n,fact);
    
    return 0;
}
  • Example 02:

#include <stdio.h>

int main()
{
	int n;
	int i=1;
	int fact = 1;//阶乘 
	
	printf("请输入一个任意数n:"); 
	scanf("%d",&n); 
	
	for(i=n;i>1;i--)
	{
		fact *= i; 
	}
	
	printf("%d!= %d\n",n,fact);
    
    return 0;
}

034 猜数游戏

【题目】系统随机生成数字,猜数字

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

//主函数 
int main(){
	
	srand(time(0));
	int number = rand()%100 + 1;//[0,100]
	int count = 0;
	int a = 0;
	
	printf("我已经想好了一个1到100之间的数。");
	 
	do{
		printf("请猜这个1到100之间的数:");
		scanf("%d",&a);
		
		count++;
		if(a>number){
			printf("你猜的数大了\n"); 
		} else if(a<number){
			printf("你猜的数小了\n"); 
		}
	}while(a!=number);
	
	printf("太好了,你用了 %d 次就猜到了答案。\n",count);
	
	return 0;
}

035 整数逆序

  • 001 逻辑一样,但是这个地方用到了循环结构

#include <stdio.h>

//主函数 
int main(){
	
	int x,digit;
	int result = 0;
	
	scanf("%d",&x);
	
	while(x>0){
		digit = x%10;
		result = result*10 + digit;
		x /= 10;
	}
	
	printf("%d",result);
	
	return 0;
}

036 判断素数

  • Example 01

#include <stdio.h>

//主函数 
int main(){
	
	int x;
	int i;
	
	scanf("%d",&x);
	
	for(i=2;i<x;i++){
		if(x%i == 0){
			break;
		}
	}
	
	if(i<x){
		printf("%d 不是素数",x);
	}else{
		printf("%d 是素数",x);
	}
	
	return 0;
}

  • Example 02

#include <stdio.h>

//主函数 
int main(){
	
	int x;
	int i;
	int isPrime = 1;
	
	scanf("%d",&x);
	
	for(i=2;i<x;i++){
		if(x%i == 0){
			isPrime = 0;
            break;
		}
	}
	
	if(isPrime == 1){
		printf("%d 是素数",x);
	}else{
		printf("%d 不是素数",x);
	}
	
	return 0;
}

  • Example 03:使用子函数调用的方式:去掉偶数,从3到x-1,每次加2

int isPrime(int x){
    int result = 1;
    int i;
    if(x == 1 || (x%2 == 0 && x != 2)){
        result = 0;
    }
    for(i=3;i<x;i+=2){
        if(x%i == 0){
            result = 0;
            break;
        }
    }
    return result;
}

  • Example 04:无须到x-1,到sqrt(x)就够了

int isPrime(int x){
    int result = 1;
    int i;
    if(x == 1 || (x%2 == 0 && x != 2)){
        result = 0;
    }
    for(i=3;i<sqrt(x);i+=2){
        if(x%i == 0){
            result = 0;
            break;
        }
    }
    return result;
}

注:sqrt(x) 返回类型 double,引入 #include <math.h>

  • Example 05:判断是否能被已知的且<x的素数整除

#include <stdio.h>

int isPrime(int x,int knownPrimes[],int numberOfKnownPrimes);

int main(){
	
	const int number = 100;
	int prime[number];
	prime[0] = 2;
	int j;
	for(j=1;j<number;j++){
		prime[j] = 0;
	}
	int count = 1;
	int i = 3;
	while(count < number){
		if(isPrime(i,prime,count)){
			prime[count++] = i;
		}
		i++;
	} 
	for(i=0;i<number;i++){
		printf("%d",prime[i]);
		if((i+1)%5){
			printf("\t");
		}else{
			printf("\n");
		}
	}
	
	return 0;
}

int isPrime(int x,int knownPrimes[],int numberOfKnownPrimes){
	int result = 1;
	int i;
	for(i=0;i<numberOfKnownPrimes;i++){
		if(x%knownPrimes[i]==0){
			result = 0;
			break;
		}
	}
	return result; 
}

037 输出100以内的素数

#include <stdio.h>

//主函数 
int main(){
	
	int x;
	
	for(x=2;x<100;x++){
		int i;
		int isPrime = 1;
		for(i=2;i<x;i++){
			if(x%i == 0){
				isPrime = 0;
				break;
			}
		}
	
		if(isPrime==1){
			printf("%d ",x);
		}
	}
	printf("\n");
		
	return 0;
}

038 凑硬币

【题目】如何用1角、2角和5角的硬币凑出10元以下的金额呢?

【代码】

#include <stdio.h>

//主函数 
int main(){
	
	int x;
	int one,two,five;
	
	scanf("%d",&x);
	
	for(one=1;one<x*10;one++){
		for(two=1;two<x*10/2;two++){
			for(five=1;five<x*10/5;five++){
				if(one+two*2+five*5==x*10){
					printf("%d 个1角 + %d 个2角 + %d 个5角 = %d 元\n",one,two,five,x);
				}
			}
		}
	}
		
	return 0;
}

039 求平均数

  • Example 01:

#include <stdio.h>

int main(){
	
	int number;
	int sum = 0;
	int count = 0;
	do{
		scanf("%d",&number);
		
		if(number != -1){
			sum += number;
			count ++;
		}
	}while(number != -1);
	
	printf("%f\n",1.0*sum/count);	
	return 0;
}

  • Example 02:

#include <stdio.h>
 
int main(){
	
	int number;
	int sum = 0;
	int count = 0;
	
	scanf("%d",&number);
		
	while(number != -1){
		sum += number;
		count ++;
		scanf("%d",&number);
	}
	
	printf("%f\n",1.0*sum/count);	
	return 0;
}

040 水仙花数

【题目】计算所有N位水仙花数

【说明】水仙花数是指一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身。

【输入格式】

输入在一行中给出一个正整数N(3<=N<=7)

【输出格式】

按递增顺序输出所有N位水仙花数,每个数字占一行

【代码】

  • Example 01:

#include <stdio.h>

int main()
{
	int n;
	int first = 1;
	int i = 1;	
	scanf("%d",&n);	
	while(i<n){
		first *= 10;
		i++;
	}
	//遍历100-999
	i = first;
	while(i<first*10){
		int t = i;
		int sum = 0;
		do{
			int d = t%10;
			t /= 10;
			int p = 1;
			int j = 0;
			//int p = d;
			//int j = 1;
			while(j<n){
				p *= d;
				j++;
			}
			sum += p;
		} while(t>0);
		if(sum == i){
			printf("%d\n",i);
		}
		i++;
	} 
    
    return 0;
}

041 打印九九乘法表

  • Example 01:

#include <stdio.h>

int main()
{
	int n;
	scanf("%d",&n); 
	int i,j;
	i=1;
	while(i<=n){
		j=1;
		while(j<=i){
			printf("%d*%d=%d",j,i,i*j);
			if(i*j<10){
				printf("   ");
			}else{
				printf("  ");
			}
			j++;
		}
		printf("\n");
		i++;
	}
    
    return 0;
}

042 统计素数并求和

【题目】要求统计给定整数M和N区间内素数的个数并对它们求和。

【代码】

  • Example 01:

#include <stdio.h>

int main()
{
	int m,n;
	int i;
	int count = 0;
	int sum = 0;
	
	scanf("%d %d",&m,&n); 
	
	if(m==1){
		m=2;
	}
	for(i=m;i<=n;i++){
		int isPrime = 1;
		int k;
		for(k=2;k<i-1;k++){
			if(i%k == 0){
				isPrime = 0;
				break;
			}
		}
		//判断i是否素数
		if(isPrime){
			count++;
			sum += i;
		}		
	}
	
	printf("%d %d\n",count,sum);
	
    return 0;
}
  • Example 02:

#include <stdio.h>

int isPrime(int i){
	int result = 1;
	int k;
	for(k=2;k<i-1;k++){
		if(i%k == 0){
			result = 0;
			break;
		}
	}
	return result;
}

int main(){
	int m,n;
	int i;
	int count = 0;
	int sum = 0;
	
	scanf("%d %d",&m,&n); 
	
	if(m==1){
		m=2;
	}
	for(i=m;i<=n;i++){
		
		//判断i是否素数
		if(isPrime(i)){
			count++;
			sum += i;
		}		
	}
	
	printf("%d %d\n",count,sum);
	
    return 0;
}

043 猜数游戏

【题目】

image-20200301210457942

【代码】

  • Example 01:

#include <stdio.h>

int main()
{
	int number,n;
	int inp;
	int finished = 0;
	int cnt = 0;
	scanf("%d %d",&number,&n);
	do{
		scanf("%d",&inp);
		cnt++;
		if(inp<0){
			printf("Game Over\n");
			finished = 1;
		}else if(inp>number){
			printf("Too big\n");		
		}else if(inp<number){
			printf("Too small\n");
		}else{
			if(cnt==1){
				printf("Bingo!\n");
			} else if(cnt<=3){
				printf("Lucky You!\n");
			}else{
				printf("Good Guess!\n");
			}
			finished = 1;
		} 
		if(cnt==n){
			if(!finished){
				printf("Game Over\n");
				finished = 1;
			}
		}
	} while(!finished);
	
    return 0;
}

044 求序列前N项和

【题目】计算序列2/1+3/2+5/3+8/5+...的前N项之和。

【代码】

  • Example 01:

#include <stdio.h>

int main()
{
	int n;
	double dividend,divisor;
	double sum = 0.0;
	int i;
	double t;
	scanf("%d",&n);
	dividend = 2;
	divisor = 1;
	for(i=1;i<=n;i++){
		sum += dividend/divisor;
		t = dividend;
		dividend += divisor;
		divisor = t;
	} 
	printf("%.2f\n",sum);
	
    return 0;
}

045 约分最简分式

【代码】

  • Example 01:

#include <stdio.h>

int main()
{
	int dividend,divisor;
	scanf("%d/%d",&dividend,&divisor);
	int a = dividend;
	int b = divisor;
	int t;
	while(b>0){
		t = a%b;
		a = b;
		b = t;
	}
	printf("%d/%d\n",dividend/a,divisor/a);
	
    return 0;
}

046 念数字

【题目】输入一个整数,输出每个数字对应的拼音

【代码】

  • Example 01:

#include <stdio.h>

int main()
{
	int x;
	scanf("%d",&x);
	if(x<0){
		printf("fu ");
		x = -x;
	}
	int mask = 1;
	int t = x;
	while(t>9){
		t /= 10;
		mask *= 10;
	}
	do{
		int d = x / mask;
		switch(d){
			case 0: printf("ling");break;
			case 1: printf("yi");break;
			case 2: printf("er");break;
			case 3: printf("san");break;
			case 4: printf("si");break;
			case 5: printf("wu");break;
			case 6: printf("liu");break;
			case 7: printf("qi");break;
			case 8: printf("ba");break;
			case 9: printf("jiu");break;
		}
		if(mask>9){
			printf(" ");
		}
		x %= mask;
		mask /= 10;
	}while(mask>0);
	printf("\n"); 
	
    return 0;
}

047 求a的连续和

【题目】S = a + aa + aaa + ... +aaa...a(n个a)

例如:S = 2 + 22 + 222 (3个2)

【代码】

  • Example 01:

#include <stdio.h>

int main()
{
	int a,n;
	scanf("%d %d",&a,&n);
	int sum = 0;
	int i;
	int t = 0;
	for(i=0;i<n;i++){
		t = t*10 + a;
		sum += t;
	} 
	printf("%d\n",sum);
	
    return 0;
}

048 输出平均数和大于平均数的数

【代码】

  • Example 01:

#include <stdio.h>
 
int main(){
	
	int x;
	double sum = 0;
	int count = 0;
	int number[100];	
	scanf("%d",&x);		
	while(x != -1){
		number[count] = x;
		sum += x;
		count ++;
		scanf("%d",&x);
	}
	if(count>0){
		printf("%f\n",sum/count);
		int i;
		for(i=0;i<count;i++){
			if(number[i]>sum/count){
				printf("%d\n",number[i]);
			}
		}
	}
	
	return 0;
}

注:数据超过100时咋办?

  • Plan A:采用动态的下标

  • Plan B:进行说明,if 判断

049 统计个数

【题目】写一个程序,输入数量不确定的[0,9]范围内的整数,统计每一种数字出现的次数,输入-1表示结束

【代码】

  • Example 01:

#include <stdio.h>
 
int main(){
	
	int x;
	int count[10];
	int i;
	for(i=0;i<10;i++){
		count[i]=0;
	}
	scanf("%d",&x);
	while(x!=-1){
		if(x>=0&&x<=9){
			count[x]++;
		}
		scanf("%d",&x);
	}
	for(i=0;i<10;i++){
		printf("%d:%d\n",i,count[i]);
	}
	
	return 0;
}
  • Example 02:

#include <stdio.h>
 
int main(){
	
	const int number = 10;
	int x;
	int count[number];
	int i;
	for(i=0;i<number;i++){
		count[i]=0;
	}
	scanf("%d",&x);
	while(x!=-1){
		if(x>=0&&x<=9){
			count[x]++;
		}
		scanf("%d",&x);
	}
	for(i=0;i<number;i++){
		printf("%d:%d\n",i,count[i]);
	}
	
	return 0;
}

050 搜索数字

【题目】查找数字是否在数组中,找到返回在数组中的位置,找不到返回-1

【代码】

  • Example 01:使用数组

#include <stdio.h>

int search(int key,int a[],int length);//声明 

int main(){
	
	int a[] = {2,4,6,7,1,3,};
	int x;
	int loc;
	printf("请输入一个数字:");
	scanf("%d",&x);
	loc = search(x,a,sizeof(a)/sizeof(a[0]));
	if(loc != -1){
		printf("%d在第%d个位置上\n",x,loc);
	} else{
		printf("%d不存在\n",x);
	}
	
	return 0;
}

int search(int key,int a[],int length){
	int result = -1;
	int i;
	for(i=0;i<length;i++){
		if(a[i] == key){
			result = i;
			break;
		}
	}
	return result;
} 

051 素数表

【代码】

  • Example 01:

#include <stdio.h>

int main(){
	
	const int maxNumber = 100;
	int isPrime[maxNumber];
	int i;
	int x;
	for(i=0;i<maxNumber;i++){
		isPrime[i] = 1;
	}
	for(x=2;x<maxNumber;x++){
		if(isPrime[x]){
			for(i=2;i*x<maxNumber;i++){
				isPrime[i*x] = 0;
			}
		}
	}
	for(i=2;i<maxNumber;i++){
		if(isPrime[i]){
			printf("%d\t",i);
		}
	}
	printf("\n");
	
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2167935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一招搞定苹果安卓跨系统传输,文件大小再也不是问题

在当今多元化的科技市场中&#xff0c;众多手机品牌竞相推出各自的产品&#xff0c;每个品牌都力图打造独特的用户体验和生态系统。然而&#xff0c;这种品牌之间的多样性也带来了一定的挑战&#xff0c;尤其是在不同品牌体系之间互联互通性方面。由于每个品牌都有自己的操作系…

VMware虚拟机Centos操作系统——配置docker,运行本地打包的镜像,进入conda环境(vmware,docker新手小白)

1.docker-centos运行sudo yum install -y yum-utils报错 遇到问题 解决&#xff1a; 进入/etc/yum.repos.d目录下找到 CentOS-Base.repo&#xff0c;执行下面两个命令&#xff1a; cp CentOS-Base.repo CentOS-Base.repo.backupvi CentOS-Base.repo 进入后改成&#x…

前缀和(4)_除自身以外数组的乘积

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 前缀和(4)_除自身以外数组的乘积 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录…

央国企董事会管理方案,数字化助力会议、制度、信披、投资全过程全方位管理

董事会建设是中国特色现代企业制度的重要内容。近日&#xff0c;国务院国资委召开中央企业董事会建设工作推进会&#xff1a;到明年年底&#xff0c;中央企业集团和二级子企业层面董事会建设要取得重要实质性进展&#xff0c;董事会制度更加健全、运行更加规范&#xff0c;作用…

如何进行光伏项目卫星踏勘?

一、卫星地图选址 1. 数据获取 卫星踏勘的第一步是获取高分辨率的卫星图像。利用卫星遥感技术&#xff0c;可以获取项目候选区域的地形地貌、植被覆盖等详细信息。这些数据通过专业的遥感图像处理软件进行分析和解译&#xff0c;提取出对光伏电站建设有重要影响的关键因素&am…

【Git使用】向Gitee/Github上传代码时配置gitignore忽略文件

概述&#xff1a; 在进行项目开发时&#xff0c;尤其是使用Git进行版本控制时&#xff0c;我们经常会遇到一些不需要上传到代码仓库的文件&#xff0c;比如编译生成的文件、临时文件、日志文件等。这时候&#xff0c;我们就需要使用.gitignore文件来忽略这些文件。本文将介绍如…

单点登录sso部署

文章目录 同域下的单点登录原理不同域下的单点登录原理 第三方 OAuth2 授权登录支持第三方登录 本地用keycloak实现1、生成证书2、编写docker-compose.yml文件3、创建持久化数据目录4、接下来启动docker-compose5、访问keycloak 单点登录英文全称Single Sign On&#xff0c;简称…

宠物浮毛难清理,希喂、小米、美的宠物空气净化器该选哪款?

养猫养出病来说的就是我了。 养猫之前幻想的一人一猫幸福生活还没一个月&#xff0c;我就进了医院。我自认为是很爱干净的人&#xff0c;养猫后打扫得更勤快了&#xff0c;早晚都给猫咪梳毛。平时卫生也没少搞&#xff0c;家里也是很干净的&#xff0c;实在不明白为什么会过敏…

语义分割性能提升---通过优化损失改进分割效果

本文主要总结最近的调研调试结果&#xff0c;介绍通过改进损失来提升语义分割的分割效果&#xff1b;当然还有其他途径&#xff0c;比如蒸馏&#xff08;提升分割效果&#xff09;、剪枝&#xff08;提升fps&#xff09;&#xff0c;之前博客有总结&#xff0c;此处不做介绍。 …

数字化AI直播系统领创者:赋能无人直播新动力,永久告别假AI!

数字化AI直播系统领创者&#xff1a;赋能无人直播新动力&#xff0c;永久告别假AI&#xff01; 在数字化浪潮汹涌的今天&#xff0c;AI技术正以前所未有的速度渗透并重塑着各行各业&#xff0c;而直播行业作为数字经济的重要组成部分&#xff0c;更是迎来了AI技术深度融合的崭…

C++类和对象第一关

一&#xff1a;类的定义 &#xff08;一&#xff09;类的定义 &#xff08;1&#xff09;类的定义格式&#xff1a; class name{ // 类成员变量 // 类方法&#xff08;函数&#xff09; }; class是定义类的关键字&#xff0c;name为定义的类的名字&#xff0c;后面的花括号…

【高中数学/对数函数/零点】已知函数f(x)=1/x-log(2,x),在下列区间中,包含f(x)零点的区间是?

【题目】 已知函数f(x)1/x-log(2,x),在下列区间中&#xff0c;包含f(x)零点的区间是&#xff1f; A.(0,1) B.(2,3) C.(3,∞) D.(1,2) 【出处】 《高考数学极致解题大招》P136 第二题 中原教研工作室编著 【解答】 零点即01/x-log(2,x),移项得1/xlog(2,x) 两曲线y1/x…

【C++习题】2.双指针_移动零

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法&#xff08;快排的思想&#xff1a;数组划分区间 - 数组分两块&#xff09;&#xff1a;C 算法代码&#xff1a;图解 题目链接&#xff1a; 283.移动零 题目描述&#xff1a; 解法&#xff08;快排的思想&#xff1a;数…

聚铭下一代智慧安全运营中心荣获CNNVD兼容性资质证书

近日&#xff0c;聚铭网络旗下安全产品——聚铭下一代智慧安全运营中心正式通过了国家信息安全漏洞库&#xff08;CNNVD&#xff09;兼容性认证测试&#xff0c;荣获国家信息安全漏洞库兼容性资质证书。 关于CNNVD兼容性 国家信息安全漏洞库&#xff08;CNNVD&#xff09;是…

Iceberg 基本操作和快速入门

安装 Iceberg 是一种适用于大型分析表的高性能工具&#xff0c;通过spark启动并运行iceberg&#xff0c;文章是通过docker来进行安装并测试的 新建一个docker-compose.yml文件 文件内容 version: "3" services: spark-iceberg: image: tabulario/spark-iceberg co…

干部画像如何精准科学识别优秀干部

干部画像作为一种精准、科学的评价工具&#xff0c;在识别优秀干部方面发挥着关键作用。通过全面、深入、系统地收集、整理和分析干部的多维度信息&#xff0c;形成一幅反映干部综合素质和能力的立体画卷&#xff0c;为组织部门提供了详实可靠的依据。以下是干部画像在精准、科…

Colorful/七彩虹将星X15 AT22 2022 Win11原厂OEM系统 带COLORFUL一键还原

安装完毕自带原厂驱动和预装软件以及一键恢复功能&#xff0c;自动重建COLORFUL RECOVERY功能&#xff0c;恢复到新机开箱状态。 【格式】&#xff1a;iso 【系统类型】&#xff1a;Windows11 原厂系统下载网址&#xff1a;http://www.bioxt.cn 注意&#xff1a;安装系统会…

Exception in thread “main“ java.lang.CloneNotSupportedException 解决方案

目录 前言&#xff1a; 解决方案 后言&#xff1a; 结言&#xff1a; 前言&#xff1a; 今天在学习设计模式的时候&#xff0c;犯的一个错误。很低级的错误&#xff0c;不过也记录一下&#xff08;绝对不是想水文章&#xff09;。 解决方案 在使用克隆方法时抛出这个异…

2024年第五届电力工程国际会议(ICPE 2024)将在上海召开!

为了总结交流我国电力研究技术的最新研究成果&#xff0c;促进国内外电力技术发展与交流&#xff0c;开拓电力技术应用领域&#xff0c;将于2024年12月13-15日在 中国上海举办第五届电力工程国际会议 (ICPE 2024) 。 本次会议由IEEE、PES、上海电力大学主办&#xff0c;电子科技…

猜想的反例:DFS中结点顺序与后代关系的分析

猜想的反例:DFS中结点顺序与后代关系的分析 猜想分析与反例构造反例描述伪代码与C代码实现反例验证在图论中,深度优先搜索(DFS)是一种重要的图遍历算法,它可以生成一棵深度优先森林(DFS Forest),揭示结点之间的祖先-后代关系。本文探讨一个特定猜想:如果有向图G包含一…