(4)输出整数各位数字:输人一个整数number,从高位开始逐位分割并输出它的各位
数字。试编写相应程序。
输人输出示例
Enter a number:123456
输出
1 2 3 4 5 6
#include <iostream>
int main()
{
int m = 0, i = 1, j = 1, k = 1;
int count = 0;
printf("Enter m:\n");
scanf("%d", &m);
char szNum[20] = { 0 };//20位装int64都够用了
do {
int n = m % 10;
m = m / 10;
szNum[count] = '0' + n;
count++;
} while (m > 0);
for (i = count - 1; i >= 0; i--) {
char c = szNum[i];
printf("%c", c);
if (i > 0) {
printf(" ");
}
}
}
孪生素数是指两个素数的差值刚好是2,比如3和5,5和7,11和13都是孪生素数。19和23不是孪生素数。
根据题目给定的范围【n,m】,求出其中的孪生素数并输出。如果范围内有多对孪生素数,输出最小的那对。如果没有孪生素数,则输出“none"
例如给定【100,110】,应输出孪生素数为101和103。再给定【1000,1100】,应输出:1019和1021
例如给定【120,130】,不存在孪生素数,应输出none
输出的字符串none全是小写
输入输出格式
输入格式
输出两个正整数n和m,表示闭区间的两端,中间用空格分隔,题目保证:2≤n≤m≤1,000,000,000
输出格式
如果存在孪生素数,则按照从小到大的顺序输出这两个素数,中间用空格分隔。
如果不存在孪生素数,则输出:none
int IsPrimeNum(int n)
{
for (int i = 2; i < n; i++)
{
if (n % i == 0)
{
return 0;
}
}
return 1;
}
int main()
{
int m = 0, n=0;
int count = 0;
printf("Enter n,m:\n");
scanf("%d %d", &n, &m);
int flag = 0;
for (int i = n; i <= m; i++)
{
if (IsPrimeNum(i) == 1)
{
if (i + 2 <= m)
{
if (IsPrimeNum(i + 2) == 1)
{
printf("%d %d\n", i, i + 2);
flag = 1;
break;
}
}
}
}
if (flag == 0)
{
printf("none");
}
}
8.高空坠球。皮球从height(米)高度自由落下,触地后反弹到原高度的一半,再落
下,再反弹……如此反复。问皮球在第n次落地时,在空中一共经过多少距离?第n次反
弹的高度是多少?输出保留1位小数。试编写相应程序。
int i, n;
int repeat, ri;
double distance, height;
//scanf("%d", &repeat);//可以支持多次重复
//for (ri = 1; ri <= repeat; ri++)
{
scanf("%lf%d", &height, &n);
distance = height;
while (n > 0) {
height = height / 2;
distance = distance + height * 2;
n--;
}
distance = distance - height * 2;
printf("distance = %.1f, height = %.1f\n", distance, height);
}
2.展开式求和。输人一个实数x,计算开输出下式的和,直到最后一项的绝对值
0.00001,计算结果保留4位小数。要求定义和调用函数fact(n)计算n的阶乘,可以调用
pow()函数求幂。试编写相应程序。
#include<stdio.h>
#include<math.h>
double fact(int n);
int main() {
double s = 1; int x, m = 1;
printf("please input x:\n");
scanf("%d", &x);
do {
s = s + pow(x, m) / fact(m);
m++;
} while (pow(x, m) / fact(m) > 0.00001);
printf("%.4lf", s);
return 0;
}
double fact(int n)
{
double result, i;
result = 1.0;
for (i = 1; i <= n; i++) {
result = result * i;
}
return result;
}
(6)使用函数输出字符矩阵:输入矩形的长度length、宽度width和字符ch,输出一
个长宽分别为length和width的实心字符矩阵。要求定义并调用函数matrix(length,width,
ch),实现在屏幕上显示长度为length、宽度为width,由字符ch组成的实心矩形图案。
输人输出示例
Enter length,width,ch:5 3 H
HHHHH
HHHHH
HHHHH
#include<stdio.h>
void matrix(int length, int width, char ch);
int main()
{
int length, width;
char ch;
printf("Enter length,width,ch:\n");
scanf("%d %d %c", &length, &width, &ch);
matrix(length, width, ch);
return 0;
}
void matrix(int length, int width, char
ch) {
int i, j;
for (i = 1; i <= width; i++) {
for (j = 1; j <= length; j++) {
printf("%c", ch);
}
putchar('\n');
}
}
(5)使用函数求素数和:输入两个正整数m和n(1≤m≤n<500),求m和n之间的
素数和。素数就是只能被1和自身整除的正整数,1不是素数,2是素数。要求定义并调
用函数prime(p)判断p是否为素数,当p为素数时返回1,否则返回0。定义并调用函数
prime_sum(m,n),该函数返回区间[m,n]内所有素数的和。
输入输出示例
Enter m,n: -l 10
Sum of( 2 3 5 7 ) = 17
#include<stdio.h>
int is_prime_num(int n)
{
for (int i = 2; i < n; i++)
{
if (n % i == 0)
{
return 0;
}
}
return 1;
}
int prime(int m) {
if (m <= 1) {
return 0;
}
else if (m == 2) {
return 1;
}
return is_prime_num(m);
}
void prime_sum(int m, int n) {
int total = 0;
printf("sum of ( ");
for (int i = m; i <= n; i++) {
if (prime(i) == 1) {
total += i;
printf("%d ", i);
}
}
printf(") = %d",total);
}
int main()
{
int m = 0, n = 0;
printf("Enter m,n:\n");
scanf("%d %d", &m, &n);
prime_sum(m, n);
return 0;
}
交换最小值和最大值:输人一个正帮数n(1<n≤10),再输入n个整数,将最小
值与第一个数交换,最大值与最后一个数交换,然后输出交换后的个数。试编写相
程序。
void find_max_min(int a[], int n, int type) {
int n_max = a[0];
int n_min = a[0];
int index_min = 0;
int index_max = 0;
for (int i = 1; i < n; i++) {
if (a[i] > n_max) {
n_max = a[i];
index_max = i;
}
if (a[i] < n_min) {
n_min = a[i];
index_min = i;
}
}
if (type == 0) {
//交换最大,最小
int t = a[0];
a[0] = a[index_min];
a[index_min] = t;
}
else {
int t = a[n - 1];
a[n - 1] = a[index_max];
a[index_max] = t;
}
}
int main()
{
int n = 0;
int data[10] = { 0 };
printf("Enter n:\n");
scanf("%d", &n);
for (int i = 0; i < n; i++) {
//printf("请输入第 %d 个数字:\n", i + 1);
scanf("%d", &data[i]);
}
find_max_min(data, n, 0);
find_max_min(data, n, 1);
for (int i = 0; i < n; i++) {
printf("%d ", data[i]);
}
return 0;
}
给定n(1≤n≤100)个学生的姓名和成绩,按照成绩从高到低排序输出。学生的姓名不会重复,如果有成绩相同的,则原来在名单中靠前的同学仍然排列在前面。
例如有一个班的成绩如下:
Deirdr 89
Sheil 50
Cynthi 63
Rene 66
Emm 46
Myrn 42
Nicol 63
Prudenc 66
Adel 79
排序之后为:
Deirdr 89
Adel 79
Rene 66
Prudenc 66
Cynthi 63
Nicol 63
Sheil 50
Emm 46
Myrn 42
注意:Rene排在Prudenc之前,Cynthi排在Nicol之前。
输入格式
第一行是一个整型数n,表示后面有n个学生的数据。从第二行到第n+1行,每行表示一个学生的数据,第一列是学生的姓名,第二列是学生的成绩(都是100以内的正整数),中间以空格分隔
输出格式
排序得到的结果,每行一个学生的数据,第一列是姓名,第二列是他的成绩,中间以空格分隔。
输入样例
7
Aaro 100
Colto 65
Chas 83
Ada 60
Josia 94
Zavie 100
Dieg 81
输出样例
Aaro 100
Zavie 100
Josia 94
Chas 83
Dieg 81
Colto 65
Ada 60
struct student {
char name[32] = {0};
int score = 0;
};
int main()
{
student students[100];
student tmp;
int n = 0;
scanf("%d", &n);
int i, j;
//获取输入数据
for (i = 0; i < n; i++) {
scanf("%s %d", &students[i].name, &students[i].score);
}
//如果有成绩相同的,则原来在名单中靠前的同学仍然排列在前面
// 说明需要选择一种稳定排序算法
冒泡排序
for (i = 0; i < n-1; i++) {
for (j = 0; j <n-i-1; j++) {
if (students[j].score < students[j+1].score) {
tmp = students[j];
students[j] = students[j+1];
students[j+1] = tmp;
}
}
}
//输出结果
for (i = 0; i < n; i++) {
printf("%s %d\n", students[i].name, students[i].score);
}
return 0;
}
字符串逆序:输人一个以回车结束的字符串(少于80个字符),对该字符串进行逆出逆序后的字符串。
#define MAXLEN 81
int main()
{
char temp;
char str[MAXLEN] = { 0 };
int i = 0, j = 0;
printf("Enter a string\n");
while ((str[i] = getchar()) != '\n') {
i++;
str[i] = '\0';
}
//字符串尾部
j = i - 1;
/*字符串头部*/
i = 0;
//头尾互换
while (i < j) {
temp = str[i];
str[i] = str[j];
str[j] = temp;
//头尾互换后向中间移动
i++;
j--;
}
printf("%s\n", str);
return 0;
}
执行结果
(4)壹找书籍:从键盘输入n(n<10)本书的名称和定价并存入结构。
找出定价最高和最低的书的名称和定价,并输出。试编写相应程序
输人输出示例
Programmingin C 21.5
Programming in vB 18.5
Programming in Delphi 25.0
25.00,Programming in Delphi
18.50,Programming in VB
struct book {
char name[32] = { 0 };
double price = 0;
};
void get_book(book* pbook) {
char szAll[128] = { 0 };
gets_s(szAll);
int i = 0;
char c = 0;
int flag_blank = 0;
while ((c = szAll[i]) != '\0') {
//两个空格后面是价格
if (c == ' ' && flag_blank == 0) {
flag_blank = 1;
}
else if (c == ' ' && flag_blank == 1) {
flag_blank = 0;
break;
}
else
{
flag_blank = 0;
}
i++;
}
szAll[i-1] = 0;
strcpy(pbook->name, szAll);
pbook->price = std::atof(szAll + i+1);
}
int main()
{
int n = 0;
int max = 0, min = 0;
book books[10];
scanf("%d", &n);
getchar();
for (int i = 0; i < n; i++) {
get_book(&books[i]);
}
for (int i = 1; i < n; i++) {
if (books[i].price > books[max].price) {
max = i;
}
if (books[i].price < books[min].price) {
min = i;
}
}
printf("%.2lf, %s\n", books[max].price, books[max].name);
printf("%.2lf, %s\n", books[min].price, books[min].name);
return 0;
}
分数a/b化为小数后,小数点后第n位的数字是多少?其中0<a<b<100,0<n<10001.
输入格式
三个正整数a,b,n,相邻两个数之间用单个空格隔开
输出格式
一个数字
输入样例
1 2 1
输出样例
5
这个题目需要注意的一点就是 要把除法分解去计算,因为n最大可以是10000,这个已经超出了基本数据类型容纳范围,会发生溢出,不要使用 pow(10,n);这类方式去运算。
int main()
{
int n;
int flag;
int a, b;
scanf("%d %d %d", &a, &b, &n);
for (int i = 0; i < n; i++) {
//分解计算除法
a = a % b;//余数
a = a * 10;//余数补位,方便继续计算
}
flag = a / b;//本位相除的结果
printf("%d", flag);
return 0;
}