C语言第二次作业

发布在 C语言

1、哥德巴赫猜想(2)——改编自习题5.14


题目描述:

哥德巴赫作了如下猜想:一个大于等于4的偶数都是两个素数之和。编写一个程序证明对于在正整数Begin、End之间的偶数,这一猜测成立。将判断一个数是否是素数定义成函数。
本题包含多组测试数据。

输入格式说明:

每组测试数据输入占一行,包括两个正整数,依次为Begin,End,4≤Begin<End≤200,遇文件尾测试结束。

输出格式说明:

输出在规定范围内所有偶数的哥德巴赫猜想形式的分解,存在多种不同输出结果组合时,输出满足要求的结果中分解后第一个数最小的结果,需要在第i组测试数据结果输出前添加一行提示信息:“CASE:i”,表示是第i组测试数据对应的结果,相邻两组测试样例的输出结果之间空一行。

样例输入:

10 20
45 145

样例输出:

CASE:1
COLDBACH’S CONJECTURE:
Every even number n>=4 among 10~20 is the sum of two primes:
10=3+7
12=5+7
14=3+11
16=3+13
18=5+13
20=3+17

CASE:2
COLDBACH’S CONJECTURE:
Every even number n>=4 among 45~145 is the sum of two primes:
46=3+43
48=5+43
50=3+47
52=5+47
54=7+47
56=3+53
58=5+53
60=7+53
62=3+59
64=3+61
66=5+61
68=7+61
70=3+67
72=5+67
74=3+71
76=3+73
78=5+73
80=7+73
82=3+79
84=5+79
86=3+83
88=5+83
90=7+83
92=3+89
94=5+89
96=7+89
98=19+79
100=3+97
102=5+97
104=3+101
106=3+103
108=5+103
110=3+107
112=3+109
114=5+109
116=3+113
118=5+113
120=7+113
122=13+109
124=11+113
126=13+113
128=19+109
130=3+127
132=5+127
134=3+131
136=5+131
138=7+131
140=3+137
142=3+139
144=5+139

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <stdio.h>
#include <math.h>

int isPrime (int x);
int main (void)
{
int begin, end;
int count, number;
int subnumber1, subnumber2;
for (count = 1 ; scanf("%d%d", &begin, &end) != EOF ; ++count)
{
if (count != 1)
putchar('\n');
printf("CASE:%d\n", count);
printf("COLDBACH'S CONJECTURE:\n");
printf("Every even number n>=4 among %d~%d is the sum of two primes:\n", begin, end);
if (begin % 2 != 0)
begin++;
for (number = begin ; number <= end ; number += 2)
{
for (subnumber1 = 2 ; subnumber1 <= (number/ 2) ; ++subnumber1)
{
subnumber2 = number - subnumber1;
if (isPrime(subnumber2) && isPrime(subnumber1))
{
printf("%d=%d+%d\n", number, subnumber1, subnumber2);
break;
}
}
}
}
return 0;
}

/*************************************************
Function: isPrime
Description: 判断正整数是否为素数
Input: 一个正整数x
Return: 1表示素数 0表示合数
*************************************************/
int isPrime (int x)
{
int i;
for (i = 2 ; i <= sqrt(x) ; ++i)
if (x % i == 0) return 0;
return 1;
}

2、第k个数——改编自习题5.13


题目描述:

输入正整数n和k,输出n中从右端开始的第k个数字的值(k从1开始)。将求n中右端第k个数字定义成函数,如果k超过了n的位数,则函数返回-1;否则返回n中第k个数字。
本题包含多组测试数据。

输入格式说明:

每组测试数据输入占一行,包括两个正整数,依次为n,k,n在1~4000000000之间(闭区间),遇文件尾测试结束。

输出格式说明:

每组测试样例的输出结果占一行,输出函数返回结果。

样例输入:

321 3
421 4
42 12

样例输出:

3
-1
-1

解答:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdio.h>
int getKFromN (unsigned long n , int k);

int main (void)
{
unsigned long n;
int k;
while (scanf("%lu%d", &n, &k) != EOF)
{
printf("%d\n", getKFromN(n, k));
}
return 0;
}

/*************************************************
Function: getKFromN
Description: 返回n中从右端开始的第k个值
Input: 一个1~4000000000的正整数n 一个正整数k
Return: 一个正整数 n中的第k个数字 -1表示越位
*************************************************/
int getKFromN (unsigned long n , int k)
{
int unit = 0;//表示最后一位
int count;//表示当前位数
unsigned long result = n;//存储结果
for (count = 1 ; count <= k ; count++)
{
unit = result % 10;
result = result / 10;
}
if (!(unit == 0 && result == 0))
return unit;
else
return -1;
}
```

## 3、冰雹数——改编自习题5.11

* * *

### 题目描述:

n(0)是一个给定的正整数,对于i=0,1,2,...,定义:(1)若n(i)是偶数,则n(i+1)=n(i)/2;(2)若n(i)是奇数,则n(i+1)=3n(i)+1;(3)若n(i)是1,则序列结束。
本题包含多组测试数据。


### 输入格式说明:

每组测试数据输入占一行,包括一个正整数n0,n0在1~4000000000之间(闭区间),遇文件尾测试结束。

### 输出格式说明:

输出冰雹数序列以及序列数的总个数,相邻两组测试样例的输出结果之间空一行。

### 样例输入:

77
92


### 样例输出:

Hailstone generated by 77:
77 232 116 58 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
Number of hailstone generated:23

Hailstone generated by 92:
92 46 23 70 35 106 53 160 80 40 20 10 5 16 8 4 2 1
Number of hailstone generated:18

### 解答:

#include <stdio.h>
unsigned long long getNextHailstoneNumber (unsigned long long n);

int main (void)
{
unsigned long long number;
int count;
int flag = 1;
while (scanf(“%llu”, &number) != EOF)
{
if (!flag)
putchar(‘\n’);
printf(“Hailstone generated by %llu:\n”, number);
count = 0;
while (number != 1)
{
count += 1;
printf(“%llu “, number);
number = getNextHailstoneNumber(number);
}
printf(“1\n”);
printf(“Number of hailstone generated:%d\n”, count + 1);
flag = 0;
}
return 0;
}

/*
Function: getNextHailstoneNumber
Description: 返回以n为起始数的下一个冰雹数
Input: 一个的正整数n
Return: 一个正整数,表明n的下一个冰雹数
*/

unsigned long long getNextHailstoneNumber (unsigned long long n)
{
if (n % 2 == 0)
return n / 2;
else
return 3 * n + 1;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

## 4、计算题——改编自习题5.10

* * *

### 题目描述:

编程计算s=1+1/2!+1/3!+1/4!+...+1/n!。n由终端输入,将计算n!定义成函数。
本题包含多组测试数据。

### 输入格式说明:

每组测试数据输入占一行,包括一个正整数n,n在1~20之间(闭区间),遇文件尾测试结束。

### 输出格式说明:

每组测试样例的输出结果占一行,输出s,保留18位小数。
注:20!=2432902008176640000。

### 样例输入:

1
2

### 样例输出:

1.000000000000000000
1.500000000000000000

### 解答:

#include <stdio.h>
long long getFactorial (int n);

int main (void)
{
int number;
int i;//循环变量
double s;
while (scanf(“%d”, &number) != EOF)
{
s = 0;
for (i = 1 ; i <= number ; ++i)
{
s += 1.0 / getFactorial(i);
}
printf(“%.18f\n”, s);
}
return 0;
}

/*
Function: getFactorial
Description: 返回n的阶乘
Input: 一个正整数n
Return: 一个正整数n!
*/
long long getFactorial (int n)
{
int count;
long long result = 1;
for (count = 2 ; count <= n; ++count)
{
result *= count;
}
return result;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

## 5、掷骰子游戏——改编自习题5.1

* * *

### 题目描述:

编写一个模拟“投掷双骰子”的游戏程序。游戏规则:每轮投两次,取两次的和,第一轮若和为7或11则获胜,游戏结束;若和为2,3,或12则输了,失败结束;若和为其他数字,则将此值作为自己的点数,继续第二轮,第三轮⋯⋯直到某轮的和等于该点数则获胜,若出现和为7,则输掉游戏。模拟每掷一次骰子的随机取数规则:输入一个非负整数,称为启动数,你需要计算得到启动数各位数之和记为sum,现将1~6这6张数字卡片按顺时钟方向摆放一个环,一只蚂蚁每次从数字为1的卡片摆放的位置出发,这时你告诉蚂蚁按顺时钟方向走sum步,蚂蚁最终停留位置上的卡片数字即视为本次掷骰子得到的点数。
本题包含多组测试数据。


### 输入格式说明:

第一行输入n表示测试样例的个数,后面紧接着有n行输入,每行输入包含两个非负整数记为a,b,整数范围在0~10000之间(闭区间),视为第一轮两次投掷的启动数,若进行到了第n轮时,则第n轮两次投掷的启动数分别看作是a+n-1,b+n-1;


### 输出格式说明:

每组测试样例的输出结果占一行,输出本次游戏的最终结果。

### 样例输入:

3
1234 1
1 42
0 422

### 样例输出:

success!
fail!
success!

### 解答:

#include <stdio.h>
int calcSum (int startNumber);

int main (void)
{
int number;
int count;
int a, b;
int dieA, dieB, dieSum;
int winNumber;
int n;
scanf(“%d”, &number);
for (count = 0 ; count < number ; ++count)
{
scanf(“%d%d”, &a, &b);
dieA = calcSum(a) % 6 + 1;
dieB = calcSum(b) % 6 + 1;
dieSum = dieA + dieB;
if (dieSum == 7 || dieSum == 11)
{
printf(“success!\n”);
continue;
} else if (dieSum == 2 || dieSum == 3 || dieSum == 12)
{
printf(“fail!\n”);
continue;
} else
{
winNumber = dieSum;
}
n = 1;//此处与题目描述不符
do
{
dieA = calcSum(a + n) % 6 + 1;
dieB = calcSum(b + n) % 6 + 1;
dieSum = dieA + dieB;
n += 1;
if (dieSum == 7)
{
printf(“fail!\n”);
break;
}
}while (dieSum != winNumber);
if (dieSum == winNumber)
printf(“success!\n”);
}

return 0;

}

/*
Function: calcSum
Description: 计算启动数的各位的和sum
Input: 一个正整数n(启动数)
Return: 一个正整数n(启动数各个位数的和)
*/
int calcSum (int startNumber)
{
int unit = 0;
int result = startNumber;
int sum = 0;
while (result != 0)
{
unit = result % 10;
sum += unit;
result = result / 10;
}
return sum;
}
`

评论和共享

C语言第一次作业

发布在 C语言

2016年4月1日C语言作业答案及遇到的问题

题目及解答

2.一年中的第几天——改编自习题4.3


原题链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<stdio.h>;
int main (void)
{
int year, month, day;
int count;
int isLeap;
while (scanf("%d%d%d", &year, &month, &day) == 3)
{
count = 0;
isLeap = (year % 4 == 0 && year % 100 != 0) || (year % 100 == 0 && year % 400 == 0);
count += day;
month -= 1;
switch (month)
{
case 12: count += 31; month -= 1;
case 11: count += 30; month -= 1;
case 10: count += 31; month -= 1;
case 9: count += 30; month -= 1;
case 8: count += 31; month -= 1;
case 7: count += 31; month -= 1;
case 6: count += 30; month -= 1;
case 5: count += 31; month -= 1;
case 4: count += 30; month -= 1;
case 3: count += 31; month -= 1;
case 2: count += 28 + isLeap; month -= 1;
case 1: count += 31; month -= 1;
default: break;
}
printf("该日期是这一年中的第%d天\n", count);
}
return 0;
}

3.税金额度计算——改编自习题4.4


原题链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/* ZhihaoChen CSEE 1501 */
#include<stdio.h>;
/* Prototype Declaration */
void if_else_process (double x);
void switch_process (double x);
/* Main Function */
int main(void)
{
int number;
scanf("%d", &number);
int t; double x;
int count;
for (count = 0 ; count & number ; ++count)
{
scanf("%d%lf", &t, &x);
switch (t)
{
case 0:
if_else_process(x);
break;
case 1:
switch_process(x);
break;
case 2:
if_else_process(x);
switch_process(x);
break;
default:
break;
}
if (count != (number - 1))
printf("\n");
}
return 0;
}
/* data processing and output */
void if_else_process (double x)
{
double output;
if (x < 1000)
output = 0;
else if (x >= 1000 && x < 2000)
output = x * 0.05;
else if (x >= 2000 && x < 3000)
output = x * 0.10;
else if (x >= 3000 && x < 4000)
output = x * 0.15;
else if (x >= 4000 && x < 5000)
output = x * 0.20;
else if (x > 5000)
output = x * 0.25;
printf ("After if-else processing,the amount of tax to be paid is : %.2f\n", output);
}

void switch_process (double x)
{
double output;
switch((int)x / 1000)
{
case 0: output = 0; break;
case 1: output = x * 0.05; break;
case 2: output = x * 0.10; break;
case 3: output = x * 0.15; break;
case 4: output = x * 0.20; break;
default: output = x * 0.25; break;
}
printf("After switch processing,the amount of tax to be paid is : %.2f\n", output);
}

4.两个实数的四则运算——改编自习题4.5


原题链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/* ZhihaoChen CSEE 1501 */
#include<stdio.h>;
/* Prototype Declaration */
void if_else_process(double a, double b, char c);
void switch_process(double a, double b, char c);
/* Main Function */
int main(void)
{
int t, count;
double a, b;
char c;
for (count = 0 ; (scanf("%d%lf%lf %c", &t, &a, &b, &c) != EOF) ; ++count)
{
if(count != 0)
printf("\n");
switch (t)
{
case 0:
if_else_process(a, b, c);
break;
case 1:
switch_process(a, b, c);
break;
case 2:
if_else_process(a, b, c);
switch_process(a, b, c);
break;
default:
break;
}
}
return 0;
}
/* data processing and output */
void if_else_process (double a, double b, char c)
{
double output = 0.0;
if (c == '+')
output = a + b;
if (c == '-')
output = a - b;
if (c == '*')
output = a * b;
if (c == '/')
output = a / b;
printf ("After if-else processing,the result is : %.2f\n", output);
}

void switch_process (double a, double b, char c)
{
double output = 0.0;
switch(c)
{
case '+': output = a + b; break;
case '-': output = a - b; break;
case '*': output = a * b; break;
case '/': output = a / b; break;
default: break;
}
printf("After switch processing,the result is : %.2f\n", output);
}

5.合并空格字符输出——改编自习题4.7


原题链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#define CHAR 0
#define SPACE 1

int main (void)
{
char character;
int status = CHAR;
while ((character = getchar()) != EOF)
{
if ((character == ' ') && (status == CHAR))
{
status = SPACE;
printf(" ");
}
if ((character != ' ') && (status == CHAR))
{
printf("%c", character);
}
if ((character != ' ') && (status == SPACE))
{
status = CHAR;
printf("%c", character);
}
}
return 0;
}

6.求π的近似值——改编自习题4.10


原题链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <math.h>

int main (void)
{
double item = 1.0;
double pi = 0.0;
int count;
for (count = 0 ; (item >= 1.0e-5) ; ++count)
{
item = 1.0/(2 * count + 1);
if (count % 2 == 0)
pi += item;
else
pi += (-item);
}
printf("%.9f\n", pi * 4);
return 0;
}

7.验证哥德巴赫猜想——改编自习题4.13


原题链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <math.h>

int isPrime (int x);

int main (void)
{
int number, testnum;
scanf ("%d", &number);
int count, subnumber1, subnumber2;
for (count = 0 ; count < number ; ++count)
{
scanf("%d", &testnum);
for (subnumber1 = 2 ; subnumber1 <= (testnum / 2) ; ++subnumber1)
{
subnumber2 = testnum - subnumber1;
if (isPrime(subnumber2) && isPrime(subnumber1))
{
printf("%d=%d+%d\n", testnum, subnumber1, subnumber2);
break;
}
}
}
return 0;
}

int isPrime (int x)
{
int i;
for (i = 2 ; i <= sqrt(x) ; ++i)
if (x % i == 0) return 0;
return 1;
}

8.正整数相加求平均数——改编自习题4.17


原题链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>
int main (void)
{
int number;
scanf("%d", &number);
int count, subcount, status; int n, positiveNumber;
long sumNumber;
double averageNumber;
for (count = 0 ; count < number ; ++count)
{
n = 0; sumNumber = 0;
positiveNumber = 0;
averageNumber = 0.0;
scanf("%d", &status);
switch(status)
{
case 0:
for (subcount = 0 ; subcount < 10 ; ++subcount)
{
scanf("%d", &n);
if (n <= 0) continue;
sumNumber += n;
positiveNumber += 1;
}
averageNumber = (double)sumNumber / positiveNumber;
if (positiveNumber != 0)
printf("In \"continue\" way,numbers=%d,average=%f\n", positiveNumber, averageNumber);
break;
case 1:
for (subcount = 0 ; subcount < 10 ; ++subcount)
{
scanf("%d", &n);
if(n > 0)
{
sumNumber += n;
positiveNumber += 1;
}
}
averageNumber = (double)sumNumber / positiveNumber;
if (positiveNumber != 0)
printf("In \"no continue\" way,numbers=%d,average=%f\n", positiveNumber, averageNumber);
break;
default:
break;
}
}
return 0;
}

要注意的问题

1.注意审题,比如第六题注意到“最后一项”的绝对值,再比如说第三题注意到输出格式逗号前后都没有空格

2.注意数据类型的范围

3.注意浮点数的科学计数法表示

4.注意条件运算要不要加等于号

5.逻辑错误比语法错误更难检查,要关注程序的细节

6.注意scanf在读取的字符(%c)时候会识别’ ‘,所以在格式化字符串中用’ %c’或者’%1s’均可(后者无法通过系统)

7.注意浮点数的运算存在精度损失,例:double i = 1/e-5 而(int)i=99999,在作为循环条件时需要格外注意,一般情况下最好避免,或者+0.0001再取整

评论和共享

  • 第 1 页 共 1 页
作者的图片

码龙黑曜

iOS开发者/计算机科学/兽人控


华中科技大学 本科在读


Wuhan, China