c语言经典例题总结

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
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值