中国大学MOOC课程《程序设计入门——C语言》翁恺老师 第五周测试题(习题记录)

1素数和(5分)
题目内容:

我们认为2是第一个素数,3是第二个素数,5是第三个素数,依次类推。
现在,给定两个整数n和m,0<n<=m<=200,你的程序要计算第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。
输入格式:
两个整数,第一个表示n,第二个表示m。
输出格式:
一个整数,表示第n个素数到第m个素数之间所有的素数的和,包括第n个素数和第m个素数。
输入样例:
2 4
输出样例:
15
时间限制:500ms内存限制:32000kb

#include <stdio.h>
int main()
{
	int sum = 0, count = 0;  //定义输出的素数和,并初始化为0
	int n, m;        //定义第n和第m个素数
	int isPrime; 
	scanf("%d %d", &n, &m);
	for ( int x=2; count<m; x++)   //用于筛选素数,从数字2开始
	{
		isPrime = 1;          //初始化为1
		for (int i=2; i<x; i++){     //判断x是否为素数,让x对从2开始的数取余数
			if ( x%i == 0 ) {         //如果余数为零,说明x不是素数,跳出循环
				isPrime = 0;   
				break;
			}
		}
		if ( isPrime==1 ) {           //如果x不是素数,isPrime被置为零,不需要进入if中
			count ++;                   //如果x是素数,则isPrime默认为1,进入if中,计数器count加一
			if ( count>=n && count <=m ) {      //当计数器满足在n和m之间时,进行累加
				sum = sum + x;
			}
		}
	}
	printf("%d", sum);
	return 0;
}

2念整数(5分)
题目内容:
你的程序要读入一个整数,范围是[-100000,100000]。然后,用汉语拼音将这个整数的每一位输出出来。
如输入1234,则输出:
yi er san si
注意,每个字的拼音之间有一个空格,但是最后的字后面没有空格。当遇到负数时,在输出的开头加上“fu”,如-2341输出为:
fu er san si yi
输入格式:
一个整数,范围是[-100000,100000]。
输出格式:
表示这个整数的每一位数字的汉语拼音,每一位数字的拼音之间以空格分隔,末尾没有空格。
输入样例:
-30
输出样例:
fu san ling
时间限制:500ms内存限制:32000kb

(数字范围有整数有负数,有零)
1.判断数字是否为正数,如果为正数,进入下一步;如果为负数,将数字转化为正数
2.将数字逆序(PS:如果数字后面有多个零,如700,被逆序后是7,在下方进行输出时应输出qi ling ling,但由于第一次进入下面循环后,数字的余数已经是零,所以后面的零不会输出,实际输出为qi,解决方法为引入一个数位计数器,count)
3.将逆序后的数字从最右侧开始逐项去掉,并用switch逐项筛选
4.去掉最后一位一次,count减一
5.输出对应的读数
6.判断count是否大于1(如果大于1,说明还有没被筛选的数位,需要输出一个空格,留出空间)
7.判断count是否大于零,若等于零,说明全部数位已经被筛选完毕,若不为零,返回第3步
8.程序结束

#include <stdio.h>
int main()
{
	int num;//定义一个数字
	int innum;//定义逆序数
	int ret;//存储取得的最右边的一位数字 
	int count = 0;//定义数位,并初始化为0 
	
	scanf("%d", &num);
	if ( num<0 ) {
		num = -num;    //将负数转化为正数 
		printf("fu ");
	}
	
	while ( num>0 )    //while循环进行逆序(如果输入数字为零,那么不需要逆序,直接进入下面的do-while,零后面没有其他的数字,所以直接输出)
	{
		ret = num%10;  //取得最后的一位数字 
		innum = innum*10 + ret;  //逆序 
		count ++;          //count计数器累计输出的数字的位数
		num /= 10;     //去掉最后的数字
	}
	do {                  //对逆序后的数字从最右端开始逐位判断
		ret = innum%10;
		innum /= 10;
		switch ( ret )
		{
			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"); break;
		}
		if ( count>1 ) {      //从数位判断是否输出空格
			printf(" ");
		}
		count --;
	} while ( count>0 );
	return 0;
}

第二个题想了一下,用了另一种方法(代码行数并未减少),不把数字逆序,先去数这个数有多少位,之后再从最左端开始,依次进行判断,结果正确

#include <stdio.h>
int main()
{
	int num;    //定义数字
	int count = 0;//定义计数器,并初始化
	int t, ret, c = 1; //定义中间量t,存储每个位上数字的变量ret,变量c(c用于取最左端数字计算用)
	
	scanf("%d", &num);
	t = num;     //t用于寻找每一位上的数
	if( num<0 ) {    //转化正负
		num = -num;
		t = num;
		printf("fu ");
	}
	
	do{         //num用于计算数位的多少,每次输入一个num并计算完毕数位后,num被置为0,因此不可用在下面的循环中
		num /= 10;
		count ++;
	} while ( num>0 );
	
	for ( int i=1; i<count; i++)       //计算出数位所对应的10的乘方倍数
	{
		c = c*10;
	}
	do{                  //找出每一位上的数
		ret = (t - t%c)/c;     //c为除数,c不可以为零,否则会出现浮点错误的提示,在循环条件中得以体现,当c>0时循环得以继续,当c等于0表示数位已经轮寻完毕,循环不需要再进行下一次,直接跳出循环,避免下一次c作为除数产生错误(开始让t作为循环变量,有错误)
		t = t%c;
		switch ( ret )
		{
			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"); break;
		}
		c /= 10;
		if ( count>1 ) {       //对每一位空格的控制
			printf(" ");
		}
		count --;           //需要将位数减小,结合上方的if判断,当轮寻到最后一位,避免在最后面输出一个空格
	} while ( c>0 );
	return 0;
}
  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值