本文由以下人员编辑:

小闽(上传)丨小宸(审核)

问就是我懒,不要问我为什么一文那么多人编辑

7-1 求整数的位数及各位数字之和

对于给定的正整数N,求它的位数及其各位数字之和。

输入格式:

输入在一行中给出一个不超过109的正整数N。

输出格式:

在一行中输出N的位数及其各位数字之和,中间用一个空格隔开。

输入样例:

1
321

输出样例:

1
3 6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
int main()
{
int N,i=0,sum=0;
scanf("%d",&N);
while(N!=0)
{
sum+=N%10;
i++;
N=N/10;
}
printf("%d %d",i,sum);
return 0;
}

7-2 循环-古角猜想

日本数学家古角静夫研究自然数时,发现一个有趣现象:“如果是个偶数就除2,如果是奇数就乘以3加1”,经过有限个这样的处理步骤,最后一定能得到1.
任意输入一个自然数,给出得到结果1的运算过程。

输入格式:

输入一个自然数n

输出格式:

输出每次运算步骤,直到结果为1.

输入样例1:

1
5

输出样例1:

1
2
3
4
5
5*3+1=16
16/2=8
8/2=4
4/2=2
2/2=1

输入样例2:

1
6

输出样例1:

1
2
3
4
5
6
7
8
6/2=3
3*3+1=10
10/2=5
5*3+1=16
16/2=8
8/2=4
4/2=2
2/2=1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<stdio.h>
int main()
{
int n,i=0;
scanf("%d",&n);
for(;;)
{
i++;
if(n%2==0)
{
printf("%d/2=%d\n",n,n/2);
n=n/2;
}
else
{
printf("%d*3+1=%d",n,3*n+1);
n=3*n+1;
}
if(n==1)break;
}

return 0;
}

7-3 又见A+B(3)

求两个整数之和。

输入格式:

测试数据有多组。每组测试输入两个整数a、b,当a、b同时为0时,表示输入结束。

输出格式:

对于每组测试,输出一行,包含一个整数,表示a、b之和。

输入样例:

1
2
3
4
1 2
3 4
5 6
0 0

输出样例:

1
2
3
3
7
11
1
2
3
4
5
6
7
8
9
10
11
12
#include<iostream>

using namespace std;
int main(){
int a,b;
while(1){
cin>>a>>b;
if(a==0&&b==0) break;
cout<<a+b<<endl;
}
return 0;
}

7-4 又见A+B(2)

两个整数之和。

输入格式:

测试数据有多组,处理到文件尾。每组测试输入两个整数a、b。

输出格式:

对于每组测试,输出一行,包含一个整数,表示a、b之和。

输入样例:

1
2
3
1 2
3 4
5 6

输出样例:

1
2
3
3
7
11
1
2
3
4
5
6
7
8
9
10
#include<iostream>

using namespace std;
int main(){
int a,b;
while(cin>>a>>b){
cout<<a+b<<endl;
}
return 0;
}

7-5 死脑筋

HD**L 遇到了一个数学题:10000 元钱,一元钱可以买一瓶水,三个瓶盖可以换一瓶水,请问一共可以喝多少瓶水。死脑筋的 HD**L 居然想要通过实践来得到答案,他还到处借钱凑齐 10000元。你决定帮他解出这个问题,为了 HD**L 以后不再陷入这样的问题,你决定帮 HD**L 写出一个通用程序:有n 元钱,一元钱可以买一瓶水,k 个瓶盖换一瓶水,一共可以喝到多少瓶水。

输入格式:

输入仅一行两个数,n,k。2≤kn≤1e8

输出格式:

输出仅一个整数,代表 HD**L 一共可以喝到多少瓶水。

输入样例:

在这里给出一组输入。例如:

1
10 3

输出样例:

在这里给出相应的输出。例如:

1
14
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

#include <stdio.h>
int main()
{
int n,k;
int pg;
int sum = 0;
scanf("%d %d",&n,&k);
sum += n;
pg = n;
while(pg >= k)
{
sum += pg/k;
pg = pg%k + pg/k;
}
printf("%d",sum);
return 0;
}

7-6 求班级平均分

某班级若干个学生参加测验。在得到本次测验的成绩之后,确定该班级本次测验的平均分。

输入格式:

一个班级的若干个测验成绩( 0 到 100 之间的整数),以 −1 作为结束标记(结束标记不计算平均值)。

输出格式:

班级测验成绩平均分,结果保留两位小数。

若无输入成绩,则显示 No grades were entered

输入样例 1:

1
75 94 97 88 70 64 83 89 -1

输出样例 1:

在这里给出相应的输出。例如:

1
82.50

输入样例 2:

1
-1

输出样例 2:

在这里给出相应的输出。例如:

1
No grades were entered
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
int main(){
int s[10010];
int o = 0;
double sum = 0;
while(1) {
scanf("%d", &s[o]);
if(s[o] == -1) {
break;
}
sum += s[o];
o++;
}
if(o){
printf("%.2lf", sum / o );
} else {
printf("No grades were entered");
}
}

7-7 念数字

输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下:

1
2
3
4
5
6
7
8
9
10
0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu

输入格式:

输入在一行中给出一个整数,如:1234

提示:整数包括负数、零和正数。

输出格式:

在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如
yi er san si

输入样例:

1
-600

输出样例:

1
fu liu ling ling
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
#include <stdio.h>
int count(int x);
int main()
{
int n;
if(scanf("%d",&n)){};//输入要读的整数
int c;
if(n<0)
{
printf("fu ");
n=-n;
}//当输入的整数为负数时,取负数的相反数
c=count(n);
for(int i=0;c>0;i++)//循环的控制条件为c>0,之前写成了n>0
{
int m;
m=n/c;//取出该整数的第一位数字
n%=c;
switch (m)
{
case 0:
printf("ling");
break;
case 1:
printf("yi");
break;
case 2:
printf("er");
break;
case 3:
printf("san");
break;
case 4:
printf("si");
break;
case 5:
printf("wu");
break;
case 6:
printf("liu");
break;
case 7:
printf("qi");
break;
case 8:
printf("ba");
break;
case 9:
printf("jiu");
}
if(c>9)//判断点,控制最后输出没有空格
{
printf(" ");
}
c/=10;
}
return 0;
}
int count(int x)//例如-400,则返回值为100
{
int cnt=1;
while(x>9)
{
x/=10;
cnt*=10;
}
return cnt;
}

7-8 N个数求和

本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。

输入格式:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1:

1
2
5
2/5 4/15 1/30 -2/60 8/3

输出样例1:

1
3 1/3

输入样例2:

1
2
2
4/3 2/3

输出样例2:

1
2

输入样例3:

1
2
3
1/3 -1/6 1/8

输出样例3:

1
7/24
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>

long long gcd(long long a,long long b)//求最大公约数。
{
if(a == 0)
return 0;
else
return (b == 0) ? a : gcd(b, a % b);
}

int main()
{
int N;
long long lcp;//用以记录最小公倍数
long long a,b,c,d;
int i = 1;
scanf("%d",&N);
scanf("%lld/%lld",&a,&b);
int t0 = gcd(a,b);
if(a)
{
a /= t0;
b /= t0;
}

while(i < N)
{
scanf("%lld/%lld",&c,&d);
lcp = b / gcd(b,d) * d;//通过最大公约数换算出两个分母的最小公倍数
a = a * lcp / b + c * lcp / d;//通分后分子和
b = lcp;
int t0 = gcd(a,b);
if(t0 != 0)//从扩大最小公倍数之后的形式变换回来
{
a = a / t0;
b = b / t0;
}
i++;
}
if(a && a/b == 0)/// 整数部分为0 且 a不为 0
printf("%lld/%lld\n",a%b,b);
else if(a%b == 0)/// 小数部分为0
printf("%lld\n",a/b);
else
printf("%lld %lld/%lld\n",a/b,a%b,b);
return 0;
}

7-10 4.9-交替显示指定数量的+和-符号

编写一段程序, 使之像下边这样交替显示+和-, 总个数等于所输入的整数值. 另外, 当输入0以下的整数时, 则什么也不显示.

-----出自【明解C语言】练习4-9.

1
2
正整数:13
+-+-+-+-+-+-+

输入样例:

1
13

输出样例:

在这里给出相应的输出。例如:

1
正整数:+-+-+-+-+-+-+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
int main(void)
{
int num;
int i=0;
printf("正整数:");
scanf("%d",&num);
while(i<num){
if(++i%2)
putchar('+');
else
putchar('-');
}
return 0;
}

7-11 判断正整数n是否同时含有奇数和偶数

本题目要求读入1个正整数n,判断正整数n是否同时含有奇数字和偶数字。

输入格式:

输入一个正整数n。

输出格式:

输出此正整数,并输出YES(表示同时含有)或NO(表示不同时含有)。

输入样例:

1
123

输出样例:

1
123 YES
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>

int main() {
char n[100];
int flag_odd = 0, flag_even = 0;
scanf("%s", n);
for (int i = 0; i < 100; ++i) {
if (n[i] == '\0') {
break;
}
if ((n[i] - 48) % 2 == 0) {
flag_even = 1;
} else {
flag_odd = 1;
}
}
if (flag_even && flag_odd) {
printf("%s YES", n);
} else {
printf("%s NO", n);
}

return 0;
}

7-13 兔子繁衍问题

一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?

输入格式:

输入在一行中给出一个不超过10000的正整数N

输出格式:

在一行中输出兔子总数达到N最少需要的月数。

输入样例:

1
30

输出样例:

1
9
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
#include <iostream>

using namespace std;

int rabbit(int n)
{
if (n == 1 || n == 2)//1、2月份时只有一对
return 1;
else
return rabbit(n - 1) + rabbit(n - 2);//前两项和等于第三项
}

int main()
{
//规律:1.1.2.3.5.8.13...(对数)
int n;
cin>>n;
int i=1;
for(;;i++)
{
if(rabbit(i)>=n)
break;
}
cout<<i;
return 0;
}

7-14 整除光棍

这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。

提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。

输入格式:

输入在一行中给出一个不以5结尾的正奇数x(<1000)。

输出格式:

在一行中输出相应的最小的sn,其间以1个空格分隔。

输入样例:

1
31

输出样例:

1
3584229390681 15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
int main(){
int n, r = 1, w = 1;//r表示1,11,111类型的数据,w记录位数
scanf("%d", &n);
while(r < n){
r *= 10;
r++;
w++;
}
while(1){
printf("%d", r/n);//输出商
r %= n;//取余
if(r ==0 )//取余后,若等于0,则证明能被整除,break掉
break;
r = r * 10 + 1;//不等于0则在余数后一位加上1
w++;
}
printf(" %d",w);
return 0;
}

7-15 就不告诉你

做作业的时候,邻座的小盆友问你:“五乘以七等于多少?”你应该不失礼貌地围笑着告诉他:“五十三。”本题就要求你,对任何一对给定的正整数,倒着输出它们的乘积。

53.jpg

输入格式:

输入在第一行给出两个不超过 1000 的正整数 A 和 B,其间以空格分隔。

输出格式:

在一行中倒着输出 A 和 B 的乘积。

输入样例:

1
5 7

输出样例:

1
53
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<stdio.h>
int main()
{

int a, b;
int t, flag = 0;
scanf("%d%d", &a, &b);
int S=a*b;
if (S == 0) printf("0");
while (S != 0)
{
t = S % 10;
S /= 10;
if (t != 0 || flag == 1)
{
flag = 1;
printf("%d", t);
}
}

return 0;
}

7-16 π/4≈1-1/3+1/5……求π

用公式π/4≈1-1/3+1/5……求π的近似值,要求直到最后一项的绝对值小于0.000001为止。

输出格式:

按照“pi= 结果”的顺序输出,其中结果输出的格式宽度为10列,并保留4位小数。

输出样例:

1
pi=  3.1416
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>

int main()
{
double a=1,sum=0,pi;
int f=1;
for(a=1;a<=1e+6;a+=2)
{
sum+=f*1.0/a;
f=-f;
}
pi=sum*4.0;
printf("pi=%10.4lf",pi);//此处'.4'表示小数点后保留四位小数;'10'表示宽度为10列
return 0;
}

#7-17 1!+2!+…+n!

Caculate 1!+2!+…+n!

Input:

An integer for n.

Output:

An interger for the result.

Input sample:

1
5

Output sample:

1
153
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h> 
int fun(int n);

int main()
{
int n;
scanf("%d",&n);
printf("%d\n", fun(n));
return 0;
}

int fun(int n)
{
int i,sum=0, k = 1;

for(i=1;i<=n;i++)
{
k*=i;
sum += k;
}
return sum;
}

#7-18 计算PI值

写一个程序显示如下式子的结果:
PI = 4 *(1 -1/3 +1/5 -1/7 +1/9 -1/11 +1/13).

在程序中使用1.0代替1。

输入格式:

输出格式:

算式的值

输入样例:

在这里给出一组输入。例如:

1

输出样例:

在这里给出相应的输出。例如:

1
3.2837384837384844
1
不会!!!摸鱼!!!

7-19 找完数

所谓完数就是该数恰好等于除自身外的因子之和。例如:6=1+2+3,其中1、2、3为6的因子。本题要求编写程序,找出任意两正整数mn之间的所有完数。

输入格式:

输入在一行中给出2个正整数mn(1<mn≤10000),中间以空格分隔。

输出格式:

逐行输出给定范围内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + … + 因子k”,其中完数和因子均按递增顺序给出。若区间内没有完数,则输出“None”。

输入样例:

1
2 30

输出样例:

1
2
6 = 1 + 2 + 3
28 = 1 + 2 + 4 + 7 + 14
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
#include <stdio.h>
int main()
{
int i,m,n;
scanf("%d %d",&m,&n);
int count=0;
for(i=m;i<=n;i++)
{
int sum=0,a,b;
for(a=1;a<i;a++)
{
b=i%a;
if(b==0)
sum=sum+a;
}
if(sum==i){
printf("%d = 1",sum);
int c,d;
for(c=2;c<i;c++)
{
d=i%c;
if(d==0)
printf(" + %d",c);
}
printf("\n");count=count+1;}
}
if(count==0)
printf("None");
}

7-20 完数

编程求出1000之内的所有完数。一个数如果恰好等于它的因子(除自身外)之和,这个数就称为"完数"。比如6=1+2+3,因此6是完数。

输出格式:

在一行输出所有完数,每个完数输出占5列。没有其它任何附加字符。

输出样例:

1
6   28  496

就是格式错误nnd(有猫饼的判定)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//完数定义:
//一个数如果恰好等于它的因子之和,则这个数就是完数。例如6的因子为1,2,3,而
//6=1+2+3,因此6是“完数”。
#include<stdio.h>
int main(void)
{
int i,j,sum;
for(i=1;i<=1000;i++){ //i存放的是数字,j是因子,sum是因子的和
sum=0; //sum为0
for(j=1;j<i;j++){
if(i%j==0) //如果i是j的因子则i%j为0
sum+=j; //则sum加上这个因子
}
if(sum==i) //如果i这个数值的因子相加等于i则输出
printf("%d\t",i);
}
return 0;
}