首页 > 其他分享 >C语言100道基础拔高题(1)

C语言100道基础拔高题(1)

时间:2024-07-23 18:54:19浏览次数:16  
标签:num1 拔高 int C语言 ge printf 100 num2 输入

1.有1,2,3,4这几个数字,问能组成多少个互不相同且无重复数字的三位数?

        解题思路:首先输出由这几个数字所组成的所有三位数,接着再设置条件,使其输出的三位数不重复,下面我们来看下源代码。值得注意的是:所以题目的代码都是作者自行编写,如有更好的思路或者代码的优化,还请指出更正。

        

#include <stdio.h>

int main() {
	//有1,2,3,4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少
	//思路:首先输出所有由1,2,3,4组成的三位数,接着设置条件,只有不重复的三位数才打印出来
	
	//定义三个变量,分别表示百位,十位,个位
	int bai;
	int shi;
	int ge;
	int count = 0;
	//外层循环表示百位上的数,里层循环分别表示十位,个位
	for ( bai = 1; bai < 5; bai++) {
		for ( shi = 1; shi < 5; shi++) {
			for ( ge = 1; ge< 5; ge++) {
				if (bai != shi && bai != ge && shi != ge) {
					printf("%d%d%d\n", bai, shi, ge);
					count++;
				}
			}
		}
	}
	printf("这样不重复的三位数一共有%d\n个", count);
	return 0;
}

2. 有一个整数加上100后是一个完全平方数,再加上168又是一个完全平方数。请问该数是多少?

                解题思路:因为题目中涉及到了完全平方数,所以可以使用math库中的求平方的方法sqrt。下面我们来看下源代码:

#include<stdio.h>
#include<math.h>
int main() {
	//有一个整数加上100后是一个完全平方数,再加上168又是一个完全平方数
	//请问该数是多少?
	//整体思路就是使用math库中的求平方方法sqrt
	int n;
	int num1;
	int num2;

	for (int i = 1; i < 10000; i++) {
		//这里使用强制转换一方面是因为num1,num2是int类型的,还有一方面就是完全平方数的结果也是整数形式的
		//就算有小数的平方等于i+100,在转为整数后,也会在if语句中被筛选出去
		 num1 = (int)sqrt(i + 100);
		 num2 = (int)sqrt(i + 268);

		if (num1 * num1 == i + 100 && num2 * num2 == i + 268) {
			n = i;
			break;
		}
	}
	printf("这个整数是%d\n", n);
	return 0;

}

3. 输入某年某月某日,判断这一天是这一年的第几天?

             解题思路:由于存在闰年和平年,所以我们需要先对输入的年份进行判断,如果是闰年则二月的天数会由28天变为29天。接着计算所输入的月份和日份距离1月1日过去了多少天,就是这一年的第几天。下面我们来通过代码掌握本题:

int main() {
	//输入某年某月某日,判断这一天是这一年的第几天
	//首先接收键盘录入的年份,判断它是否是闰年,如果是闰年,则二月份的天数加一
	int year;
	//将一年中每一月的天数放到一个months数组当中,在下面判断闰年的时候,如果是闰年,就修改1索引处的值为29
	int months[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	printf("请输入年份:\n");
	scanf("%d", &year);
	if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {
		printf("该年是闰年,二月份天数加一\n");
		months[1] = 29;
	}

	//定义month和day两个变量用来接收用户输入的月和日
	int month;
	int day;
	//days变量用来存放多少天
	int days = 0;
	printf("请输入月份:\n");
	scanf("%d", &month);
	printf("请输入这是该月的几号:\n");
	scanf("%d", &day);

	//计算这一天是这一年的第几天
	//for循环求出这一月以前的天数
	for (int i = 0; i < month - 1; i++) {
		days += months[i];
	}
	//最后求出这一月的天数,也就是输入的日
	days = days + day;

	printf("这一天是这一年的第%d天\n", days);
	return 0;

}

4. 输入三个整数x,y,z,并把它们按从小到大的顺序打印出来

               解题思路:可以设置两个函数,分别求出最大值和最小值,接着可以利用三个整数之和减去最大值和最小值也就得到了中间值。最后按最小值,中间值,最大值的顺序打印即可。也可以设置判断条件来得到中间值。源代码如下:

#include<stdio.h>
int getMax(int num1, int num2);

int main() {
	//输入三个整数x,y,z,并把它们按从小到大的顺序打印出来
	//首先从键盘获取到这三个整数
	int x;
	int y;
	int z;
	printf("请输入三个整数x,y,z:\n");
	scanf("%d,%d,%d", &x, &y, &z);
	//要求输入三个不一样的整数,如果有相同的则会要求重新输入
	while (x == y || x == z || y == z||x==y==z) {
		printf("请重新输入三个不一样的整数:\n");
		scanf("%d,%d,%d", &x, &y, &z);
	}

	//接着可以设置一个函数,该函数用来求两个数的最大值,最小值
	int max = getMax(x, y) > z ? getMax(x, y) : z;
	int min = getMin(x, y) < z ? getMin(x, y) : z;
	int mid;
	//下面便是通过判断值是否是最大值或者最小值,如果不是最大值和最小值,那么这个值就一定是中间值。
	if (x != max && x != min) {
		mid = x;
	}
	else if (y != max && y != min) {
		mid = y;
	}
	else {
		mid = z;
	}
	
	printf("将它们按从小到大的顺序打印结果为:%d %d %d", min, mid, max);
	return 0;
}

//得到两个数的最大值
int getMax(int num1, int num2) {
	if (num1 > num2) {
		return num1;
	}
	return num2;
}
//得到两个数的最小值
int getMin(int num1, int num2) {
	if (num1 < num2) {
		return num1;
	}
	return num2;
}

5. 用符号*输出一个字母C

        解题思路:可以通过自己调试来设置需要多少行的*,以及每一行需要多少个*.源代码如下所示:

 

int main() {
	//用*输出一个字母C的图案
	int m = 5;
	for (int i = 0; i < m; i++) {
		printf("*");
	}
	printf("\n");
	for (int i = 0; i < m - 2; i++) {
		printf("*\n");
	}
	
	for (int i = 0; i < m; i++)
	{
		printf("*");
	}

	return 0;


}

6. 输出九九乘法表

        解题思路:通过观察九九乘法的结构,用一个外层循环来赋值给第一个乘数,用里层循环来赋值给第二个乘数。并用两个循环控制每一行输出的内容。下面我们来看下源代码:

 

int main() {
	//输出9*9乘法表
	for (int i = 1; i <= 9; i++) {
		for (int j = 1; j <= i; j++) {
			printf("%d*%d=%d\t", j, i, j * i);
		}
		printf("\n");
	}
}

7. 判断101~200之间有多少个素数?并一一列举出来

                解题思路:首先确定好区间,接着判断是否是素数,素数就是一个大于1的数,除了1和它本身之外,不能被其他数整除。下面我们来看下源代码:

int main() {
	//判断101~200之间有多少个素数,并列举出来
	//设置一个初始值count用来存放素数的个数
	int count = 0;
	
	for (int i = 101; i <= 200; i++)
	{
		//这里我们的flag需要定义在循环里面,外层循环每循环一次就给flag重新赋值
		//避免了因为出现一次flag=0的情况,flag就一直是0了。
		int flag = 1;
		for(int j=2;j<i;j++)
		{
			if (i % j == 0) {
				flag = 0;   //不是素数就将flag置为0
			}
		}
		if (flag) {			//如果是素数,则flag的值不会被修改,因此直接打印出对应的i值,就是我们要求的一个数据。
			printf("%d\n", i);
			count++;
		}
		
	}
	
	printf("101~200之间总共有%d个素数", count);
	return 0;
}

8.  打印出所有的水仙花数。

                解题思路:所谓的水仙花数是指一个三位数,其各位数字的立方和等于这个数的本身。我们可以通过得到这个三位数每一位上的数字,再对它进行计算判断。源代码如下:

int main() {
	//打印出所有的水仙花数
	//所谓的水仙花数是指一个三位数,其各位数字的立方和等于这个数的本身
	//例如,153=1的三次方+5的三次方+3的三次方,所以它是水仙花数
	int count = 0;
	for (int i = 100; i < 1000; i++) {
		int bai = i / 100;
		int shi = i / 10 % 10;
		int ge = i % 10;
		if (bai * bai * bai + shi * shi * shi + ge * ge * ge == i) {
			printf("%d是水仙花数\n", i);
			count++;
		}
	}
	printf("一共有%d个水仙花数", count);
	return 0;

}

9.  将一个正整数分解成质因数,例如输入90,会打印90=2*3*3*5

                解题思路:首先找到能整除这个正整数的最小正数,接着重置循环初值,让它继续查找最小正数,最后将得到的所有正数放到一个数组里,最后设置好格式之后循环打印出来。源代码如下:

#include<stdio.h>
#include<math.h>
int main() {
	//将一个正整数分解成质因数,例如输入90,会打印出90=2*3*3*5;
	
	int num;

	//定义一个count变量来记录一共有多少个质因数
	int count=0;

	//定义一个数组来存放质因数
	int str[10] = {0};

	//获取输入的正整数
	printf("请输入一个正整数:");
	scanf("%d", &num);

	//定义一个新变量来保存输入的正整数,防止上面的num变量值被修改,而导致输入的正整数丢失
	int beginnum = num;

	for (int i = 2; i <=num; i++) {
		if (num % i == 0) {
			num = num / i;		//每得到一个质因数,就要修改num的值,继续找下一个质因数
			str[count] = i;		
			count++;
			i = 1;		  //重新给i赋值,让它重新从2开始找整数的质因数
		}
	}

	//最后打印结果
	printf("%d=%d", beginnum, str[0]);

	for (int i = 1; i < count; i++) {
			printf("*%d", str[i]);
		}

	

	return 0;

}

10.  利用条件运算符的嵌套来完成此题:学习成绩大于90分的同学用A表示,60~89分之间的用B表示,60分以下的用C表示。   (a>b)?a:b这是条件运算符的基本例子

                解题思路:可以按照顺序一步一步来判断,首先判断是否大于90,如果大于就输出A;如果小于则继续判断。源代码如下:
 

#include<stdio.h>

int main() {
	//利用条件运算符的嵌套来完成此题:学习成绩大于90分的同学用A表示
	//60~89分之间的用B表示,60分以下的用C表示
	//(a>b)?a:b这是条件运算符的基本例子
	int score;
	printf("请输入学生的成绩:\n");
	scanf("%d", &score);

	char result=(score >= 90) ? 'A' : (score > 60) ?  'B' : (score < 60) ? 'C' : -1;
	printf("该学生的成绩等级为:%c", result);
	return 0;
}

 

 

 

标签:num1,拔高,int,C语言,ge,printf,100,num2,输入
From: https://blog.csdn.net/2303_78660417/article/details/140639431

相关文章

  • C语言100道基础拔高题(2)
    1.求两个数的最小公倍数和最大公约数        解题思路:求最小公倍数可以通过两个数的积再除以最大公约数来计算。而最大公约数则可以通过辗转相除法(又名欧几里得算法)来得到。源代码如下:#include<stdio.h>intmain(){ //程序分析:最小公倍数=两个数的积除以......
  • C语言100基础拔高题(3)
    1.利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。                 解题思路:通过反复调用一个打印最后一个元素的函数,来实现此功能。源代码如下:#include<stdio.h>voidoposize(charstr[],intlen);intmain(){ //利用......
  • C语言程序设计第三讲:选择结构程序设计
    1.选择结构概述定义与重要性:选择结构使得程序可以根据不同的条件执行不同的代码段。2.if语句详解基本形式:if(表达式)语句;:当表达式为真时执行语句。基本形式示例:inta=10;if(a>5){printf("aisgreaterthan5\n");}扩展形式:if(表......
  • 【时时三省】(C语言基础)操作符
    山不在高,有仙则名。水不在深,有龙则灵。              ——csdn时时三省操作符~按(二进制)位取法把所有二进制位中数字,1变成0,0变成1比如把0按位取法a=0二进制:00000000000000000000000000000000把0变成111111111111111111111111111111111~a(补......
  • C语言 结构体——《跟老吕学C》
    C语言结构体——《跟老吕学C》C语言结构体一、C语言结构体的基本概念二、C语言结构体的定义与初始化1.结构体的定义2.结构体的初始化3.结构体的初始化(指定成员)4.结构体数组的初始化5.结构体指针的初始化6.注意事项三、C语言结构体的使用1.访问结构体的成员2.......
  • C语言分支循环语句
    写博客太麻烦了,感觉要等转完专业之后才会写得多一点目前我知道c的分支有if,switchIf 的语句结构大致如下:if(3==3//判断,0为假,非0为真){//判断结果为真之后,运行的表达式printf("nb");}if语句中判断相等要用“==”,“=”表示赋值。除此之外多个条件可用elseif,else。e......
  • C语言-栈和队列
    文章目录......
  • AP8100 外围简单的 BOOST 升压恒压控制驱动 LED 大功率升压恒流驱动芯片
    说明AP8100是一款外围电路简单的BOOST升压恒压控制驱动芯片,适用于2.8-40V输入电压范围的升压恒压电源应用领域,启动电压可以低至2.5V。芯片会根据负载的大小自动切换PWM,PFM和BURST模式以提高各个负载端的电源系统效率。本芯片可以通过EN脚实现低待机关机功能,当......
  • C语言知识大闯关之一维数组
    引言数组由数据类型相同的一系列的数据组成;-数组存放的是一个或多个数据,但是数组内元素的个数不能为零。-数组存放的元素类型是相同的。数组分为一维数组和多维数组;本章我们讲解的是一位数组。一维数组的创建和初始化一维数组创建C语言中,需要使用数组时,通过声明告......
  • Python从0到100(四十五):从字符串到前后端分离
    前言:零基础学Python:Python从0到100最新最全教程。想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Python爬虫、Web开发、计算机视觉、机器学习、神经网络以及人工智能相关知......