14,将一个正整数分解质因数。
例如:输入90,打印出90=2*3*3*5
#include<stdio.h>
/*分析:
* 1,如果这话质数恰巧等于(小于的时候,继续执行循环)n,
则说明分解质因数的过程已经结束,另外 打印出即可
2,但n能被k整除,则应该打印出k的之,并用n除以k的商,作为新的正整数n,
重新执行第二步
3,如果n不能被k整除,则用k+1作为k的值,重复执行第一步
*/
int main()
{int n, i;printf("请输入整数:\n");scanf_s("%d", &n);printf("%d=", n);for (i = 2; i <= n; i++){while (n % i == 0){printf("%d", i);n /= i;if (n != 1)printf("*");}}printf("\n");return 0;
}
15 学生成绩评价
利用条件运算符的嵌套来完成此题:
学习成绩>=90分的同学用A来表示
60~89分之间的用B来表示,60分以下的用C来表示
方法一:
#include<stdio.h>
int main()
{int score;char grade;printf("请输入分数:\n");scanf_s("%d", &score);if (score >= 90){grade = 'A';}else if(score>60){grade = 'B';}else{grade = 'C';}printf("%c", grade);return 0;
}
方法二:
#include<stdio.h>
int main()
{int score;char grade;printf("请输入分数:\n");scanf_s("%d", &score);grade = ((score >= 90) ? 'A' : (score >= 60) ? 'B' : 'C');printf("%c", grade);return 0;
}
16 求最大公约数或最小公倍数
#include<stdio.h>
/*分析:
1,最小公倍数=输入的两个数之积除以他们的最大公倍数
2,求最大公约数用辗转相除法
证明:设c是a和b的最大公约数,记为c=gcb(a,b),a>=b,
令r=a % b
设a=kc,b=jc,则k,j互素,否则c不是最大公约数
据上,r=a-mb=kc-mjc=(k-mj)c,可知r也是c的倍数,且k-mj与j互素,否则与前述k,j互素矛盾,
由此可知,b与r的最大公约数也是c,即gcd(a,b)=gcd(b,a mod b),得证
2)算法描述:
第一步:a ÷ b,令r为所得余数(0≤r
第二步:互换:置 a<-b,b<-r,并返回第一步。
*/
int main()
{int a,b,t,r,n;printf("请输入两个数字:\n");scanf_s("%d %d", &a, &b);if (a < b){t = b;b = a;a = t;}r = a % b; n = a * b;while (r != 0){a = b;b = r;r = a % b;}printf("这两个数的最大公约数是%d,最小公倍数是%d\n", b, n / b);return 0;
}
17,统计字符个数
输入一行字符,分别统计其中的英文字母,空格,数字和其他字符的个数
利用while语句
#include<stdio.h>
int main()
{char c;int letters = 0,spaces = 0,digitals = 0,others = 0;printf("请输入一段字符:\n");while ((c = getchar()) != '\n'){if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')){letters++;}else if (c >= '0' && c <= '9'){digitals++;}else if (c == ' '){spaces++;}else{others++;}}printf("字母=%d,数字=%d,空格=%d,其他=%d\n", letters, digitals, spaces, others);return 0;
}
17 多位数求和
求s=a+aa+aaa+aaaa+aaaaa的值,其中a是一个数字。
例如2+22+222+2222+22222(此时共有五个数和相加)
#include<stdio.h>
int main()
{int s = 0,a, n, t;printf("请输入 a 和n的值:\n");scanf_s("%d %d", &a, &n);t = a;while (n > 0){s += t;a = a * 10;t += a;n--;}printf("a+aa+aaa+aaaa+aaaaa=%d\n", s);return 0;
}
18 计算球反弹的高度
题目:一球从100米高度自由落下,每次落地后反跳弹回高度的一半;
再落下,求它第十次落地时共经过多少米?
第十次反弹多高?
#include<stdio.h>
int main()
{double x = 100;//小球初始高度double S = 100;//小球第一次掉落路程for (int i = 0; i < 10; i++){x = x / 2;//每次反弹的高度S += 2*x;//每次反弹路程是掉落的两倍+初始时候的100米}printf("小球在第十次反弹的高度:%lf\n",x);printf("小球十次落地,共经历%lf米\n", S);return 0;
}
19 猴子摘桃问题
猴子吃桃问题:
猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少
方法一:
#include<stdio.h>/*程序分析:
题目:采取逆向思维的方法,从后往前推:
(1)设x1为前一天桃子数,x2为第二天桃子树:
x2=x1/2-1;x1=(x2+1)*2
x2=x1/2-1;x2=(x2+1)*2(2)从第十天可以类推到第一天,循环*/
int main()
{int x=1;//设最后一天只剩1个桃子for (int i = 1; i < 10; i++)//从第九天开始倒数,倒数到第一天{x = (x + 1) * 2;}printf("%d", x);return 0;
}
方法二:
int main()
{int day, x1 = 0, x2;day = 9;x2 = 1;while (day > 0){x1 = (x2 + 1) * 2;x2 = x1;day--;}printf("桃子总数为:%d", x2);return 0;
}
19 打印菱形图案
方法1:
#include<stdio.h>
//前四行一个规律,后三行一个规律
int main()
{int i, j, k;for (int i = 0; i <= 3; i++)//表示打印前四行{for (j = 0; j <= 2 - i; j++){printf(" ");}for (k = 0; k <= 2 * i; k++){printf("*");}printf("\n");}for (int i = 0; i <= 2; i++){for (j = 0; j <= i; j++){printf(" ");}for (k = 0; k <= 4-2 * i; k++){printf("*");}printf("\n");}return 0;
}
方法二:
#include<stdio.h>
//前四行一个规律,后三行一个规律
int main()
{int i, j, n=3;for (int i = 1; i <= n; i++)//表示打印前四行{for (j = n - i; j >=1; j--){printf(" ");}for (j = 1; j <= 2 * i-1; j++){printf("*");}printf("\n");}for (int i = n - 1; i >=1; i--){for (j = n - i; j >= 1; j--){printf(" ");}for (j = 1; j <= 2 * i - 1; j++){printf("*");}printf("\n");}return 0;
}
20 求分数序列之和
有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13....求出这个数列的前20项之和
#include<stdio.h>
int main()
{int i, t;float sum = 0;float a = 2, b=1;//设a为分子,b为分母for (int i = 1; i <= 20; i++){sum = sum + a / b;t = a;//将分子赋值给ta = a + b;//将新的分母变成下一个数的分子b = t;//将新的分子变成下一个数的分母}printf("sum = %9.6f\n", sum);return 0;
}
21 求1~20阶乘的和
题目:求1!+2!+3!....+20!的和
方法一:
#include<stdio.h>
int main()
{int i;long double sum=0, mix=1;for (i = 1; i <= 20; i++){mix = mix * i;sum = sum + mix;}printf("%lf\n", sum);return 0;
}
21 用递归的方法求5!
#include<stdio.h>
int Fact(int n)
{if (n == 0)return 1;elsereturn n * Fact(n - 1);
}int main()
{int n = 5;long double ret = Fact(n);printf("%lf", ret);return 0;
}
22 利用递归将字符反转
利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来
首先我们先正序打印:
#include<stdio.h>void Print(int n)
{if (n > 9){Print(n / 10);}printf("%d ", n % 10);
}int main()
{int m = 0;scanf_s("%d", &m);Print(m);return 0;
}
然后我们来看看反转打印:
#include <stdio.h>// 定义递归函数用于反向输出字符串
void reversePrint(const char* str) {// 检查字符串是否为空if (*str != '\0') {// 先递归调用函数处理字符串的剩余部分reversePrint(str + 1);// 然后输出当前字符printf("%c", *str);}
}int main() {const char* myString = "Hello, World!";printf("Original String: %s\n", myString);printf("Reversed String: ");reversePrint(myString);printf("\n");return 0;
}
23 用递归函数计算第五个人的年龄
题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
#include<stdio.h>
int age(int n)
{int c;if (n == 1)c = 10;elsec = age(n - 1) + 2;return c;
}int main()
{printf("%d\n", age(5));return 0;
}
24 求整数的位数和反转
给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字,
#include<stdio.h>
int main()
{long a, b, c, d, e, x;printf("请输入五位数:\n");scanf_s("%ld", &x);a = x / 10000;//万位b = x % 10000 / 1000;//千位c = x % 1000 / 100;//百位d = x % 100 / 10;//十位e = x % 10;//个位if (a != 0){printf("逆序打印5位数为:%ld %ld %ld %ld %ld \n", e, d, c, b, a);}else if (b != 0){printf("逆序打印4位数为:%ld %ld %ld %ld\n", e, d, c, b);}else if (c != 0){printf("逆序打印3位数为:%ld %ld %ld \n", e, d, c);}else if (d != 0){printf("逆序打印2位数为:%ld %ld \n", e, d);}else if (e != 0){printf("逆序打印1位数为:%ld \n", e);}return 0;
}
25 回文数
一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
#include<stdio.h>
int main()
{long int a, b, c, d, e, x;printf("请输入五位数:\n");scanf_s("%ld", &x);a = x / 10000;//万位b = x % 10000 / 1000;//千位c = x % 1000 / 100;//百位d = x % 100 / 10;//十位e = x % 10;//个位if (a == e&& b == d){printf("该数是回文数!");}else{printf("该数不是回文数!");}return 0;
}