Q1

编程利用循环打印如下字符图形:
12345678987654321
234567898765432
3456789876543
45678987654
567898765
6789876
78987
898
9
#include <stdio.h>
int main()
{
int i, j;
for(i=1;i<=9;i++){ // 控制行数(1-9行)
for(j=1;j<i;j++) { // 打印每行开头的空格,空格与当前行数有关
printf(" ");
}
for(j=i;j<=9;j++){ // 打印递增数字
printf("%d",j);
}
for(j=8;j>=i;j--) { // 打印从9递减至当前行数
printf("%d",j);
}
for(j=1;j<i;j++) { // 打印每行结尾的空格
printf(" ");
}
printf("\n"); // 下一行
}

return 0;
}

Q2

二分法。用二分法求一元方程2x^3-4x^2+3x-6=0在(x1,x2)区间的根。
**输入格式要求:"%f,%f" 提示信息:"Enter x1,x2:"
**输出格式要求:"x=%6.2f\n"
程序运行示例如下:
Enter x1,x2:-10,10
x= 2.00
#include "stdio.h"
#include "math.h"
main()
{float x0,x1,x2,fx0,fx1,fx2;
do
{ printf("Enter x1,x2:");
scanf("%f,%f",&x1,&x2);
fx1=2*x1*x1*x1-4*x1*x1+3*x1-6;
fx2=2*x2*x2*x2-4*x2*x2+3*x2-6;
} while(fx1*fx2>0);
do
{ x0=(x1+x2)/2;
fx0=2*x0*x0*x0-4*x0*x0+3*x0-6;
if((fx0*fx1)<0)
{ x2=x0;
fx2=fx0;
}
else
{ x1=x0;
fx2=fx0;
}
}while(fabs((double)fx0)>=1e-5);
printf("x=%6.2f\n",x0);
}

Q3

编程计算s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),a和相加的项数由用户输入控制。
**输入格式要求:"%d,%d" 提示信息:"please input a and n\n"
**输出格式要求:"a=%d,n=%d\n" "a+aa+...=%ld\n"
程序运行示例如下:
please input a and n
3,5
a=3,n=5
a+aa+...=37035
#include <stdio.h>

int main() {
int b=0, a, n;
long int s=0;
printf("please input a and n\n");
scanf("%d,%d",&a,&n);

for(int i=1;i<=n;i++) {
b = b * 10 + a;
s += b;
}
printf("a=%d,n=%d\n", a, n);
printf("a+aa+...=%ld\n",s);
}

Q4

利用求阶乘函数Fact(),编程计算并输出1! + 2! + …+ n!的值。
**输入格式要求:"%u" 提示信息:"Input n(n>0):"
**输出格式要求:"sum = %lu\n"
程序运行示例:
Input n(n>0):5
sum = 153
#include<stdio.h>

unsigned long Fact(unsigned int n) {
unsigned long result = 1;
for (unsigned int i = 1;i<=n;i++) {
result *= i;
}
return result;
}
int main()
{
unsigned int n;
printf("Input n(n>0):");
scanf("%u",&n);
unsigned long sum = 0;
for (unsigned int i = 1;i<=n;i++) {
sum += Fact(i);
}
printf("sum = %lu\n",sum);
return 0;
}

Q5

判断1-100的素数

#include <math.h>
#include <stdio.h>
int fun(int n);
int main()
{
int m, k = 0;
for (m = 1; m <= 100; m++)
if (fun(m) == 1)
{
printf("%4d", m);
k++;
if (k % 5 == 0)
printf("\n");
}
return 0;
}

int fun(int n)
{
int i, k = 1;
if (n <= 1) {
k = 0;
return k;
}
for (i = 2; i < n; i++) {
if (n % i == 0) {
k = 0;
return k;
}
}
return k;
}

找素数函数


int fun(int n);

int fun(int n)
{
int i;
if (n <= 1) {
return 0;
}
for (i = 2; i < n; i++) {
if (n % i == 0) {
return 0;
}
}
return 1;
}

利用辗转相除法求最大公约数

#include <stdio.h>
int MaxCommonFactor(int a, int b);
int main()
{
int a, b, x;

printf("Input a,b:");
scanf("%d,%d",&a,&b);
x = MaxCommonFactor(a,b);
printf("MaxCommonFactor = %d\n", x);
return 0;
}

int MaxCommonFactor(int a, int b)
{
int r;

do{
r = a % b;
a = b;
b = r;
}while (r != 0);
return a;
}

pow函数

#include <stdio.h>
double myPOW(int x,int n);
double myPOW(int x, int n) {
double result = 1.0;
for(int i=1;i<=n;i++) {
result *= x;
}
return result;
}
int main()
{
int x, n;
double result;
printf("Enter x and n\n");
scanf("%d%d",&x,&n);
result = myPOW(x,n);
printf("mypow(%d,%d) = %.2f\n",x,n,result);
return 0;
}

找完数

以下程序功能是实现求10000 以内的自然数中的完数及其个数(所谓完数,指它恰好等于除它本身之外的因子之和,如:6=1+2+3,28=1+2+4+7+14),并显示结果。
#include <stdio.h>
#define LEN 10000
int main(void)
{
int i,k,m,n,s,p=0;
int a[100];
printf("Number as follows:");
for (i=2; i<= LEN; i++)
{
s=0;
m=0;
k=1;
while(k<=i/2)
{
if (i%k==0)
{
s=s+k;
a[m]=k;
m=m+1;
}
k++;
}
if (s==i)
{
p=p+1;
printf("\n%d=%d",s,a[0]);
n=1;
while (n < m)
{
printf("+%d",a[n]);
n++;
}
}
}
printf("\nTotal Num: %d",p);
return 0;
}

int IsPerfect(int x)
{
if(x == 1 || x ==0)
return 0;
int sum = 0;
for(int i=1;i<=x/2;i++) {
if(x%i==0)
sum += i;
}
if(sum == x)
return 1;
else
return 0;

}

递归逆序数

#include <stdio.h>

long Func(int n);
int main()
{
int result;
long n;
printf("Enter number:");
scanf("%d",&n);
Func(n);

return 0;
}
long Func(int n)
{
int m;
if(n==0)
return -1;
else {
m = n % 10;
printf("%d",m);
Func(n / 10);
}
}


找1000内的完数并且输出因子

#include <stdio.h>
int is_find(int x);
void find(int x);
int main()
{
int result = 0;
for(int i=1;i<=1000;i++) {
result = is_find(i);
if(result == 1)
find(i);
}
return 0;
}

int is_find(int x)
{
if(x == 1 || x ==0)
return 0;
int i, sum=1;
for(i=2;i<=x/2;i++) {
if(x%i==0)
sum += i;
}
if(sum == x)
return 1;
else
return 0;
}

void find(int x)
{
int i, sum=0;
printf("\n%5d\n",x);
for(i=1;i<x;i++) {
if(x%i==0){
printf("%5d",i);
sum += i;
}
}
}

汉诺塔问题

汉诺塔(Hanoi)是必须用递归方法才能解决的经典问题。它来自于印度神话。上帝创造世界时作了三根金刚石柱子,在第一根柱子上从下往上按大小顺序摞着64片黄金圆盘,如图7-3所示。上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放到第二根柱子上,并且规定,每次只能移动一个圆盘,在小圆盘上不能放大圆盘。有人预言说,这件事完成时宇宙会在一瞬间闪电式毁灭,也有人相信婆罗门至今仍在一刻不停地搬动着圆盘。
#include <stdio.h>

void Func(int n, char a, char b, char c);
int main()
{
int n;
printf("Input the number of disks:");
scanf("%d",&n);
printf("Steps of moving %d disks from A to B by means of C:\n",n);
Func(n, 'A', 'B', 'C');

return 0;
}
void Func(int n, char a, char b, char c)
{
if(n == 1) {
printf("Move 1: from %c to %c\n",a,b);
}
else {
Func(n-1,a,c,b); // 将n-1个盘子从起始柱子移动到辅助柱子
printf("Move %d: from %c to %c\n",n,a,b);
Func(n-1,c,b,a); // 将之前移动到辅助柱子上的n-1个盘子从辅助柱子移动到目标柱子
}
}

查找车牌

#include <stdio.h>
#include <math.h>
int main()
{
int a, b;
for(a=1;a<=9;a++) {
for(b=1;b<=9;b++) {
if(a!=b && (a*1000+a*100+b*10+b)==sqrt(a*1000+a*100+b*10+b)*sqrt(a*1000+a*100+b*10+b)) {
printf("31%d%d%d%d¡£",a,a,b,b);
break;
}
}
}
return 0;
}

查找数组元素下标

#include <stdio.h>
int Search(int a[], int n, int x);
int main()
{
int a[10];
int x;
int result = -1;
printf("Input 10 numbers:\n");
for(int i=0;i<10;i++) {
int n;
scanf("%d",&n);
a[i] = n;
}
printf("Input x:\n");
scanf("%d",&x);
result = Search(a,10,x);
if(result != -1)
printf("Subscript of x is %d\n",result);
else
printf("Not found!\n");
return 0;
}
int Search(int a[], int n, int x)
{
for(int i=0;i<n;i++) {
if(a[i]==x) {
return i;
}
}
return -1;
}

#include <stdio.h>

int main()
{
int num[12] = { 1, 0 };
int total = 1;
printf("%4d",num[0]);

for(int i=1 ;i < 12;i++) {
num[i] = num[i-1] + num[i-2];
total += num[i];
printf("%4d",num[i]);
}
printf("\nTotal = %d\n",total);
return 0;
}

找素数

int func(int n)
{
if(n<2)
return 0;
for (int i=2;i*i<=n;i++) {
if(n%i == 0)
return 0;
}
return 1;
}

递归法找最大公约数

int Gcd(int a, int b) {
if (a == b) {
return a;
} else if (a > b) {
return Gcd(a - b, b);
} else {
return Gcd(a, b - a);
}
}

二维数组的冒泡排序

#include <stdio.h>

int main()
{
int i, j, k, temp;
int a[3][4] = {1,2,3,4,9,8,7,6,10,-2,-4,4};
for(i=0;i<3;i++) { // 遍历每一行
for(j=0;j<4;j++) { // 遍历每行的每个元素
for(k=j+1;k<4;k++) // 用来与j控制的循环当前元素之后的元素比较
if(a[i][k]<a[i][j]){ // 比较每一行相邻的元素
temp = a[i][k];
a[i][k] = a[i][j];
a[i][j] = temp;
}
}
}
printf("max=%d\n",a[2][3]);
return 0;
}

矩阵相乘

#include <stdio.h>
#define M 3
#define S 4
#define N 2

void multiply(int A[M][S], int B[S][N], int C[M][N])
{
int i, j, k;
for(i=0;i<M;i++) {
for(j=0;j<N;j++) {
C[i][j] = 0;
for(k=0;k<S;k++) {
C[i][j] += A[i][k] * B[k][j];
}
}
}
}

一维数组的冒泡排序

for (int i = 0; i < N-1; i++) {
for (int j = 0; j < N-1-i; j++) {
if (a[j] > a[j+1]) {
// 交换元素
temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
// i用来控制交换轮数,j控制相邻元素
// N-1-i 是因为在每一轮排序之后,数组中最后的 i 个元素已经处于正确的位置,不需要再次参与比较。

杨辉三角

for(int i=0;i<n;i++){
for(int j=0;j<=i;j++) {
if(j == 0 || j == i)
a[i][j] = 1;
else
a[i][j] = a[i-1][j-1] + a[i-1][j];
}
}

for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
printf("%4d", a[i][j]);
}
printf("\n");
}

等腰三角形式杨辉三角

#include <stdio.h>
#define N 10
int main()
{
int a[N][N] = {0};
for(int i=0;i<N;i++) {
for(int j=0;j<=i;j++) {
if( i == j || j == 0 )
a[i][j] = 1;
if( i > 1 )
a[i][j] = a[i-1][j-1] + a[i-1][j];
}
}

for(int i=0;i<N;i++) {
for(int j=0;j<N-1-i;j++)
printf(" ");
for(int j=0;j<=i;j++)
printf("%4d",a[i][j]);
printf("\n");
}
return 0;
}

逆序任意数

int inverse(int a)
{
int b, c[100];
int p = 0;
int T = 0;
int temp = a;

// 计算a的位数
while (temp > 0){
p++;
temp /= 10;
}

// 重新将a赋值给temp
temp = a;

// 从个位提取a的每一位数字,保存在c[]中
for(int i = 0; i < p; i++) {
b = temp % 10;
c[i] = b;
temp /= 10;
}

// 输出逆序数
for(int i = 0; i < p; i++) {
T += c[i] * pow(10 , p - 1 - i);
}
return T;
}

39阶梯问题

有人要爬39级台阶。每一步只能走1到2步。先左脚,然后左右交替,最后一步是右脚,也就是说,走偶数步。写一个递归函数来输出39步中有多少种不同的方法?

#include <stdio.h>
int sum = 0; // 方法数
void up(int stair, int walk) // stair用于记录上升的台阶数,walk用于记录步数
{
if(stair >= 40)
return ; // 如果到达40阶时为基线情况

if(stair==39 && walk%2==0) {
sum++;
return ;
} // 上升39阶,并且步数为偶数,满足情况,方法数加一

up(stair+1,walk+1); // 向上走一步
up(stair+2,walk+1); // 向上走两步
}

int main()
{
up(0,0); // 初始条件
printf("一共有%d种方法",sum);
return 0;
}

寻找子串

int func(char a[], char b[])
{
int i, j, k;
int flag;
for(i=0;a[i]!='\0';i++) {
flag = 1;
for(j=i,k=0;b[k]!='\0';j++,k++) {
if(a[j]!=b[k]) {
flag = 0;
break;
}
}
if(flag && b[k] == '\0') {
return 1;
}
}
return 0;
}


蛇形矩阵

#include <stdio.h>

int main()
{
int n;
int a[10][10] = {0};
printf("Input n(n<10): ");
scanf("%d", &n);

int num = 1;
int top = 0;
int bottom = n - 1;
int left = 0;
int right = n - 1;

while (num <= n * n) {
for (int j = left; j <= right; j++) {
a[top][j] = num++;
}
top++;

for (int i = top; i <= bottom; i++) {
a[i][right] = num++;
}
right--;

for (int j = right; j >= left; j--) {
a[bottom][j] = num++;
}
bottom--;

for (int i = bottom; i >= top; i--) {
a[i][left] = num++;
}
left++;
}

printf("Snake matrix:\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%3d", a[i][j]);
}
printf("\n");
}

return 0;
}

拉丁矩阵

#include<stdio.h>

int main()
{
int i,j,t,n,m;
scanf("%d",&n);
for(i=0;i<n;i++){
t=i%n;//记录第i行的第一个元素
for(j=0;j<n;j++){
m=(j+t)%n+1;
printf("%d ",m);//按照环形规律进行输出
}
printf("\n");
}
return 0;
}

逆序字符串

void reverse(char *s)
{
char *t = s + strlen(s) - 1;
char temp;

while (s <= t)
{
temp = *t;
*t = *s;
*s = temp;
s++;
t--;
}
}
char *func(char *s)
{
char *start = s; // 指向s字符数组第一个字符
char *t = s + strlen(s) - 1; // 指向最后一个字符
char temp;

while( start<t ) {
temp = *t;
*t = *start;
*start = temp;
start++;
t--;
}
return s;
}