程序设计基础-SDUT-实验3-while循环

SDUT-程序设计基础-实验3-while循环

** 在开始之前,我想要提醒一下大家,在看完答案和解析以后,一定要自己再写一遍,一味的复制粘贴没有任何效果,当然,再解析中有任何看不懂的内容都可以私信我!!**

1. sdut-C语言实验-A+B for Input-Output Practice (不确定次数循环)

题目如下
Your task is to Calculate a + b.

Too easy?! Of course! I specially designed the problem for acm beginners.

You must have found that some problems have the same titles with this one, yes, all these problems were designed for the same aim.

输入格式:
The input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line.

输出格式:
For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.

输入样例:
1 5
10 20
输出样例:
在这里给出相应的输出。例如:

6
30

这个题目需要用到用到c语言中的一条很常见的语句 即 while(scanf("%d %d", &a, &b) != EOF) 这条语句的意思即只要不出现错误,就一直循环,执行语句
#include<stdio.h>

int main()
{
    int a, b;
	while (scanf("%d %d", &a, &b) != EOF)
	{
		printf("%d\n", a + b);
	}
	return 0;
}

2.sdut-C语言实验-偶数数位求和

题目如下

给定一个整数,请求出这个整数所有数位中是偶数的数位的和。例如,对于12436546,那么答案就是 2 + 4 + 6 + 4 + 6 。

输入格式:
输入一个数 n 。 (0 <= n <= 2147483647)

输出格式:
输出 n 的所有偶数数位的和。

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

20

这里出现的主要问题是不知道如何执行循环 以及怎样将输入数字中的偶数进行求和 我们只需在循环中加入一个变量并且一直维护这个循环的执行 然后将输入数字的每一位进行判断是否为偶数 若是 则加 若不是 则进入下一次循环 直到输入数字的最后一位被判断成功
#include <stdio.h>

int main()
{
    int n = 0;
    int m = 0;
    int i = 0;
    scanf("%d" , &n);

    while (n  > 0)
    {
        m = n % 10;
        n = n / 10;
        if (m % 2 == 0)
           i +=m;
    }
    printf("%d", i);
    return 0;
}

3.sdut-C语言实验-小树快长高

题目如下

宇宙只有一个地球,人类共有一个家园。地球是人类唯一赖以生存的家园,珍爱和呵护地球是人类的唯一选择。小明在植树节种了一棵小树。小明每天都给小树浇水,盼望着小树快快长高。他知道小树现在有 n cm,每天长高k cm,他想知道多少天小树可以长到m cm。

输入格式:
输入三个整数 n, m, k。 ( 0 <= n<= 10000, 0 <= m <= 10000,0 <= k <= 10000)

输出格式:
输出一个整数,即需要的天数。

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

100 200 5
输出样例:
在这里给出相应的输出。例如:

20

根据题目的意思 我们很容易判断出题目中蕴含的公式 即m = n + k * day 如此,我们便只需要将公式进行变形 那么便可以得到day = (m - n) / k 如此代码便可以轻松写出来
#include <stdio.h>

int main()
{
	int n, m, k;
	int day = 0;
	scanf("%d %d %d", &n, &m, &k);
	int d = m - n;

	while (d > 0)
	{
		d = d - k;
		day++;
	}
	printf("%d", day);
	return 0;
}

4.sdut-C语言实验-数位数

题目如下

给定一个正整数 n ,请你求出它的位数。

输入格式:
单组输入,输入一个整数 n 。(1<= n <= 2147483647)

输出格式:
输出一行,包含一个整数,即为 n 的位数。

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

7

这个题目跟第二题的循环思路一样 即不断减少输入数字的位数并且在循环中维护这个变量 然后将结果打印出来即可
#include <stdio.h>

int main()
{
    int n, i = 1;
    scanf("%d", &n);
    while (n / 10 > 0)
    {
        i = i + 1;
        n = n / 10;
    }
    printf("%d", i);
	return 0;
}

5.sdut-C语言实验- 数列求和2

题目如下

正整数序列是指从1开始的序列,例如{1,2,3,4,…}

给定一个整数 n,现在请你求出正整数序列 1 - n 的和。

输入格式:
输入一个整数 n 。(1 <= n <= 1000)

输出格式:
输出一个整数,即为正确答案。

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

3

在这个题目中,我们需要同时维护两个变量在循环中循环的次数 一个就是作为最终结果的加法和,另一个则为不断变大的变量 知道变量达到输入数字的大小停止循环,最终输出结果即可
#include <stdio.h>

int main()
{
	int a;
	int c = 0;
	int b = 0;
	scanf("%d", &a);
	while (a >= b)
	{
		c += b;
		b++;
	}
	printf("%d", c);
	return 0;
}

6.sdut-C语言实验-N^3问题

题目如下

输入一个正整数N,求出N^3的各位数字的立方和。

输入格式:
输入N的值。N<=1024

输出格式:
问题描述中所要求的数值。

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

351

这个题是对前面几个题目思想的综合运用 在循环中,对于变量的不断维护以及提取输入数字的各位数字 并且求其平方,最终进行加和,实验题目效果
#include <stdio.h>
int main()
{
    int n, c, a, sum = 0;
    scanf("%d", &n);
    n = n * n * n;
    while (n > 0)
    {
        a = n % 10;
        n = n / 10;
        c = a * a * a;
        sum += c;
    }
    printf("%d", sum);
}

7.sdut-C语言实验-虎子的难题

题目如下

虎子是个爱学习的孩子,暑假也在家有规律的学习,但是他最近碰到了一道难题,题目是这样的:

给出一个正整数 n 和数字 m ( m 取值范围[0,9]中的一个数字),求 m 在 n 中出现的次数。

比如 n = 2122345 , m = 2,答案就是 3 ,因为 2 在 2122345 中出现了三次。

你能帮帮他吗?

输入格式:
输入只有一行,包含两个空格分开的整数 n 和 m 。(0 <= m <= 9,1 <= n <= 2147483647)

输出格式:
输出一个数字,表示 m 在 n 中 出现的次数。

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

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

3

在此题目中,在维护变量的基础上加上了一个if的判断结构 while中嵌套if结构的循环 进行判断的同时,消耗输入数字的位数 还要对和变量进行维护,难度略高于前几题
#include <stdio.h>

int main()
{
	int n = 0, m = 0, c = 0, num = 0;
	scanf("%d %d", &n, &m);
	while (n > 0)
	{
		if ((n % 10) == m)
			num++;
		n = n / 10;
	}
	printf("%d", num);
	return 0;
}

8.sdut-C语言实验- A+B for Input-Output Practice (II)

题目如下

Your task is to Calculate a + b.

输入格式:
Input contains multiple test cases. Each test case contains a pair of integers a and b, one pair of integers per line. A test case containing 0 0 terminates the input and this test case is not to be processed.

输出格式:
For each pair of input integers a and b you should output the sum of a and b in one line, and with one line of output for each line in input.

输入样例:
1 5
10 20
0 0
输出样例:
6
30

此题目在循环的基础上,添加了提前跳出循环的概念 即break 相当于return,直接跳出循环,进行下一步操作 若代码运行的结果为0就跳出循环 为while和if的嵌套结构,比较简单
#include <stdio.h>

int main()
{
	int a, b;
	while (scanf("%d %d", &a, &b) != EOF)
	{
		if (a == 0 && b == 0)
			break;
		else
			printf("%d\n", a + b);
	}
	return 0;
}

9.sdut-C语言实验-A+B for Input-Output Practice (III)

题目如下

Your task is to Calculate a + b.

输入格式:
The input will consist of a series of pairs of integers a and b, separated by a space, one pair of integers per line.

输出格式:
For each pair of input integers a and b you should output the sum of a and b, and followed by a blank line.

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

1 5
10 20
输出样例:
在这里给出相应的输出。例如:

6

30

与第一题相同,不过无非多空一行
#include <stdio.h>

int main()
{
	int a, b;
	while (scanf("%d %d", &a, &b) != EOF)
	{
		printf("%d\n\n", a + b);
	}
	return 0;
}

10.3n+1

题目如下

有这样一个猜想:对于任意大于1的自然数n,若n为奇数,则将n变成3n+1,否则变成n的一半。经过若干次这样的变换,一定会使n变为1。例如3->10->5->16->8->4->2->1。对于n=1的情况,当然就不用变化了。

输入格式:
输入一个正整数n,n的范围是[1,999999]。

输出格式:
输出变换的次数。

输入样例:
3
输出样例:
7

此题目的循环逻辑较为简单,即输入数字变成1则跳出循环,否则依据一定的运算法则不断运行,直至成为1跳出循环,简单的while和if的嵌套,只需要在循环中维持一个变量的增加
#include <stdio.h>

int main()
{
    int n = 0 ;
    int i = 0 ;
    scanf("%d", &n);
    while(n != 1)
    {
        if(n % 2 == 0)
            n = n / 2;
        else
            n= 3*n + 1;
        i++;
    }
    printf("%d", i);
    return 0;
}

11.Average Plus

题目如下

You are going to read a serial of real numbers (number with decimal point). The exact number of the numbers are not known.
Your program calculates the average of all the numbers, and prints the average which rounds to two decimal places.

There is at least one number to be processed.

##输入格式:

A serial of real numbers.

##输出格式:

A number rounds to two decimal places, which is the average of the serial.

Using C, the printf for this case is:

printf(“%.2f\n”, average);

##输入例子

1.0 2.1 3.2 4.3 5.4 6.5
##输出例子

3.75

与第一题较为相似,不过最后多了一步除法,在循环过程中,只需要对和的变量以及个数的变量进行维护,直至最后循环结束输出结果即可
#include <stdio.h>

int main ()
{
    float a = 0.0;
    float b = 0.0;
    int n = 0;
    while(scanf("%f", &a) != EOF)
    {
        n ++;
        b+= a;
    }
    float c = b / n;
    printf("%.2f", c);
    return 0;
}

12.求总金额

题目如下

小C带着自己不用的物品参加学校组织的跳蚤市场,共卖出了n件物品,请帮他计算一下总金额。

输入格式:
输入两行数据

第一行输入n的值,
第二行输入n件物品的价格,用空格分隔。

输出格式:
以保留两位小数的形式输出。

输入样例:
3
5.6 8.4 4.5
输出样例:
18.50

此题目在第一题的基础上,将无限循环改为有限循环,只需要在循环中不断维护和变量的递增即可
#include <stdio.h>

int main()
{
    int a;
    float b,c;
    scanf("%d\n", &a);
    while(a--)
    {
        scanf("%f",&b);
        c +=b;
    }
    printf("%.2f",c);
    return 0;
}

13.判断4和7的倍数

题目如下

输入若干个整数,统计这些数中有多少个是4或7的倍数。

输入格式:
输入若干个整数,每个整数的取值在int范围之内,用空格隔开。

输出格式:
输出一个整数,为统计的结果。

输入样例:
30 21 5 16 9
输出样例:
2

此题仍然为无限循环的类型,只需要while中嵌套一个if循环,同时满足4和7的倍数时,维护一个变量,使其递增即可
#include <stdio.h>

int main()
{
    int a, i;
    while(scanf("%d",&a) != EOF)
    {
        if(a % 4 == 0 || a % 7 == 0)
            i++;
    }
    printf("%d", i);
    return 0;
}

14.循环结构 —— 中国古代著名算题。趣味题目:物不知其数。

题目如下

中国古代著名算题。原载《孙子算经》:“今有物不知其数,三三数之剩二;五五数之剩三;七七数之剩二。问物几何?”。本题要求:设某物数量是 N,且三三数剩 x,五五数之剩y,七七数剩z 。 x,y,z 的值可从键盘输入,请求出对应的最小 N 值并输出。
输入格式:
在一行中给出x、y、z的值,空格隔开。

输出格式:
输出N的值。

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

2 3 2
输出样例1:
在这里给出相应的输出。例如:

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

1 1 3
输出样例2:
在这里给出相应的输出。例如:

31

此题目相比前面的题目相对难一些,难点主要存在在对题目的理解,以及循环思路的构建,在此函数中,我们只需要一个变量不断递增,直至找出符合题目要求的数即可
#include <stdio.h>

int main()
{
    int x ,y, z;
    scanf("%d %d %d",&x ,&y ,&z);
    for(int i = 0; ; i++)
    {
        if(i % 3 == x && i % 5 == y && i % 7 == z)
        {
            printf("%d", i);
            break;
        }
    }
    return 0;
}

15.N个数求和

题目如下

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

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

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

输入样例1:
5
2/5 4/15 1/30 -2/60 8/3
输出样例1:
3 1/3
输入样例2:
2
4/3 2/3
输出样例2:
2
输入样例3:
3
1/3 -1/6 1/8
输出样例3:
7/24

此题目相比之前的题目,难度快速上升 首先,在此题目中,因为需要最后的输出结果为分数,所以会用到最大公因数和最小公倍数,常用gcd作为最大公因数的表达式,在函数中,核心不过是gcd(a,b) = gcd(b,a % b),直到b == 0的时候返回数值,此时返回的数值则为最大公因数。 在理解了gcd以后,最小公倍数的求法就更为简单,仅需 a / gcd(a, b) * b即可,这样便求出了最小公倍数,在此基础上分子乘相同的倍数,相加后则可以得到最终的分子和分母 理解上面以后,我们便可以知道,这个题目的核心就是对于分子和分母的不断维护,将分母通分之后,将分子相加,直至跳出循环 其次,在输出时,我们需要将其分为几种情况,如整数,真分数,假分数等等情况,当然,在理解以上步骤之后,最后的if判断也就不是难事了。 最后,因为我们在运算过程中会出现int与int相乘,就可能出现爆int的情况,所以需要将代码中的所有int改成long long,这里我们采用 define int long long这行代码,当然你也可以手动直接将代码中的int全部改成long long
#include <stdio.h>
#define int long long

int gcd(int a, int b)//计算最大公因数的函数
{
    if (b == 0)
        return a;
    else
        return gcd(b, a % b);
}

signed main()
{
    int n;//循环次数
    int lcp;//存放最大公因数
    int a, b, c, d;
    int m;//最后化简时存放最大公因数
    scanf("%d", &n);
    scanf("%lld/%lld", &a, &b);
    n = n - 1;

    while (n--)
    {
        scanf("%lld/%lld", &c, &d);
        lcp = b / gcd(b, d) * d;
        a = a * (lcp / b) + c * (lcp / d);//加和后的分子
        b = lcp;//加和后的分母
    }
    m = gcd(a, b);
    a = a / m;
    b = b / m;//化简成最简分数
    if (a > b)//若输出结果为假分数
    {
        int n = a / b;//n即为整数部分
        a = a - (b * n);//化成真分数后的分子

        if (a == 0)
        {
            printf("%lld",n);
        }
        else
        {
            printf("%lld %lld/%lld", n, a, b);
        }
    }
    else if (a < b && a % b != 0)//若输出结果为真分数
    {
        printf("%lld/%lld", a, b);
    }
    else if (a % b == 0)//若结果为整数
        printf("%lld", a / b);
    else if (a == 0)//若输出结果为0
        printf("0");
    return 0;
}

16.念数字

题目如下

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

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。

输入样例:
-600
输出样例:
fu liu ling ling

在此题目中,需要运用到一点点数组的知识,在输入的时候,直接将每一个元素存入数组,需要的时候再向外提,以此读出来即可,注意最后一位数的时候后面不留空格
#include<stdio.h>
int main()
{
    int n, j, i=0;
    int ch[100];
    scanf("%d", &n);
    if(n==0)
        printf("ling");
    if(n<0)
    {
        printf("fu ");
        n=-n;
    }
    while(n!=0)
    {
        ch[i]=n%10;
        n/=10;
        i++;
    }
    for (j = i - 1 ; j >= 0; j--)
        {
        if (ch[j] == 0)
            printf ("ling");
        else if (ch[j] == 1)
            printf("yi");
        else if (ch[j] == 2)
            printf("er");
        else if (ch[j] == 3)
            printf("san");
        else if (ch[j] == 4)
            printf("si");
        else if (ch[j] == 5)
            printf("wu");
        else if (ch[j] == 6)
            printf("liu");
        else if (ch[j] == 7)
            printf("qi");
        else if (ch[j] == 8)
            printf("ba");
        else if (ch[j] == 9)
            printf("jiu");

        if(j != 0)
            printf(" ");
    }
    return 0;
}

17.最大公约数和最小公倍数

题目如下

本题要求两个给定正整数的最大公约数和最小公倍数。

输入格式:
输入在一行中给出两个正整数M和N(≤1000)。

输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。

输入样例:
511 292
输出样例:
73 2044

这题是要做出15题的基础,详细的解析请看15题,这里不予详解
#include <stdio.h>
#define int long long

int gcd(int a, int b)//计算最小公约数的函数
{
    if (b == 0)
        return a;
    else
        return gcd(b, a % b);
}

signed main()
{
    int m,n;
    scanf("%lld %lld", &m, &n);
    int x = gcd(m , n);
    int y = m / gcd(m, n) * n;
    printf("%lld %lld", x, y);
    return 0;
}

18.求奇数和

题目如下

本题要求计算给定的一系列正整数中奇数的和。

输入格式:
输入在一行中给出一系列正整数,其间以空格分隔。当读到零或负整数时,表示输入结束,该数字不要处理。

输出格式:
在一行中输出正整数序列中奇数的和。

输入样例:
8 7 4 3 70 5 6 101 -1
输出样例:
116

此题目是在第二题的基础上进行了延伸,总体上不难,只需控制循环的次数满足题目的要求,简单的while和if嵌套结构,难度不高
#include <stdio.h>

int main()
{
    int a ,sum = 0;
    for(int i = 0; ;i ++)
    {
        scanf("%d", &a);
        if(a == 0 || a < 0)
        {
            break;
        }
        else if(a % 2 != 0)
        {
            sum += a;
        }
    }
    printf("%d" ,sum);
    return 0;
}

19.猜数字游戏

题目如下

猜数字游戏是令游戏机随机产生一个100以内的正整数,用户输入一个数对其进行猜测,需要你编写程序自动对其与随机产生的被猜数进行比较,并提示大了(“Too big”),还是小了(“Too small”),相等表示猜到了。如果猜到,则结束程序。程序还要求统计猜的次数,如果1次猜出该数,提示“Bingo!”;如果3次以内猜到该数,则提示“Lucky You!”;如果超过3次但是在N(>3)次以内(包括第N次)猜到该数,则提示“Good Guess!”;如果超过N次都没有猜到,则提示“Game Over”,并结束程序。如果在到达N次之前,用户输入了一个负数,也输出“Game Over”,并结束程序。

输入格式:
输入第一行中给出两个不超过100的正整数,分别是游戏机产生的随机数、以及猜测的最大次数N。最后每行给出一个用户的输入,直到出现负数为止。

输出格式:
在一行中输出每次猜测相应的结果,直到输出猜对的结果或“Game Over”则结束。

输入样例:
58 4
70
50
56
58
60
-2
输出样例:
Too big
Too small
Too small
Good Guess!

此题总体思路上不难想,只是在循环的过程中出现了太多的可能性以及许多跳出循环的特例,仅需将题目中的特例处理好,维护好变量的变化,这个题就迎刃而解了
#include<stdio.h>
int main()
{
	int a, n, guess, count, i, flag;
	flag = 0;
	count = 0;
	scanf("%d %d",&a ,&n);
	
	for(i = 1; i <= n; i ++)
    {
		count++;//记录猜测的次数 
		scanf("%d", &guess);
		if(guess < 0)
        {
			printf ("Game Over\n");
			return 0;
	    }
		if(guess == a)
        {
			flag = 1;
			break;
		}
		else if(guess > a)
        {
			printf("Too big\n");
		}
		else if(guess < a)
        {
			printf("Too small\n");
		}	
	}
	if(flag)
    {
		if(count == 1)
        {
			printf("Bingo!\n");
		}
		else if(count <= 3)
        {
			printf("Lucky You!\n");
		}
		else if(count <= n)
        {
			printf("Good Guess!\n");
		}
	}
	else
    {
		printf("Game Over\n");
	}
	return 0;
}  

20.sdut-C语言实验- 计算球体积

题目如下

根据输入的半径值,计算球的体积。
已知 PI = 3.1415927
define PI 3.1415927

输入格式:
输入数据有多组,每组占一行,每行包括一个实数,表示球的半径。

输出格式:
输出对应的球的体积,对于每组输入数据,输出一行,计算结果保留三位小数。

输入样例:
1
1.5
输出样例:
4.189
14.137

在做完上面的所有题目以后,这个题难度较小,只需要写好公式进行计算即可,较简单
#include <stdio.h>

int main()
{
    const double t = 3.1415927;
    double a;
    double num;
    while(scanf("%lf", &a) != EOF)
    {
        getchar();
        num = 4.0/3.0*t*a*a*a;
        printf("%.3f\n",num);
    }
    return 0;
}

以上即为实验设计基础-实验3的所有题目题干详细解析和答案,希望同学们能多多思考,一味的复制粘贴没有任何效果,大家学业顺利!!当然,在详解中没有看懂的内容可以私信我!!

  • 17
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值