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;//将分子赋值给t
a = 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;
else
return 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;
else
c = 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;
}