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;
}