0. 钞票和硬币
money.c
读取一个带有两个小数位的浮点数,代表货币价值。将该值分解为多种钞票和硬币的和,要求使用的钞票和硬币的总数量尽可能少。 货币面值有100,50,20,10,5,1,0.5,0.1,0.05,0.01。
#include <stdio.h>
int main() {
float input;
printf("输入货币价值: ");
scanf("%f", &input);
float money[] = {100.00, 50.00, 20.00, 10.00, 5.00, 1.00, 0.50, 0.10, 0.05, 0.01};//钞票 和 硬币
for (int i = 0; i < 10; i++) {
int count = input / money[i];
if(count!=0) printf("%d个%.2f元 ", count, money[i]);
input -= count * money[i];
}
return 0;
}
1. 算术平方根
square_root.c
用二分法的方法求一个非负数的算术平方根,精度到0.0001
eg: 输入3.8输出1.9494
#include <stdio.h>
#include <math.h>
double sqrt_binary(double num, double epsilon) {
double left = 0;
double right = num;
double mid;
while (right - left > epsilon) {
mid = (left + right) / 2;
if (mid * mid > num) {
right = mid;
} else {
left = mid;
}
}
return (left + right) / 2;
}
int main() {
float input_num;
printf("输入非负数: ");
scanf("%f", &input_num);
double epsilon = 0.0001;
double result = sqrt_binary(input_num, epsilon);
printf("算术平方根为: %.4f", result);
return 0;
}
2. 哥德巴赫猜想
Goldbach_conjecture.c
验证哥德巴赫猜想:任何一大于6的偶数均可表示为两个质数之和。即,输入一个大于6的偶数,输出一组满足条件的两个质数。
eg: 输入20 输出3 17
#include <stdio.h>
int is_prime(int num) {
int i;
if (num <= 1) return 0;
for (i = 2; i * i <= num; i++) {
if (num % i == 0) return 0;
}
return 1;
}// 检查一个数是否为质数
int main() {
int n,i;
printf("请输入一个大于6的偶数: ");
scanf("%d", &n);
if (n <= 6 || n % 2 != 0) {
printf("输入无效,请输入一个大于6的偶数。\n");
return 1;
}
// 寻找两个质数,使其和等于 n
for (i = 2; i <= n / 2; i++) {
if (is_prime(i) && is_prime(n - i)) {
printf("%d %d\n", i, n - i);
return 0; // 找到一对质数后退出
}
}
printf("未找到符合条件的质数对。\n");
return 0;
}
3. 打印星号菱形
rhombus.c
打印星号组成的菱形图案
#include <stdio.h>
int main() {
int i, j, k, n = 4; // n 菱形的一半高度(即上三角形的行数)
for (i = 1; i <= n; i++) { // 上半部分(包括中间行)
for (j = 1; j <= n - i; j++) {
printf(" "); // 打印前导空格,使*居中
}
for (k = 1; k <= 2 * i - 1; k++) {
printf("*"); // 打印*
}
printf("\n"); // 换行
}
for (i = n - 1; i >= 1; i--) { // 下半部分
for (j = 1; j <= n - i; j++) {
printf(" "); // 打印前导空格,使*居中
}
for (k = 1; k <= 2 * i - 1; k++) {
printf("*"); // 打印*
}
printf("\n"); // 换行
}
return 0;
}
4. 分解质因数
factorize_into_prime.c
质因数分解是将一个合数(非质数)分解为若干个质数的乘积。将一个正整数分解质因数。例如:输入90,打印出90=233*5。
#include <stdio.h>
int is_prime(int num) {
int i;
if (num <= 1) return 0;
for (i = 2; i * i <= num; i++) {
if (num % i == 0) return 0;
}
return 1;
}// 检查一个数是否为质数
int main() {
int n, i;
printf("请输入需要分解的正整数(大于3且为非质数): ");
scanf("%d", &n);
//printf("分解质因数的结果为: %d=", n);
if(n>3 && is_prime(n)==0) {
printf("%d=", n);
for (i = 2; i <= n; i++) {
while (n % i == 0) {
printf("%d", i);
n = n / i;
if (n > 1) // 如果 n 不是最后一个质因数,则打印 '*'
printf("*");
}
}
}
else printf("输入不合理");
printf("\n");
return 0;
}
5. 整数的所有因数
factors.c
假如a*b=c(a、b、c都是整数),那么我们称a和b就是c的因数。
#include <stdio.h>
int main()
{
int n, i;
printf("输入一个整数: ");
scanf("%d",&n);
printf(" %d 的因数有: ", n);
for(i=1; i <= n; ++i)
{
if (n%i == 0)
{
printf("%d ",i);
}
}
return 0;
}
6. 两数的所有公因数
common_factor.c
寻找两个数的所有公因数。
#include <stdio.h>
int main()
{
int n1, n2, i;
printf("输入两数:");
scanf("%d %d", &n1, &n2);
for (i = 1; i <= (n1 > n2 ? n2 : n1) ; ++i)
{
if (n1%i == 0 && n2%i == 0)
{
printf("%d ", i);
}
}
return 0;
}
7. 求Sn=a+aa+….(n个a)之值
sum.c
求Sn=a+aa+aaa+….+aa…a(n个a)之值,其中a是一个数字,n表示a的位数,a和n由键盘输入。
#include <stdio.h>
int main(){
int a,n,s=0,m,k;
printf("请输入a和n: \n");
scanf("%d %d",&a,&n);
k=a;
for(m=1;m<=n;m++){
s=s+k;
k=k*10+a;
}
printf("Sn=%d\n",s);
return 0;
}
8. 小球反弹
ball.c
一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下后再次反弹,按此规律,直到第8次反弹时,反弹多少高度?行程共有多少米?
#include <stdio.h>
int main(){
float h=100,s=100;
int i;
for(i=1;i<=8;i++){
h=h/2;
s=s+h*2;
}
printf("第8次反弹时,反弹高度h=%f,行程共有s=%f\n",h,s-h);
}
9. 换分币
coins.c
用一元人民币兑换成1分、2分和5分硬币,共有多少种不同的兑换方法。总硬币数目小于等于100.
#include<stdio.h>
int main() {
int i, j, k, count = 1;
printf("兑换方法 : \n");
for (i = 0; i <= 100; i++) {
for (j = 0; j <=100 - i; j += 2) {
for (k = 0; k <= 100 - i - 2* j; k += 5) {
if (i +j + k == 100){
printf((count-1) % 4 ? "法%d:1*%d+2*%d+5*%d\t":"法%d:1*%d+2*%d+5*%d\n", count++,i,j/2,k/5);
}}}}
return 0;
}
10. 分数之和
sum1.c
求这样的四个自然数p,q,r,s(p<=q<=r<=s),使得以下等式成立:
1
p
+
1
q
+
1
r
+
1
s
=
1
\frac{1}{p}+\frac{1}{q}+\frac{1}{r}+\frac{1}{s}=1
p1+q1+r1+s1=1
#include <stdio.h>
int main() {
int p, q, r, s;
for (p = 1; p <= 100; p++) { //遍历所有可能的p,q,r,s的值,设上限为100,可调
for (q = p; q <= 100; q++) {
for (r = q; r <= 100; r++) {
for (s = r; s <= 100; s++) {
if (1.0/p + 1.0/q + 1.0/r + 1.0/s == 1) {
printf("p=%d\tq=%d\tr=%d\ts=%d\t" //太长了换个行
"1/%2d + 1/%2d + 1/%2d + 1/%2d = 1\n", p, q, r, s, p, q, r, s);
}}}}}
return 0;
}