当前位置:文档之家› 江苏省二级c语言上机考试例题集1-20

江苏省二级c语言上机考试例题集1-20

江苏省二级c语言上机考试例题集1-20
江苏省二级c语言上机考试例题集1-20

1、取出一个十进制正整数中的所以奇数数字,用这些数字构成一个最小数。

#include

#include

void sort(int a[], int n)

{

int i, j, t;

for (i = 0;i < n - 1;i++)

for (j = 0;j < n - 1 - i;j++) /*利用双重循环,将数组按从小到大排列*/

if (a[j] > a[j + 1])

{t = a[j];a[j] = a[j + 1];a[j + 1] = t; }

}

long arrange(long s) /*arrange函数的功能是取出十进制整数s中的所有奇数数字,用这些数字构成一个最小数,函数返回该数*/

{ int d, b[10], i, j = 0;

long s1 = 0;

while (s > 0) /*利用循环对s数位分离,分离出个位、十位、百位等各位上的数*/

{ d = s % 10;

if (d % 2 != 0) /*判断每一位上的数字是否为奇数*/

b[j++] = d; /*若为奇数则存放到b数组中*/

s /= 10;

}

sort(b, j); /*调用sort函数,将数组b从小到大排列*/

for (i = 0;i < j;i++)

s1 = s1 * 10 + b[i]; /*求得用各位上的奇数组成的最小数 */

return s1; /*返回求得的数*/

}

void main()

{

long m, n;

FILE *fp; /*定义文件指针fp*/

if ((fp = fopen("myf2.out", "w")) == NULL) /*涉及文件的打开*/

{printf("The file can not open!");exit(0);}

scanf("%ld", &n); /*接收键盘输入的整型数据*/

m = arrange(n); /*键盘输入的数据作为实参调用arrange 函数*/

printf("%ld\n", m); /*将得到的最小数输出到屏幕及结果文件中*/

fprintf(fp, "%ld\n", m);

printf("\nMy exam number is:WLJY001\n"); /*将考生准考证号输出到屏幕及结果文 件中 */

fprintf(fp, "\nMy exam number is:WLJY001\n");

fclose(fp); /*关闭文件*/

}

2、按要求合并两个字符串

#include

#include

#include

void fun(char *a, char *b, char *c) /*函数功能是先将b指向的字符串逆序存放,然后按a[0] ,b[0], a[1], b[1]…的顺序合并a字符串和b字符串到c指向的数组中,将a 或b中剩余的字符拼接在c数组的尾部*/

{int i, j;

char ch;

i = 0;j = strlen(b) - 1;

while (i < j) /*利用while循环将数组b中的字符逆序存放*/

{ch = b[i];b[i] = b[j];b[j] = ch;

i++;j--;

}

while (*a || *b) /*利用while循环,通过判断*a || *b,将a、b数组间隔存放在c数组中*/

{ if (*a){*c = *a;c++;a++;}

if (*b){*c = *b;c++;b++;}

}

*c = '\0';

}

void main()

{

FILE *fp; /*定义文件指针fp*/

char s1[80], s2[80], s[200]; /*声明3个一维数组*/

if ((fp = fopen("myf2.out", "w")) == NULL)

{printf("can't open file");exit(0);}

printf("\nEnter s1 string:");

gets(s1);

printf("\nEnter s2 string:");

gets(s2); /*s1、s2 接收键盘输入的字符*/

fun(s1, s2, s); /*调用change函数,对字符串s2进行逆序变换,再合并s1字符串和s2字符串并保存到s数组中*/

printf("\nThe result is:%s\n", s);

/*将合并后产生的数组s中的字符串输出到屏幕及结果文件中*/

fprintf(fp, "%s", s);

fprintf(fp, "\n");

printf("\nMy exam number is:WLJY001\n"); /*将考生准考证号输出到屏幕及结果文件中*/

fprintf(fp, "\nMy exam number is:WLJY001\n");

fclose(fp); /*关闭文件*/

}

3、先判断一个m×n矩阵为Monge矩阵,在对该矩阵进行交换处理

#include

#include

#define N 5

void change(int a[][N], int n) /*该函数的功能是,对a指向的n行5列数组中的矩阵进行变换*/

{int i, j, t;

for (i = 0;i < n / 2;i++) /*通过两重for循环对数组各行的位置进行交换*/

for (j = 0;j < N;j++)

{t = a[i][j];a[i][j] = a[n - 1 - i][j];a[n - 1 - i][j] = t;} /*变换形式:第一行与最后一行交换,第二行与倒数第二行交换……*/

}

int Monge(int a[][N], int n)

{

int i, j;

for (i = 0;i < n - 2;i++) /*利用for循环和if语句对数组元素进行矩阵判断,判断是否为Monge矩阵*/ { for (j = 0;j < N - 2;j++)

if (a[i][j] + a[i + 1][j + 1] > a[i][j + 1] + a[i + 1][j])

return 0;

/*若矩阵不是Monge矩阵,函数返回0*/

}

return 1;

/*若矩阵是Monge矩阵,函数返回1*/

}

void main()

{

int a[][N] = {{10, 17, 13, 28, 23}, {17, 22, 16, 29, 23},

{24, 28, 22, 34, 24}, {11, 13, 6, 17, 7}, {45, 44, 32, 37, 23}}; /*数组初始化*/ int monge, i, j;FILE *fp;

fp = fopen("myf2.out", "w"); /*以只写"w"方式打开文件*/

if (fp == NULL)exit(0);

monge = Monge(a, 5); /*调用Monge函数对a数组进行判断*/

for (i = 0;i < N;i++) /*将a数组变换前中的元素输出到屏幕及结果文件中*/

{for (j = 0;j < N;j++)

{printf("%4d", a[i][j]);fprintf(fp, "%4d", a[i][j]);}

printf("\n");fprintf(fp, "\n");

}

if (monge)

{printf("a is Monge\n");fprintf(fp, "a is Monge\n");} /*将a数组变换前的判断结果输出到屏幕及结果文件中*/

else

{printf("a is not Monge\n");fprintf(fp, "a is not Monge\n");}

change(a, 5); /*调用change函数对a数组进行变换处理*/

for (i = 0;i < N;i++)

{

for (j = 0;j < N;j++)

{ printf("%4d", a[i][j]);fprintf(fp, "%4d", a[i][j]);}

printf("\n");fprintf(fp, "\n");

} /*将a数组变换后的元素输出到屏幕及结果文件中*/

monge = Monge(a, 5); /*调用Monge函数对经过变换的a数组进行判断*/

if (monge) /*将a数组变换后的判断结果输出到屏幕及结果文件中*/

{printf("a is Monge\n");

fprintf(fp, "a is Monge\n"); }

else

{ printf("a is not Monge\n");fprintf(fp, "a is not Monge\n"); }

printf("\nMy exam number is:WLJY001\n"); /*将考生准考证号输出到屏幕及结果文件中*/

fprintf(fp, "\nMy exam number is:WLJY001\n");

fclose(fp); /*关闭文件*/

}

4、用一组整数验证命题

#include

#include

#define N 100

int fun (int a[], int b[], int n)

{

int i, j, x, y, z, s, t, m, k = 0;

for (i = 0;i < n;i++) /*按题目要求的步骤进行交换,直到得到所要求的结果停止循环*/ if (a[i] / 1000 < 1)

{

x = a[i] / 100;y = a[i] / 10 % 10;z = a[i] % 10; /*对数a[i]进行数位分离*/

if (x != z)

{

s = z * 100 + y * 10 + x; /*交换a[i]的百位数字与个位数字得到s*/

t = s > a[i] ? (s - a[i]) : (a[i] - s); /*求a[i]和s的绝对值得到t*/

x = t / 100;y = t / 10 % 10;z = t % 10;

m = z * 100 + y * 10 + x; /*交换 t的百位数字与个位数字得到m*/

if (t + m == 1089) /*判断t与m的和是否为1089*/

b[k++] = i;

}

}

return k; /*函数返回数组b中数据的个数*/

}

void main()

{

int a[N] = {123, 765, 1, 45, 121, 1345, 131, 67, 696, 3589}, b[N], n, i;

FILE *fp; /*定义文件指针*/

if ((fp = fopen("myf2.out", "w")) == NULL) /* 以只写"w"方式打开文件 */

{printf("The file call not open!");exit(0);}

n = dotest (a, b, 10); /*用a数组作为实参调用fun函数*/

for (i = 0;i < n;i++)

{printf("%5d", a[b[i]]);fprintf(fp, "%5d", a[b[i]]);} /*将a数组中所有符合命题的整数输出到屏幕及结果文件中*/

/*将考生准考证号输出到屏幕及结果文件中*/

printf("\nMy exam number is:WLJY001\n");

fprintf(fp, "\nMy exam number is:WLJY001\n");

fclose(fp); /*关闭文件 */

}

5、找出7个默森尼数

#include

#include

#define N 7

void Mersenne(long a[], int m);

int prime(long);

void main()

{

long a[N];

int i;

FILE *fp; /*定义文件指针*/

fp = fopen("myf2.out", "w"); /*以只写"w"方式打开文件*/

if (fp == NULL)exit(0);

Mersenne(a, N); /*调用Mersenne 函数,找出并保存前7个Mersenne 数*/

for (i = 0;i < N;i++)

{ printf("%8ld", a[i]);fprintf(fp, "%8ld", a[i]);} /* 将运行结果输出到屏幕及结果文件中*/ printf("\nMy exam number is:WLJY001\n"); /*将考生准考证号输出到屏幕及结果文件中*/

fprintf(fp, "\nMy exam number is:WLJY001\n");

}

void Mersenne(long a[], int m) /*该函数的功能是,求出前m个Mersenne数*/

{long f, n, k;

int i = 0;

a[i++] = 3;

for (n = 3;i < m;n += 2)

{

f = 1;

for (k = 1;k <= n;k++)

f *= 2; /*求2的n次方*/

if (prime(n) && prime(f - 1)) /*当n和2的n次方减1均为素数时,该数为Mersenne 数*/ a[i++] = f - 1; /*将找到的Mersenne 数保存到数组a中*/

}

}

int prime(long n) /*该函数的功能是,判断整数a是否是素数*/

{long i;

for (i = 2;i <= n / 2;i++)

if (n % i == 0) return 0;

return 1; /*若是素数函数返回值1*/

}

6、从一个指定的自然数

#include

#include

int linkrun(int a, int b, int *p);

void main()

{

int i, a, b, max, p[100];

FILE *fp;

if ((fp = fopen("myf2.out", "w")) == NULL) /*以只写"w"方式打开文件*/

{printf("The file call not open!");exit(0);}

printf("Enter a,b:(a

scanf("%d,%d", &a, &b); /*接收从键盘输入的a和b*/

max = linkrun(a, b, p); /*以a、b、p作为实参调用函数*/

for (i = 0;i <= b - a;i++)

{

printf("%3d", p[i]);

fprintf(fp, "%3d", p[i]);

}

printf("\nmax=%d", max);

fprintf(fp, "\nmax=%d", max); /*将运行结果输出到屏幕及结果文件中*/

printf("\nMy exam number is:WLJY001\n"); /*将考生准考证号输出到屏幕及结果文件中*/

fprintf(fp, "\nMy exam number is:WLJY001\n");

fclose(fp); /*关闭文件*/

}

int linkrun(int a, int b, int *p)

{

int i, k, m, n, num;

num = 0;

for (i = 0, k = a;k <= b;i++, k++) /*通过for循环,以[a,b]中所有自然数作为n*/

{n = k;p[i] = 1;

while (n != 1)

{

++p[i]; /*将数列的长度保存到数组p中*/

i f(n % 2) /*n为奇数时,按相应公式求解*/

n = n * 3 + 1;

else /*当n为偶数时,按相应公式求解*/

n /= 2;

}

if (p[i] > num)num = p[i]; /*求出数组中最大值*/

}

return num; /*返回最大值*/

}

7、将一个十进制整数m转换成r进制整数的字符串表示形式

#include

#include

void trdec(char *str, int idec, int ibase) /*该函数的功能是,将十进制整数idec转换为ibase进制的字符串表示形式*/

{char ch;

int i, idr, k = 0;

while (idec != 0)

{

idr = idec % ibase; /*idec对ibase求余*/

if (idr >= 10) /*判断余数,根据余数的值对其进行变换*/

str[k++] = idr - 10 + 'A';

else

str[k++] = idr + '0';

idec /= ibase;

}

for (i = 0;i < k / 2;i++) /*转换成ibase进制数的字符串形式后,将字符串保存到str指向的字符数组 */ {ch = str[i];

str[i] = str[k - i - 1];

str[k - i - 1] = ch;

}

str[k] = '\0';

}

void main()

{

int x;char str[20];FILE *fp; /*变量声明,定义文件指针fp */

if ((fp = fopen("myf2.out", "w")) == NULL)

{printf("The file can not open!");exit(0);}

printf("Enter a number"); scanf("%d", &x); /*接收从键盘输入的x*/

trdec(str, x, 2); /*调用函数将该整数转换为二进制并输出到屏幕及结果文件中*/

printf("%sB,", str);fprintf(fp, "%sB,", str);

trdec(str, x, 8); /*调用函数将该整数转换为八进制并输出到屏幕及结果文件中*/

printf("%sQ,", str);fprintf(fp, "%sQ,", str);

trdec(str, x, 16); /*调用函数将该整数转换为十六进制并输出到屏幕及结果文件中*/

printf("%sH\n", str);fprintf(fp, "%sH\n", str);

printf("\nMy exam number is:WLJY001\n"); /*将考生准考证号输出到屏幕及结果文件中*/

fprintf(fp, "\nMy exam number is:WLJY001\n");

fclose(fp); /*关闭文件*/

}

8、将以为数组中的所有素数移到该数组的前端部分

#include

#include

int N;

void insert(int *p, int x, int n)

{

int i = 0, j;

while (x > p[i] && i < n) /* ① p是指针类型,引用形式不对*/

i++;

for (j = n;j > i;j--)

p[j] = p[j - 1];

p[j] = x; /* ②此语句的作用是将x插入到元素p[j]的位置 */

}

int *create()

{

int *head, *p, i;

printf("\n N=");

scanf("%d", &N);

head = (int *)malloc(N * sizeof(int)); /* ③分配内存空间函数malloc的调用形式错误,正确的为:(类型说明符*)malloc(size) */

printf("Enter numbers:");

p = head;

for (i = 0;i < N;i++)

scanf("%d", &p[i]); /* ④接收从键盘输入的数值要用取址运算符 */

for (i = 1;i < N;i++)

insert(p, p[i], i);

return head;

}

void main()

{

int *head, *p, i, x;

head = create();

p = head;

for (i = 0;i < N;i++)

printf("%3d", *p++);

free(head);

}

9、用以下展开式求

#include

#include

#include /* ①后续程序调用了字符函数isalpha,所以要加#include */

void replace_word(char s[])

{

char word_tab[4][10] = {"sad", "happy", "accuse", "forgive"};

char t[10], tmp[80]; /* ②由后面的t[k]=s[j]知,此处定义的t不是一个字符变量,而是一个字符型数组*/

int i, j, k, n;

for (i = 0;s[i];i++)

{

for (j = i, k = 0;isalpha(s[j]);k++, j++)

t[k] = s[j];

t[k] = 0;

if (k > 0)

{

for (n = 0;n < 4;n++)

if (strcmp(t, word_tab[n]) == 0)break;

if (n < 4)

{

strcpy(tmp, s + i + strlen(t));

strcpy(s + i, word_tab[(n + 1) % 4]);

strcat(s, tmp); /* ③strcpy(str1,str2)是把字符串str2复制到str1中,会覆盖str1中的内容,此处应用strcat函数 */

i = i + strlen(word_tab[(n + 1) % 4]);

}

else

i = i + strlen(t);

}

}

}

main()

{

char line[80] = "I am very sad.";

replace_word(line);

puts(line); /* ④输出字符串应调用函数puts,putchar只能输出单个字符 */

}

10、找出满足下列条件的整数对

#include

#include

int factor(int n) /*该函数的功能是,求整数n的所有因子之和*/

{ int i, s = 0;

for (i = 1;i <= n;i++)

if (n % i == 0)s = s + i; /*各因子累加求和*/

return s; /*返回和值*/

}

int fun(int n, int a[][2]) /*该函数的功能是,在[1,n] 中查找满足题目条件的整数对*/

{ int i, j, g1, g2, k = 0;

for (i = 2;i <= n;i++)

{

g1 = factor(i); /*调用factor函数求得g1的因子之和*/

for (j = 1;j < i;j++)

{

g2 = factor(j); /*调用factor函数求得g2的因子之和*/

if (g1 == g2 && g1 == i + j + 1) /*比较两因子之和,若符合要求,则将其存入数组a中*/

{a[k][0] = j;a[k++][1] = i;}

}

}

return k; /*返回数组a中元素个数*/

}

void main()

{

FILE *fp;int i, n, m, a[100][2];

if ((fp = fopen("myf2.out", "w")) == NULL)

{printf("The file call not open!");exit(0);}

scanf("%d", &n); /*接收键盘输入的n*/

m = fun(n, a); /*用n,a作为实参调用fun函数*/

for (i = 0;i < m;i++)

{

printf("(%d,%d)\n", a[i][0], a[i][1]);

fprintf(fp, "(%d,%d)\n", a[i][0], a[i][1]);

} /*将a数组中的结果数据输出到屏幕及结果文件中*/

printf("\nMy exam number is:WLJY001\n"); /*将考生准考证号输出到屏幕及结果文件中*/

fprintf(fp, "\nMy exam number is:WLJY001\n");

fclose(fp);

}

11、验证3~2008的所有素数中存在这样两个素数

#include

#include

#include

#include

int prime(int n) /*该函数的功能是,判断整数a是否素数*/

{ int i;

for (i = 2;i <= n / 2;i++)

if (n % i == 0) return 0; /*若不是素数,函数值返回0*/

return 1; /*若是素数,函数值返回1*/

}

int fun(int n, int *a, int *b) /*该函数的功能是,在3~n之间寻找符合要求的一对素数*/

{ int n1, n2;

for (n1 = 3;n1 < n;n1 += 2)

{

if (prime(n1))n2 = n - n1;

if (prime(n2) && n1 + n2 == n) /*n1和n2均为素数,且和为n */

{*a = n1;*b = n2; return 1;} /*将找到的两个素数分别保存到数组a和b中,函数返回1*/ }

return 0; /*若找不到,函数返回0*/

}

void main()

{

FILE *fp; /*定义文件指针fp*/

int n = 2008, a, b, c;

if ((fp = fopen("myf2.out", "w")) == NULL)

{printf("Create File myf2.out failed!\n");exit(0);}

c = fun(n, &a, &b); /*调用fun函数找出3~n之间和值为n的一对素数*/

if (c) /*将找到的素数输出到屏幕并用写文件函数保存到结果文件中*/

{

printf("a=%d b=%d a+b=%d\n", a, b, a + b);

fprintf(fp, "%d+%d=%d\n", a, b, a + b);

}

else

fprintf(fp, "not found!");

printf("\nMy exam number is:WLJY001\n"); /*将考生准考证号输出到屏幕及结果文件中*/ fprintf(fp, "\nMy exam number is:WLJY001\n");

fclose(fp); /*关闭文件*/

}

12、数组部分元素逆置

#include

#include

int prime(int a) /*该函数的功能是,判断整数a是否是素数*/

{int k, i;

if (a == 1) return 0;

if (a == 2) return 1; /*a等于1和2时单独考虑*/

for (i = 2;i < a;i++)

if (a % i == 0) return (0);

return (1); /*若是素数,函数返回1*/

}

void reverse(int *a, int n, int m)

{

int i, k = -1, *b, *p, t; /*定义变量b和p为指针变量*/

for (i = 0;i < n;i++)

if (prime(a[i]))k = i; /*找到数组a中的最后一个素数*/

p = a + k - 1;

if (k - m < 0)b = a; /*判断最后一个素数之前的元素个数与m的大小*/

else b = a + k - m;

while (b < p) /*将最后一个素数之前的m个元素逆置*/

{t = *b;*b = *p; *p = t;

b++;p--;

}

}

void main()

{int a[20] = { 4, 3, 6, 7, 8, 13, 9, 19, 21, 26}}

, i, m, n = 10;

FILE *fp; /*定义文件指针 */

if ((fp = fopen("myf2.out", "w")) == NULL)

{printf("Creat File myf2.out failed!\n");exit(0);}

printf("Please input m:\n");

scanf("%d", &m); /*接收从键盘输入的m值*/

reverse(a, n, m); /*调用reverse函数变换数组a*/

for (i = 0;i < n;i++) /*将变换后的数组a输出到屏幕并用写文件函数保存到结果文件中*/ {printf("%4d", a[i]);

fprintf(fp, "%4d", a[i]);

}

printf("\nMy exam number is:WLJY001\n"); /*将考生准考证号输出到屏幕及结果文件中*/ fprintf(fp, "\nMy exam number is:WLJY001\n");

fclose(fp); /*关闭文件*/

}

13、取出一个正整数中的所有偶数数字

#include

#include

#include

void sort(int a[], int n) /*将数组a中的n个整数进行从大到小排列*/

{ int i, j, k, t;

for (i = 0;i < n - 1;i++) /*利用双重for循环*/

{k = i;

for (j = i + 1;j < n;j++)

if (a[j] > a[k])k = j;

if (k != i)

{t = a[k];a[k] = a[i];a[i] = t;}

/*利用中间变量t交换两者的值,最后将数组按从大到小的顺序进行排列*/ }

}

long fun(long s)

{

int d, b[10], i, j = 0;

long s1 = 0;

while (s > 0) /*利用while循环对数据s进行各位数字各位的分离*/

{ d = s % 10;

if (d % 2 == 0) /*判断各位是否为偶数,若是偶数则将其保存到数组b中*/

b[j++] = d;

s /= 10;

}

sort(b, j); /* 调用函数sort对b数组中存放的j个偶数进行排序*/

for (i = 0;i < j;i++)

s1 = s1 * 10 + b[i]; /* 利用j个偶数,构成一个最大的整数*/

return s1; /* 返回构成的最大数*/

}

void main()

{

long m, n;

FILE *fp; /*定义文件指针*/

if ((fp = fopen("myf2.out", "w")) == NULL) /*以只写方式"w"打开文件*/

{printf("The file call not open!");exit(0);}

scanf("%ld", &n); /*接收从键盘输入的n */

m = fun(n); /*调用fun函数求出整数n的所有偶数数字构成的一个最大数*/

printf("%ld\n", m); /*将所得结果输出到屏幕并用写文件函数保存到结果文件中*/

fprintf(fp, "%ld\n", m);

printf("\nMy exam number is:WLJY001\n"); /*将考生准考证号输出到屏幕及结果文件中*/ fprintf(fp, "\nMy exam number is:WLJY001\n");

fclose(fp); /*关闭文件*/

}

14、找出符合以下条件的Troisty数

#include

#include

#include

#define N 10

int Troitsky(long a[]) /*该函数的功能是,求出1000000以内所有的Troitsky数*/

{int count = 0, b;

long n, n1;

for (n = 1;n <= 1000000;n++) /*利用for循环对1~1000000的数进行变换*/

{n1 = n;b = 0;

while (n1 > 0)

{b++;n1 /= 10;} /*确定数n的位数,求得数n的首位数字*/

n1 = n % (long)pow(10, b - 1) * 10 + n / (long)pow(10, b - 1); /*将首位作为个位,其他三位数乘以10组成新的整数*/

if (n1 / n == (double)n1 / n && n1 / n > 1) /*判断新的整数是否是原数n的整数倍*/ a[count++] = n; /*将符合要求的数存入数组a中*/

}

return count; /*函数返回Troitsky数的个数*/

}

void main()

{

long a[N], i;

int k;

FILE *fp; /*定义文件指针*/

fp = fopen("myf2.out", "w"); /*以只写方式"w"打开文件*/

if (fp == NULL)exit(0);

k = Troitsky(a); /*调用Troitsky函数*/

for (i = 0;i < k;i++) /*将运行结果输出到屏幕并用写文件函数保存到结果文件中*/

{printf("%10ld", a[i]);fprintf(fp, "%10ld", a[i]); }

printf("\n"); /*换行*/

fprintf(fp, "\n");

printf("\nMy exam number is:WLJY001\n"); /*将考生准考证号输出到屏幕及结果文件中*/

fprintf(fp, "\nMy exam number is:WLJY001\n");

fclose(fp); /*关闭文件*/

}

15、产生Fibonacci

#include

#include

#include

#include

int Fibonprime(long f[], int n)

{

int i, m = 0;

long a[40] = {1, 1}, j, k;

for (i = 2;i < n;i++)

a[i] = a[i - 2] + a[i - 1]; /*利用for循环生成数列的前n项*/

for (i = 2;i < n;i++)

{

k = (long)sqrt(a[i]);

for (j = 2;j <= k;j++)

if (a[i] % j == 0)break; /*判断其是否是素数*/

if (j >= k + 1)f[m++] = a[i]; /*将素数存放到数组k中*/

}

return (m); /*数组中素数的个数作为函数值返回*/

}

main()

{

int i, m;

long f[40];

FILE *fp; /*定义文件指针 */

fp = fopen("myf2.out", "w"); /*以只写方式"w"打开文件*/

if (fp == NULL)

{ printf("Can not open de file!\n");exit(0);}

m = Fibonprime(f, 30); /*调用函数Fibonprime 求出Fibonacci数列前30个数中的素数 */

for (i = 0;i < m;i++) /*将找到的素数输出到屏幕并用写文件函数保存到结果文件中*/ printf("%ld\t", f[i]);

for (i = 0;i < m;i++)

fprintf(fp, "%ld\t", f[i]);

printf("\nMy exam number is:WLJY001\n"); /*将考生准考证号输出到屏幕及结果文件中*/

fprintf(fp, "\nMy exam number is:WLJY001\n");

fclose(fp); /*关闭文件*/

}

16、在数列中查找、移动

#include

#include

void sumfac(int x[], int n);

int fac(int n);

main()

{

int i, a[10] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512};

FILE *fp; /*定义文件指针*/

if ((fp = fopen("myf2.out", "w")) == NULL)

{ printf("Creat File myf2.out failed!\n");exit(0);}

sumfac(a, 10); /*调用函数sumfac对一维数值中的数列进行变换操作*/

printf("\n");fprintf(fp, "\n");

for (i = 0;i < 10;i++) /*将变换后的数列输出到屏幕并用写文件函数保存到结果文件中*/

{printf("%6d", a[i]);fprintf(fp, "%6d", a[i]);}

printf("\nMy exam number is:WLJY001\n"); /*将考生准考证号输出到屏幕及结果文件中*/

fprintf(fp, "\nMy exam number is:WLJY001\n");

fclose(fp); /*关闭文件*/

}

int fac(int n) /*该函数的功能是,求得n的所有因子之和*/

{int i, sum = 0;

for (i = 1;i <= n;i++)

if (n % i == 0)sum += i; /*求出n的所有因子及因子之和*/

return sum; /*函数返回和值*/

}

void sumfac(int x[], int n)

{

int i, j, k, m, sum;

for (i = n - 1, k = 0;i >= k;i--) /*利用循环,从后向前遍历数列查找超完全数*/

{sum = fac(x[i]); /*调用fac函数求得各元素的所有因子之和*/

if (fac(sum) == x[i] *2) /*利用if判断其是否是超完全数*/

{m = x[i];

for (j = i;j > 0;j--)x[j] = x[j - 1]; /*移动超完全数之前需将数列所有数依次后移*/

x[0] = m; /*将超完全数移动到数列的第一个位置*/

k++;i++;

}

}

}

17、编写函数int Del-findged (int a[],int n,int *f)

#include"stdio.h"

#include"conio.h"

int Del_findgcd(int a[], int n, int *f)

{

int i, k, g;

for (i = 0, k = 0;i < n;i++)

if (i % 2 == 0)a[k++] = a[i]; /*利用循环判断数组元素的下标,若是奇数则将其删除*/ if (n % 2 == 0)n = n / 2; /*判断数组中剩余元素的个数 */

else n = n / 2 + 1;

k = a[0];

for (i = 1;i < n;i++) /*通过循环找到能被所有数整除的最大的数即为最大公约数*/

{g = a[i];

while (k != g)

{

if (k > g)k = k - g;

else g = g - k;

}

}

*f = k; /*保存最大公约数到f指向的变量中*/

return n; /*函数返回数组中剩余的整数个数*/

}

main()

{

FILE *fp; /*定义文件指针*/

int i, a[10] = { 6, 8, 9, 11, 12, 13, 15, 16, 18, 19}, f, n;

if ((fp = fopen("myf2.out", "w")) == NULL)

{ printf("can't open file!");exit(0);}

n = Dle_findgcd(a, 10, &f); /*调用Dle_findgcd函数删除数组中的所有满足条件的整数并求出剩余整数的最大公约数*/

for (i = 0;i < n;i++) /*将数组中剩余的整数和这些整数的最大公约数输出到屏幕并用写文件函数保存到结果文件中*/

{printf("%d,", a[i]);fprintf(fp, "%d,", a[i]);}

printf("max common divisor=%d\n", f);

fprintf(fp, "max common divisor=%d\n", f);

printf("\nMy exam number is:WLJY001\n"); /*将考生准考证号输出到屏幕及结果文件中*/

fprintf(fp, "\nMy exam number is:WLJY001\n");

fclose(fp); /*关闭文件*/

}

18、找出给定范围内的和亲数

#include

#include

#include

int heqinmath(int m, int n, int a[][2])

{

int i, j, m1, s1, s2, count = 0;

for (m1 = m;m1 < n;m1++) /*通过循环对m~n的整数进行依次判断*/

{ s1 = 1;s2 = 1;

for (i = 2;i < m1;i++)

if (m1 % i == 0)s1 = s1 + i; /*找到某一整数m1的全部真因子并求和*/

for (j = 2;j < s1;j++)

if (s1 % j == 0)s2 = s2 + j; /*找到和值s1的真因子并求和*/

if ((s2 == m1) && (m1 != s1))

/*判断是否为和亲数*/

{a[count][0] = m1;

a[count++][1] = s1; /*将和亲数对保存到a指向的数组中*/

}

}

return count; /*函数返回a数组中和亲数对的个数*/

}

main()

{

int count, i, m, n, a[10][2];

FILE *fp; /*定义文件指针*/

fp = fopen("myf2.out", "w"); /*以只写方式"w"打开文件*/

if (fp == NULL)

{printf("Can not open the file!\n");exit(0);};

printf("Please input m,n:\n");

scanf("%d%d", &m, &n); /*从键盘输入m和n*/

count = heqinmath(m, n, a); /*调用函数heqinmath,求出m~n之间所有的和亲数对*/

for (i = 0;i < count;i++) /*将计算结果输出到屏幕并用写文件函数保存到结果文件中*/ printf("(%d,%d)\n", a[i][0], a[i][1]);

for (i = 0;i < count;i++)

fprintf(fp, "(%d,%d)\n", a[i][0], a[i][1]);

printf("\nMy exam number is:WLJY001\n"); /*将考生准考证号输出到屏幕及结果文件中*/

fprintf(fp, "\nMy exam number is:WLJY001\n");

fclose(fp); /*关闭文件*/

}

19、编写函数int prime-m(int n,int x[],long y[])

#include

#include

#include

int prime_m(int n, int x[], long y[])

{

int i, j, m, count;

long k = 0, q, k1, k2, k3;

for (m = 2;m <= n;m++) /*通过循环在2~n之间查找符合条件的整数*/

{k1 = pow(2, m) - 1;

q = sqrt(k1);

for (j = 2;j <= q;j++)

if (k1 % j == 0)break;

if (j <= q)continue; /*判断2m-1是否为素数*/

count = 0;k3 = k1;k2 = 0;

while (k3 > 0)

{

int w = k3 % 10;

if (w == 1) /*判断2m-1的十进制表示中是否包含数字1*/

{count++;}

k2 = k2 * 10 + w;

k3 = k3 / 10;

}

if (k2 % 2 == 0)continue; /*判断2m-1的反序数是否为奇数*/

if (count > 0)

{x[k] = m;y[k++] = k1;} /*符合条件的所有整数m保存到x指向的数组中,将与m对应的整数2m-1保存到y指向的数组中*/

}

return k; /*函数返回x数组中保存的整数个数*/

}

main()

{

FILE *fp; /*定义文件指针*/

long a[20];

int i, j, n, b[20], m;

if ((fp = fopen("myf2.out", "w")) == NULL)

{printf("Open file myf2.out failed!\n");exit(1);}

printf("input n:");

scanf("%d", &n); /*接收从键盘输入的参数n*/

m = search(n, b, a); /*调用search函数分别求得满足上述条件的所有三位正整数和所有四位正整数*/ for (i = 0;i < m;i++) /*将满足条件的三位正整数和四位正整数输出到屏幕并用写文件函数保存到结果文件中*/

{ printf("%5d%15ld\n", b[i], a[i]); fprintf(fp, "%5d%15ld\n", b[i], a[i]);}

printf("\nMy exam number is:WLJY001\n"); /*将考生准考证号输出到屏幕及结果文件中*/

fprintf(fp, "\nMy exam number is:WLJY001\n");

fclose(fp); /*关闭文件*/

}

20、编写函数int find(int n,long x[])

#include

#include

#include

#define min(x,y) ((x)<(y)?(x):(y)) /* ①宏定义的格式为:#define 标识符(形参表)形参表达式,形参表中的形参无需声明类型*/

int min_dist(int a[], int b[], int m, int n) /* ②由后面程序知,函数的前两个形参均为数组,所以此处应改为min_dist(int a[],int b[],int m,int n) */

{

int min = INT_MAX;

int ia = 0, ib = 0;

while (ia < m && ib < n) /* ③循环限制条件应是ia,ib都不能大于数组元素的个数,两者是"与"的关系*/

if (a[ia] >= b[ib])

{

min = min(min, a[ia] - b[ib]);

ib++;

}

else

{

min = min(min, b[ib] - a[ia]);

ia++;

}

return min;

}

main()

{

int a[] = {2, 4, 8, 11, 16}, b[] = {1, 5, 7, 13, 24};

int i, m, n;

m = sizeof(a) / sizeof(int);

n = sizeof(b) / sizeof(int);

printf("\n");

for (i = 0;i < m;i++)printf("%5d", a[i]);

printf("\n");

for (i = 0;i < n;i++) printf("%5d", b[i]);

printf("\n min distance=%d", min_dist(a, b, m, n)); /* ④此处需要输出函数的返回值,printf 函数格式控制符应为 "%d"*/

getch();

}

相关主题
相关文档 最新文档