c语言经典例题总结,主要是循环和判断,请各位大佬多多指教,如果有帮助,可以给俺点个赞,谢谢各位。
#ifndef METHOD_H_INCLUDED
#define METHOD_H_INCLUDED
#include<stdio.h>
#include<math.h>
#include<conio.h>
//1~4组成无重复数字的三位数
void getData();
/*利润(I)低于或等于10万元时,奖金可提10%;
利润高于10万元,低于20万元时,低于10万元的部分按10%提成,
高于10万元的部分,可提成7.5%;
20万到40万之间时,高于20万元的部分,可提成5%;
40万到60万之间时高于40万元的部分,可提成3%;
60万到100万之间时,高于60万元的部分,可提成1.5%,
高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?*/
void getProfit();
//一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
void squareNumber();
//年月日及年份的第几天判断
void getYearMonthDay();
//三个数,从小到大输出
void oneMethod();
//用*号输出字母C的图案
void starPattern();
//输出特殊字符
void printfChar();
//9*9乘法表
void multiplicationFormula();
//打印国际象棋棋盘
void chessBoard();
//兔子问题
void rabbitProblem();
//兔子问题递归求解
int RabbitRecursion(int);
//判断101到200之间的素数
void primenNumber();
//水仙花数 一个三位数,每位数的立方相加等于这个三位数
void narcissusNumber();
//将一个正整数分解质因数
void resolvingPrimeFactor();
//利用条件运算符的嵌套完成学习成绩的转换
void gradeConversion();
//求最大公约数
void greatestCommonDivisor();
//最小公倍数
void leastCommonMultiple();
//统计字符数量
void statisticalCharacter();
//求s=a+aa+aaa+aaaa+aa...a的值
void twoMethod();
//完数
void perfectNumber();
//小球自由下落
void dropOfBall();
//猴子吃桃
void monkeyEatPeach();
//两个乒乓球队进行比赛
void pingPongGame();
//打印菱形
void printDiamond();
//求数列的前20项和,2/1,3/2,5/3,8/5,、、
void getTotal();
//求1+2!+3!+...+20!的和
void getFactorial();
/*思路:
循环1-4之间三位数组成的所有可能值,
去掉重复的选项,则为需要的结果*/
void getData(){
for(int i = 1; i <= 4; i++){
for(int j = 1; j <= 4; j++){
for(int z = 1; z <= 4; z++){ //三层循列出三位数的所有排列组合
if(i != j && j != z && i != z){ //加条件去掉重复的
printf("%d%d%d ",i,j,z);
}
}
}
}
}
/*利润(I)低于或等于10万元时,奖金可提10%;
利润高于10万元,低于20万元时,低于10万元的部分按10%提成,
高于10万元的部分,可提成7.5%;
20万到40万之间时,高于20万元的部分,可提成5%;
40万到60万之间时高于40万元的部分,可提成3%;
60万到100万之间时,高于60万元的部分,可提成1.5%,
高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?*/
void getProfit(){
int p = 0;
double res = 0;
printf("请输入当月利润");
scanf("%d",&p);
if(p < 100000){
printf("%lf", p * 0.1);
}else if(p > 100000 && p < 200000){
printf("%lf", (p-100000)*0.075 + 100000 * 0.1);
}else if(p > 200000 && p < 400000){
printf("%lf",(p-200000) * 0.05 + 100000 * 0.075 + 100000 * 0.1);
}else if(p >= 400000 && p <= 600000){
printf("%lf",(p-400000) * 0.03 + 200000 * 0.05 + 100000 * 0.075 + 100000 * 0.1);
}else if(p > 600000 && p < 1000000){
printf("%lf",(p-600000) * 0.015 + 200000 * 0.03 + 200000 * 0.05 + 100000 * 0.075 + 100000 * 0.1);
}else{
printf("%lf",(p-1000000) * 0.01 +400000 * 0.015 + 200000 * 0.03 + 200000 * 0.05 + 100000 * 0.075 + 100000 * 0.1);
}
}
/*一个数据加100可以开平方再加上168还可以开平方,循环一下所有数据,挨个判断*/
void squareNumber(){
int data = 0;
while(data < 100000){ // 循环100000次
int one = sqrt(data + 100); //得出one开平方后的结果,如果有小数点,则说明不能开平方。
int two = sqrt(data + 268);
if(one * one == data + 100 && two * two == data + 268){ //判断加100后可以开平方并且加268也可以开平方,如果不能开,则会有小数点,那么再相乘也不会相等。
printf("%d ", data);
}
data++;
}
}
/*利用switch来写代码,例如3月份就是前两个月加上多少号,5月就是前四个月加上多少号*/
void getYearMonthDay(){
int year,month,day;
int count = 0;
printf("请输入年月日");
scanf("%d%d%d",&year,&month,&day);
switch(month){
case 12: count += 30;
case 11: count += 31;
case 10: count += 31;
case 9: count += 30;
case 8: count += 31;
case 7: count += 30;
case 6: count += 31;
case 5: count += 30;
case 4: count += 31;
case 3: if((year % 4==0 && year % 100 != 0) || year % 400 == 0){ //判断是否为闰年能被4整除且不能被100整除,或者能被400整除则为闰年
count += 28;
}else{
count += 29;
}
case 2: count += 31;
case 1: count += day;
}
printf("%d",count);
}
/*第一次判断将小的给a大的给b,第二次判断将小的给a大的给c,
则前两次比较最小的已经是a了,只需要判断一下后面两个*/
void oneMethod(){
int a,b,c;
printf("请输入三个数");
scanf("%d%d%d",&a,&b,&c);
if(a > b){ //小的给a
int temp = 0;
temp = b;
b = a;
a = temp;
}
if(a > c){ //小的给a,由这一步和上一步则a为最小的数
int temp = 0;
temp = c;
c = a;
a = temp;
}
if(b > c){ //比较bc大小,交换即可
int temp = 0;
temp = c;
c = b;
b = temp;
}
printf("%d %d %d", a, b, c); //按整数类型输出
}
/*打印图案C*/
void starPattern(){
printf(" *\n");
printf(" *\n");
printf(" *\n");
printf(" *\n");
printf(" *\n");
printf(" *");
}
/*输出特殊字符*/
void printfChar(){
int i = 0;
for(int j = 0; j <=128; j++){
printf("%c ",i+j);
}
}
//9*9乘法表,外层循行,内层观察与外层的关系,进行简单的比较。
void multiplicationFormula(){
for(int i = 1; i <= 9; i++){ //控制多少行
for(int j = 1; j <= i; j++){ //控制每一行怎么输出
printf("%d*%d=%-3d ",i,j,i*j); //格式化输出,-3左对齐占三个字符
}
printf("\n");
}
}
//打印国际象棋棋盘,1代表黑,2代表白
void chessBoard(){
for(int i = 1; i <= 8; i++){
for(int j = 1; j <= 4 ; j++){
if(i % 2 == 0){
printf("1 "); //1表示黑色
printf("2 "); //2表示白色
}else{
printf("2 ");
printf("1 ");
}
}
printf("\n");
}
}
//有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1 1 2 3 5 8 13 21
void rabbitProblem(){
int a = 1, b = 1, temp = 0;
int count = 1;
while(count < 100){
if(count <= 2){
printf("第%d个月,兔子总数为1\n",count);
}
if(count > 2){
temp = a + b;
a = b;
b = temp;
printf("第%d个月,兔子总数为%d\n",count,b);
}
count++;
}
}
//运用递归求解斐波拉契数列,某一个月的兔子个数
int RabbitRecursion(int month){
if(month ==1 || month == 2){
return 1;
}
return RabbitRecursion(month - 2) + RabbitRecursion(month - 1);
}
//判断一个数除从2开始根号下的这个数,不能出现整除的现象,如果能整除则不是素数,反正则是素数。
void primenNumber(){
int count = 0; //记录素数个数
int number = 0; //记录被整除了几次
for(int i = 100; i <= 200; i++){
for(int j = 2; j <= sqrt(i); j++){
if(i % j == 0){
number++; //判断是否存在整除的现象,如果有则++
}
}
if(number == 0){ //判断是否有整除,0则没有整除,i则为素数,非0则有,i不为素数
printf("%d ",i);
count++;
}
number = 0;
}
printf("\n总共有%d个",count);
}
//水仙花数,取出每位数,开立方相加判断是否等于原来的数,等于则是水花仙数
void narcissusNumber(){
int one = 0;
int ten = 0;
int hundred = 0;
for(int i = 100; i < 999; i++){
one = i % 10; //取出个位
ten = i / 10 % 10; //取出十位
hundred = i /10 /10 %10; //取出百位
if(one * one * one + ten * ten * ten + hundred * hundred *hundred == i){
printf("%d ",i);
}
one = 0;
ten = 0;
hundred = 0; //变量初始化,保证下一次的判断
}
}
//分解质因数,输入一个数,从2开始判断该数是否能够整除,如果能则整除,然后继续整除二,如果不能则除数++,直到除数与被除数相等,则完成质因数分解
void resolvingPrimeFactor(){
int data = 0;
int count = 2;
printf("请输入一个数:");
scanf("%d",&data);
if(data == 2){
printf("2");
return;
}
while(1){
if(data % count == 0){ //能整除则继续除以该数
printf("%d * ",count);
data /= count;
}else{
count++; //不能整除就++之后再除
}
if(data == count){ //当除数等于被除数时结束
printf("%d",data);
break;
}
}
}
//90及以上a,大于60b,小于60c
void gradeConversion(){
int data = 0;
printf("请输入一个成绩:");
scanf("%d",&data);
char g = data >= 90 ? 'A' : (data >= 60 ? 'B' : 'C'); //利用三目运算符,先执行括号里面的,然后外面
printf("%c",g);
}
//利用辗转法求 比如25 10, 25 % 10 == 5然后10 % 5 == 0,则5为最大公约数
void greatestCommonDivisor(){
int a = 0;
int b = 0;
int temp = 0;
printf("请输入两个数,求它们的最大公约数:");
scanf("%d%d",&a,&b);
while(a % b != 0){ //a不能被b整除,则把a%b的值赋给b,原来b的值给a
temp = a % b;
a = b;
b = temp;
}
printf("%d",b);
}
/*求最小公倍数,判断较小的数是哪一个,循环增加到与小的数相等,从小的数开始循环,
循环过程中的数当做除数去和这两个数分别相除,如果同时满足则为最小公倍数,没有满足的则这两个数没有公约数。
*/
void leastCommonMultiple(){
int a = 0;
int b = 0;
int count = 2;
int temp = 0;
printf("请输入两个数,求它们的最小公倍数:");
scanf("%d%d",&a,&b);
if(a > b){ //最小的给a
temp = a;
a = b;
b = temp;
}
while(count <= a){ //最小公倍数一定小于最小的值
if(a % count == 0 && b % count == 0){ //从最小的数开始,两个数分别去除,同时为0则为最小公倍数,没有则继续自增
printf("最小公倍数为%d",count);
break;
}
count++;
}
if(count > a){
printf("没有公倍数");
}
}
/*计算不同字符有多少个*/
void statisticalCharacter(){
char c;
int space = 0;
int character = 0;
int digit = 0;
int other = 0;
printf("请输入一串字符:");
while((c = getchar()) != '\n'){ //一个一个接受输入的字符
if(c == ' '){ //判断是否为空格
space++;
}else if(c <= 'z' && c>= 'a' || c <= 'Z' && c >= 'A'){ //判断是否为字母
character++;
}else if(c < '9' && c > '0'){ //判断是否为数字
digit++;
}else{ //其他字符
other++;
}
}
printf("字母个数为:%d,数字个数为:%d,空格个数为:%d,其他个数为:%d",character,digit,space,other);
}
/*求s=a+aa+aaa+aaaa+aa...a的值,a和加的数量都由键盘输入
首先求a aa aaa aaaa如何循环得出每一个的值,如何利用一个变量将这些值全部整合起来
*/
void twoMethod(){
int a = 0;
int temp = 0;
int count = 0;
int s = 0;
printf("请输入需要相加的值以及需要循环加的次数:");
scanf("%d%d",&temp,&count);
for(int i = 1; i <= count; i++){
a += temp;
if(i != count){
printf("%d + ", a); //输出相加的过程
}else{
printf("%d", a);
}
s = s + a;
a = a * 10;
}
printf("\n%d",s);
}
//完数,一个数如果恰好等于它的所有因子之和,这个数就称为“完数”。例如6=1+2+3,28 = 1+2+4+7+14,编程找出1000以内的所有完数。
void perfectNumber(){
int i, j, s, n; /*变量i控制选定数范围,j控制除数范围,s记录累加因子之和*/
printf("请输入所选范围上限:");
scanf("%d", &n); /* n的值由键盘输入*/
for( i=2; i<=n; i++ )
{
s=0; /*保证每次循环时s的初值为0*/
for( j=1; j<i; j++ )
{
if(i%j == 0) /*判断j是否为i的因子*/
s += j;
}
if(s == i) /*判断因子这和是否和原数相等*/
printf("It's a perfect number:%d\n", i);
}
return 0;
}
/*一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
分析由题可知,下落十次则表示高度减了十次,第十次落地,那么弹起与下落路程相同的是九段(因为第一次落地是100开始),那么就是循环9次。
*/
void dropOfBall(){
double h = 100;
double sum = 0;
for(int i = 0; i < 9; i++){
sum = sum + h / 2.0 * 2; //让每次弹起落下的高度相加
h = h / 2.0; //每次高度减半
}
printf("共经过了%f米\n",sum+100); //九次弹起落下加上最开始的100米
printf("反弹高度%f米",h/2); //除以2表示第十次高度,因为什么只循环了9次
}
/*猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个。第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。
到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少*/
void monkeyEatPeach(){
int n = 1; //第十天的桃子数
for(int i = 1; i < 10; i++){
n = (n+1) * 2; //循环九次加一乘二
}
printf("第一天有%d个桃子",n);
}
/*两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。
已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。*/
void pingPongGame(){
char a = 'x', b = 'y', c = 'z';
for(char a = 'x'; a <= 'z'; a++){
for(char b = 'x'; b <= 'z'; b++){
for(char c = 'x'; c < 'z'; c++){ //三层循环,将玩家代号赋值给对手,得出所有的对战名单
if(a != 'x' && c != 'x' && c != 'z' && b != c && a != c && a != b){ //设置条件,三人对战玩家不能相同,并且a!=x,c!=x,c!=z
printf("a-%c b-%c c-%c",a,b,c); //输出对应玩家的值,则为他们各自的对手
}
}
}
}
}
/*打印菱形
*
***
*****
*******
*****
***
*
思路:观察行中空格与*的规律,*第一行1个,第二行三个,第三行五个,那么它们随着行的变化就可以写成2i-1,空格则是4-i,i是多少行的意思。
*/
void printDiamond(){
for(int i = 1; i <= 4; i++){ //前四行
for(int j = 1; j <= 4 - i; j++){ //第一行空格循环4-i次,后几行后面随着i的变化依次变化
printf(" ");
}
for(int j = 1; j <= 2 * i - 1; j++){ //第一行*循环2*i-1次,后几行同理
printf("*");
}
printf("\n");
}
for(int i = 1; i <= 3; i++){ //后三行
for(int j = 1; j <= i; j++){ //第一行空格循环i次,后面与上同理
printf(" ");
}
for(int j = 1; j <= 7 - 2 * i; j++){ //第一行*循环7-2*i次,后面与上同理
printf("*");
}
printf("\n");
}
}
/*有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。*/
void getTotal(){
int count = 0; //控制循环次数
double sum = 0; //统计总数
double m = 2; //分子
double d = 1; //分母
double temp = 0; //中间变量
while(count < 20){
if(count < 19){
printf("%.2f/%.2f +",m,d);
}else{
printf("%.2f/%.2f",m,d);
}
sum = sum + m / d;
temp = d; //分母保存起来
d = m; //分子给分母
m = m + temp; //分子+原来的分母(保存起来的)给分子
count++;
}
printf("\n%f",sum);
}
/*
求1+2!+3!+...+20!的和。
思路:需要2个统计数据的变量,一个统计各个数的阶乘,一个统计所有数阶乘的和。
*/
void getFactorial(){
int data = 0;
printf("请输入一个数");
scanf("%d",&data);
int res = 1; //统计每个数的阶乘结果
int sum = 0; //统计所有数阶乘相加的和
for(int i = 1; i <= data; i++){
for(int j = 1; j <= i; j++){
res = res * j;
}
sum = sum + res; //将所有阶乘的值相加
res = 1; //还原每次阶乘之后保留的值
}
printf("%d",sum);
}
#endif // METHOD_H_INCLUDED