C语言/C++常见习题问答集锦(十五)
程序之美
(一)、有 10个学生,每个学生有 4门课程的成绩。用指针函数实现:
1.要求在用户输入学生序号 (数组下标)以后,能输出;该学生的全部成绩
2.用选择排序法将学生的总成绩进行排序。
#include <stdio.h>
int *search(int (*stu)[4], int x); //定义搜索函数
int main()
{
int stu[10][4], i, j, n, *student, n1, n2, m;
for (i = 0; i < 10; i ++){
printf("Please enter No.%d student score: ", i+1);
for (j = 0; j< 4; j ++); //输入全部学生成绩
scanf("%d", &stu[i][j])
}
printf("Please enter student number: ");
scanf("%d", &n); //输入学生序号
for (i = 0; i < 4; i ++); //调用搜索函数并输出该序号学生全部成绩
{
student = search(stu, n);
printf("No.%d student score: ", n);
printf("%d ", *( student + i));
}
printf("\n");
for(i = 0;i < 9; i ++)
{
for(j = 0;j < 9 - i; j ++)
{
n1 = 0;
n2 = 0;
for(m = 0; m < 4; m++){
n1 += stu[j + 1][m];
n2 += stu[j][m];
}
if(n1 > n2)
{
student = stu[j + 1];
stu[j + 1] = stu[j];
stu[j] = student;
}
}
}
return 0;
}
//搜索函数
int *search(int (*stu)[4], int x)
{
return *(stu+x-1);
}
(二)
问题描述
小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识。
问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素数,则称之为“美素数”,如29,本身是素数,而且2+9 = 11也是素数,所以它是美素数。
给定一个区间,你能计算出这个区间内有多少个美素数吗?
Input
第一行输入一个正整数T,表示总共有T组数据(T <= 10000)。
接下来共T行,每行输入两个整数L,R(1<= L <= R <= 1000000),表示区间的左值和右值。
Output
对于每组数据,先输出Case数,然后输出区间内美素数的个数(包括端点值L,R)。
每组数据占一行,具体输出格式参见样例。
Sample Input
3
1 100
2 2
3 19
Sample Output
Case #1: 14
Case #2: 1
Case #3: 4
解法一:
#include <stdio.h>
int isPrime(int a)
{
int i;
if (a <= 1)
return 0;
if (a == 2)
return 1;
for (i = 2; i < a; i++)
{
if (a % i == 0)
return 0;
}
return 1;
}
int main()
{
int L, R, i, t, x, sum, flag1, flag2, count;
scanf("%d", &t);
for (i = 0; i < t; i++)
{
count = 0;
scanf("%d %d", &L, &R);
for (x = L; x <= R; x++)
{
flag1 = isPrime(x);
if (flag1 == 1)
{
sum = 0;
int temp = x;
while (temp != 0)
{
sum += (temp % 10);
temp /= 10;
}
flag2 = isPrime(sum);
if (flag2 == 1)
{
count += 1;
}
}
}
printf("Case #%d: %d\n", i + 1, count);
}
return 0;
}
解法二:
#include <cstdio>
int su[1000000+11] = {1,1};
int ant[1000000+11] = {0};
bool check(int x)
{
if (su[x]) //第一次筛选标志为1的直接排除
return false;
int sum = 0;
while (x)
{
sum += (x % 10); //分离出数字的各个位数并求和
x /= 10;
}
if (su[sum]) //直接对求和过的数进行判断
return false;
return true;
}
int main()
{
for (int i = 2 ; i <= 500000 ; i++) //筛选素数
{
if (su[i])
continue;
for (int j = i + i ; j <= 1000000 ; j += i)
su[j] = 1;
}
for (int i = 2 ; i <= 1000000 ; i++) //筛选美素数
{
if (check(i)) //美素数
ant[i] = ant[i-1] + 1;
else
ant[i] = ant[i-1];
}
int u,num = 1;
int l,r;
scanf ("%d",&u);
while (u--)
{
scanf ("%d %d",&l,&r);
printf ("Case #%d: %d\n",num++,ant[r] - ant[l-1]);
}
return 0;
}
(三)、将N个整数按从小到大排序,使用冒泡排序法
#include <stdio.h>
#include <malloc.h>
int main()
{
int i,*a,t,n,j;
printf("请输入数据长度:\n");
scanf("%d",&n);
a = (int*)malloc(n*sizeof(int));
for(i = 0; i < n; i ++)
{
scanf("%d",a + i);
}
for(j = 0; j < n; j ++)
{
for(i = 0; i < j; i ++)
{
if(*(a + i)>*(a + i + 1))
{
t = *(a+i);
*(a+i) = *(a+i+1);
*(a+i+1) = t;
}
}
}
for(i = 0; i < n; i ++)
{
printf("%d\t",*(a+i));
}
free(a);
return 0;
}
(四)、给你一个数年份n,把1到n的每个年份都写出来连在一起,最后得到的是几位数?例如n=10,得到的数字是12345678910,因此是11位数。
输入格式:
首先输入一个整数T(1<=T<=10),表示测试组数。 每组测试输入一个整数n(1<=n<=10000)。
输出格式:
对于每组测试,在一行上输出把1到n的每个年份都写出来连在一起,最后得到的数据的位数。
输入样例:
2
10
1
输出样例:
11
1
#include <stdio.h>
int main(){
int g, *p, num, n, i, j;
printf("请输入组数:\n");
scanf("%d", &g);
p = (int*)malloc(g * sizeof(int));
printf("请分别输入两个数:\n ");
for(i = 0; i < g; i ++){
scanf("%d", &p[i]);
}
for(i = 0; i < g; i ++){
num = 0;
for(j = 1; j <= p[i]; j ++){
n = j;
while(n){
num ++;
n /= 10;
}
}
printf("结果为:%d\n", num);
}
return 0;
}