例题1.输出以下图形。
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*
#define _CRT_SECURE_NO_WARNINGS
#include
#include
void main()
{
int i, j, k;
for (i = 0; i <= 3; i++)
{
for (j = 0; j <= 2 - i; j++) putchar(' ');
for (k = 0; k <= 2 * i; k++) putchar('*');
putchar('\n');
}
for (i = 0; i <= 2; i++)
{
for (j = 0; j <= i; j++) putchar(' ');
for (k = 0; k <= 4 - 2 * i; k++) putchar('*');
putchar('\n');
}
system("pause");
}
2. 计算n的阶乘
#define _CRT_SECURE_NO_WARNINGS
#include
#include
void main()
{
int n, factorial = 1;
scanf("%d", &n);
while (n != 0)
{
factorial *= n;
--n;
}
printf("%d", factorial);
system("pause");
}
3.求 1到 100之间的奇数之和、偶数之和。
#define _CRT_SECURE_NO_WARNINGS
#include
#include
void main()
{
int odd_number = 0;
int even_number = 0;
for (int i = 1; i <= 100; i++)
{
if (i % 2) //奇数
{
odd_number += i;
}
else
even_number += i;
}
printf("奇数和为%d\n", odd_number);
printf("偶数和为%d", even_number);
system("pause");
}
4. 输入一行字符,统计其中的英文字母、数字、空格和其他字符个数。
#define _CRT_SECURE_NO_WARNINGS
#include
#include
void main()
{
char x;
int letter = 0, digit = 0, space = 0, other = 0;
printf("please input a string:\n");
while ((x = getchar()) != '\n')
{
if (x >= 'A'&&x <= 'Z' || x >= 'a'&&x <= 'z')
{
letter++;
}
else if (x >= '0'&&x <= '9')
{
digit++;
}
else if (x == ' ')
{
space++;
}
else
other++;
}
printf("英文字符个数为%d\n", letter);
printf("数字字符个数为%d\n", digit);
printf("空格字符个数为%d\n", space);
printf("其他字符个数为%d\n", other);
system("pause");
}
5. 用循环语句编写求 20 + 21 + 22 + 23 + …… + 263 的程序。
#define _CRT_SECURE_NO_WARNINGS
#include
#include
void main()
{
double sum = 1;
double temp = 1;
for (int i = 0; i<63; i++)
{
temp *= 2;
sum += temp;
}
printf("和为:%g", sum); //格式字符 %e %E %g %G 与 %f 作用相同,可以互换
system("pause");
}
6.求1! + 2! + 3! + ... + 20! 。
#define _CRT_SECURE_NO_WARNINGS #include#include
int factorial(int num) //先写一个阶乘函数,然后用for循环每次调用这这个函数即可 { int sum = 1; for (int i = 1; i <= num; i++) sum *= i; return sum; } void main() { int mul = 0; for (int i = 1; i<21; i++) { mul += factorial(i); } printf("和为:%d", mul); system("pause"); }
7.计算以下公式前n 项值 1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + 1/7 - …… + 1/n-1 - 1/n+1。
#define _CRT_SECURE_NO_WARNINGS
#include
#include
double fun(int n)
{
int x = 1, ch = 1;
double sum = 0;
for (; x <= n; x++)
{
sum = sum + 1.0 * ch / x;
ch = -ch;
}
return sum;
}
void main()
{
int n;
scanf("%d", &n);
printf("%f", fun(n));
system("pause");
}
8. 有一分数序列 2/1, 3/2, 5/3, 8/5, 13/8, 21/13求出这个数列的前20项之和。
#define _CRT_SECURE_NO_WARNINGS
#include
#include
void main()
{
float a[21] = { 0 };
float sum = 0;
a[0] = 1;
a[1] = 2;
for (int i = 2; i<21; i++)
{
a[i] = a[i - 1] + a[i - 2];
}
for (int i = 0; i<20; i++)
{
sum += a[i + 1] / a[i];
}
printf("前二十项之和为%f", sum);
system("pause");
}
9. 判断一个数是否是素数
#define _CRT_SECURE_NO_WARNINGS #include#include #include
int prime(int num) { for (int i = 2; i <= sqrt(num); i++) { if (num%i == 0) return 0; //返回0 非素数 } return 1; } void main() { int num; printf("Enter a integer number:"); scanf("%d", &num); if (prime(num)) printf("是素数"); else printf("不是素数"); system("pause"); }
10. 求1-100之间所有非素数的和
#define _CRT_SECURE_NO_WARNINGS #include#include
#include
int prime(int num) { for (int i = 2; i <= sqrt(num); i++) { if (num%i == 0) return 0; } return 1; }
void main() { int sum = 0; for (int i = 1; i<101; i++) { if (!prime(i)) { sum += i; } } printf("非素数之和为:%d", sum); system("pause"); }
11.验证任意偶数为两个素数之和,并输出这两个素数。
#define _CRT_SECURE_NO_WARNINGS #include#include #include int prime(int num) { for (int i = 2; i <= sqrt(num); i++) { if (num%i == 0) return 0; } return 1; } void main() { int num; printf("Enter a even number:"); scanf("%d", &num); for (int i = 2; i <= num; i++) { if (prime(i)) if (prime(num - i)) { printf("%d == %d + %d\n", num, num - i, i); break; } } system("pause"); }
12.输入两个正整数 m 和 n,求其最大公约数和最小公倍数。
1)最大公约数:指两个或多个整数共有约数中最大的一个。
2)最小公倍数:它与最大公约数的乘机为所求数之积。
3)比如求 x,y的最大公约数和最小公倍数 x * y = 最小公倍数 * 最大公约数
int gcd(int a, int b) //辗转相除法 { if (a % b == 0) return b; else return gcd(b, a%b); }
辗转相减法
int gcd(int a, int b) { while (a != b) //若a = b,则a(或b)即为两数的最大公约数 { if (a > b) a = a - b; else b = b - a; } return a; }
穷举法
#define _CRT_SECURE_NO_WARNINGS #include#include int gcd(int a, int b) { int tmp; tmp = (a > b) ? b : a; while (tmp > 0) { if (a % tmp == 0 && b % tmp == 0)//只要找到一个数能同时被a,b所整除,则中止循环 break; tmp--; } return tmp; } int lcm(int u, int v) //求最小公倍数 { int tmp = gcd(u, v); return u * v / tmp; } int main(void) { int m, n; scanf("%d%d", &m, &n); printf("最大公约数:%d\n", gcd(m, n)); printf("最小公倍数:%d\n", lcm(m, n)); system("pause"); }
13.打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数, 其各位数字立方和等于该数本身。
例如 153是一个水仙花数,因为 153 =13 + 53 + 33
#define _CRT_SECURE_NO_WARNINGS #include#include #include int fcn(int num) { return num == pow((double)(num % 10), 3) \ + pow((double)(num / 10 % 10), 3) \ + pow((double)(num / 100), 3); } void main() { for (int i = 100; i <= 999; i++) { if (fcn(i)) printf("%5d", i); } system("pause"); }
14.一个数恰好等于它的平方数的右端,这个数被称为同构数。如 5 的平方是25, 5是25中的右端的数, 5就是同构数。找出1~1000之间的全部同构数。
#include#include int main() { long long i, j, k; k = 10; for (i = 1; i <= 100000; i++) { if (i == k) k *= 10; j = i*i; if (j%k == i) printf("%lld\t%lld\n", i, j); } system("pause"); }
15.完数:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如,28 的因子为1、2、4、7、14而28 = 1 + 2 + 4 +7 + 14,因此28是“完数”。
#include#include #include int fun(int num) { int arr[100] = { 0 }; int index = 0; int sum = 0; for (int i = 1; i ) { if (num%i == 0) { sum += i; arr[index++] = i; //把所有的整数因子存于数组中 } } if (sum == num) { printf(" %5d its factors are", num); for (int i = 0; i ) { printf("%5d", arr[i]); } return 1; } else return 0; } void main() { for (int i = 1; i <= 1000; i++) { if (fun(i)) { printf("\n"); } } system("pause"); }
16.3025这个数具有一种独特的性质:将它平分为两段,即30和25,使之相加后求平方,即(30 + 25)的平方,恰好等于3025本身。请求出具有这样性质的全部四位数。
#include#include int fun(int num) { int num1 = num / 100; int num2 = num % 100; if (num == (num1 + num2)*(num1 + num2)) { return 1; } else return 0; } void main() { for (int i = 1000; i <= 9999; i++) { if (fun(i)) { printf("%6d\n", i); } } system("pause"); }
17.两位数13和62具有很有趣的性质:把它们个位数字和十位数字对调,其乘积不变,即13 * 62 = 31 * 26。 编程序求共有多少对这种性质的两位数。
(个位与十位相同的不在此列,如11、22,重复出现的不在此列,如 13 * 62与62 * 13)。
#include#include int fun2(int num) { return num % 10 * 10 + num / 10; } int fun(int num1, int num2) { if (num1 / 10 == num1 % 10 && num2 / 10 == num2 % 10) return 0; if (num1 * num2 == fun2(num1) * fun2(num2)) return 1; else return 0; } void main() { int num = 0; for (int i = 10; i<100; i++) { for (int j = i; j<100; j++) { if (fun(i, j)) { printf("%5d,%5d\n", i, j); num++; } } } printf("共有%d对", num); system("pause"); }
18.给出一个不多于4位的正整数,要求:① 求出它是几位数 ② 分别打印出每一位数字 ③ 按逆序打印出各位数字。
#define _CRT_SECURE_NO_WARNINGS #include#include int Getweishu(int num) { int count = 0; while (num) { count++; num /= 10; } return count; }
void ReprintNum(int num) { while (num) { printf("%d ", num % 10); num = num / 10; } }
void printNum(int num) { int temp = 1; while (num / temp >= 10) { temp *= 10; } while (temp >= 1) { printf("%d ", num / temp % 10); temp /= 10; } }
void main() { int num; printf("please input num : "); scanf("%d", &num); printf("%d\n", Getweishu(num)); printNum(num); printf("\n"); ReprintNum(num); system("pause"); }
19.在一个程序中计算出给定误差小于0.1,0.01,0.001,0.0001,0.00001 时,下式的值
提示:本题中误差指前 n+1项之积与前 n项积之差。
#include#include void fun(double num) { double n = 1; double J1 = 2 * n *(2 * n + 2) / (2 * n + 1) / (2 * n + 1); double J2 = 2 * n *(2 * n + 2) / (2 * n + 1) / (2 * n + 1); do { n = n + 1; J1 = J2; J2 *= 2 * n *(2 * n + 2) / (2 * n + 1) / (2 * n + 1); } while (J1 - J2 > num); printf("结果是%f\n", J1); } void main() { fun(0.1); fun(0.01); fun(0.001); fun(0.0001); fun(0.00001); system("pause"); }
20.验证歌德巴赫猜想。一个充分大的偶数(大于或等于6)可以分解为两个素数之和。试编程序,将 6至50之间全部偶数表示为两个素数之和。质数(素数)是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
#include#include #include int prime(int num) { for (int i = 2; i <= sqrt((double)num); i++) { if (num%i == 0) { return 0; } } return 1; } void main() { for (int i = 6; i<51; i = i + 2) { for (int j = 2; j) { if (prime(j) && prime(i - j)) { printf("%d = %d + %d\n", i, j, i - j); break; } } } system("pause"); }