本题要求实现一个函数,统计给定字符串中英文字母、空格或回车、数字字符和其他字符的个数。
函数接口定义:
void StringCount( char s[] );
其中char s[]
是用户传入的字符串。函数StringCount
须在一行内按照
letter = 英文字母个数, blank = 空格或回车个数, digit = 数字字符个数, other = 其他字符个数
的格式输出。
裁判测试程序样例:
#include
#define MAXS 15
void StringCount( char s[] );
void ReadString( char s[] ); /* 由裁判实现,略去不表 */
int main()
{
char s[MAXS];
ReadString(s);
StringCount(s);
return 0;
}
/* Your function will be put here */
输入样例:
aZ &
09 Az
输出样例:
letter = 4, blank = 3, digit = 2, other = 1
void StringCount(char s[]) {
int i;
int l = 0, b = 0, d = 0, o = 0;
for (i = 0; s[i] != '\0'; i++) {
if (('a' <= s[i] && s[i] <= 'z') || ('A' <= s[i] && s[i] <= 'Z')) l++;
else if (s[i] == ' ' || s[i] == '\n') b++;
else if ('0' <= s[i] && s[i] <= '9') d++;
else o++;
}
printf("letter = %d, blank = %d, digit = %d, other = %d", l, b, d, o);
}
给定两个均不超过9的正整数a和n,要求编写函数求 a + a a + a a a + + ⋯ + a a ⋯ a a+aa+aaa++⋯+aa⋯a a+aa+aaa++⋯+aa⋯a(n个a)之和。
函数接口定义:
int fn( int a, int n );
int SumA( int a, int n );
其中函数fn
须返回的是n
个a
组成的数字;SumA
返回要求的和。
裁判测试程序样例:
#include
int fn( int a, int n );
int SumA( int a, int n );
int main()
{
int a, n;
scanf("%d %d", &a, &n);
printf("fn(%d, %d) = %d\n", a, n, fn(a,n));
printf("s = %d\n", SumA(a,n));
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例:
2 3
输出样例:
fn(2, 3) = 222
s = 246
int fn(int a, int n) {
int i;
int m = 0;
for (i = 1; i <= n; i++) {
m = 10 * m + a;
}
return m;
}
int SumA(int a, int n) {
int i;
int y = 0;
for (i = 1; i <= n; i++) {
y = y + fn(a, i);
}
return y;
}
本题要求实现一个计算整数因子和的简单函数,并利用其实现另一个函数,输出两正整数m和n(0 函数接口定义: 其中函数 裁判测试程序样例: 输入样例1: 输出样例1: 输入样例2: 输出样例2: 本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0 函数接口定义: 其中函数 裁判测试程序样例: 输入样例1: 输出样例1: 输入样例2: 输出样例2: 本题要求实现一个判断素数的简单函数,并利用该函数验证哥德巴赫猜想:任何一个不小于6的偶数均可表示为两个奇素数之和。素数就是只能被1和自身整除的正整数。注意:1不是素数,2是素数。 函数接口定义: 其中函数 裁判测试程序样例: 输入样例: 输出样例: 本题要求实现一个求整数的逆序数的简单函数。 函数接口定义: 其中函数 裁判测试程序样例: 输入样例: 输出样例: 本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由 ( a 0 a 1 . . . a n − 1 ) (a_0a_1...a_{n-1}) (a0a1...an−1)变换为 ( a n − m . . . a n − 1 a 0 a 1 . . . a n − m − 1 ) (a_{n-m}...a_{n-1}a_0a_1...a_{n-m-1}) (an−m...an−1a0a1...an−m−1)(最后m个数循环移至最前面的m个位置)。 函数接口定义: 其中 裁判测试程序样例: 输入样例: 输出样例:int factorsum( int number );
void PrintPN( int m, int n );
factorsum
须返回int number
的因子和;函数PrintPN
要逐行输出给定范围[m, n]
内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + … + 因子k”,其中完数和因子均按递增顺序给出。如果给定区间内没有完数,则输出一行“No perfect number”。#include
6 30
6 is a perfect number
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
7 25
No perfect number
int factorsum(int number) {
int i = 1, sum = 0;
if (number == 1) return 1;
else {
while (i < number) {
if (number % i == 0) sum = sum + i;
i++;
}
return sum;
}
}
void PrintPN(int m, int n) {
int cnt = 0;
if (m == n == 1) printf("1 = 1");
else {
while (m <= n) {
if (m == 1) printf("1 = 1\n");
else {
if (factorsum(m) == m) {
printf("%d = 1", m);
int i = 2;
while (i < m) {
if (m % i == 0) {
printf(" + %d", i);
}
i++;
}
printf("\n");
cnt++;
}
}
m++;
}
if (cnt == 0) printf("No perfect number");
}
}
实验6-5 使用函数输出指定范围内的Fibonacci数
int fib( int n );
void PrintFN( int m, int n );
fib
须返回第n
项Fibonacci
数;函数PrintFN
要在一行中输出给定范围[m, n]
内的所有Fibonacci
数,相邻数字间有一个空格,行末不得有多余空格。如果给定区间内没有Fibonacci
数,则输出一行“No Fibonacci number”。#include
20 100 7
fib(7) = 13
21 34 55 89
2000 2500 8
fib(8) = 21
No Fibonacci number
int fib(int n) {
if (n == 1 || n == 2) return 1;
else return fib(n - 1) + fib(n - 2);
}
void PrintFN(int m, int n) {
int i = 1, cnt = 0;
while (fib(i) <= n) {
if (fib(i) >= m) {
printf("%d", fib(i));
cnt++;
if (fib(i + 1) <= n)printf(" ");
}
i++;
}
if (cnt == 0) printf("No Fibonacci number");
}
实验6-6 使用函数验证哥德巴赫猜想
int prime( int p );
void Goldbach( int n );
prime
当用户传入参数p
为素数时返回1,否则返回0;函数Goldbach
按照格式“n
=p+q”输出n
的素数分解,其中p≤q均为素数。又因为这样的分解不唯一(例如24可以分解为5+19,还可以分解为7+17),要求必须输出所有解中p最小的解。#include
89 100
89 is a prime number
90=7+83, 92=3+89, 94=5+89, 96=7+89, 98=19+79
100=3+97,
int prime(int p) {
int i;
if (p == 1) return 0;
else {
for (i = 2; i <= sqrt(p); i++) {
if (p % i == 0) return 0;
}
return 1;
}
}
void Goldbach(int n) {
int cnt = 2;
while (cnt < n) {
if (prime(cnt) == 1) {
if (prime(n - cnt) == 1) break;
}
cnt++;
}
printf("%d=%d+%d", n, cnt, n - cnt);
}
实验6-7 使用函数输出一个整数的逆序数
int reverse( int number );
reverse
须返回用户传入的整型number
的逆序数。#include
-12340
-4321
int reverse(int number) {
int x = 0, a;
if (number == 0) return 0;
else {
while (number != 0) {
a = number % 10;
number /= 10;
x = 10 * x + a;
}
return x;
}
}
实验6-26 一维数组 数组循环右移
void ArrayShift( int a[], int n, int m );
a[]
是用户传入的数组;n
是数组的大小;m
是右移的位数。函数ArrayShift
须将循环右移后的数组仍然存在a[]
中。#include
6 2
1 2 3 4 5 6
5 6 1 2 3 4
int ArrayShift(int a[], int n, int m) {
int i;
int b[MAXN];
for (i = 0; i < n; i++) b[i] = a[i];
if (n >= m) {
for (i = 0; i < m; i++) a[i] = b[i + n - m];
for (i = m; i < n; i++) a[i] = b[i - m];
} else if (m % n == 0) {
for (i = 0; i < n; i++) a[i] = b[i];
} else if (m > n) {
if (m < MAXN) {
for (i = 0; i < m - n; i++) a[i] = b[i + 2 * n - m];
for (i = m - n; i < n; i++) a[i] = b[i - m + n];
}
}
return *a;
}