作业比赛编号 : 100000567 - 《算法笔记》2.3小节——C/C++快速入门->选择结构
C例题4-3 比较交换3个实数值,并按序输出
#include<stdio.h>
//最基础的指针运用于比较大小
void swap(double *a,double *b){
double temp;
temp=*a;
*a=*b;
*b=temp;
}
int main(){
double a,b,c;
scanf("%lf%lf%lf",&a,&b,&c);
double *p1=&a;
double *p2=&b;
double *p3=&c;
if(a>b) swap(p1,p2);
if(b>c) swap(p2,p3);
if(a>b) swap(p1,p2);
printf("%.2f %.2f %.2f\n",a,b,c);
return 0;
}
D习题4-4 三个整数求最大值
#include<stdio.h>
int max(int a,int b){
int result;
if(a>b) {
return a;
}else{
return b;
}
//如果想return一个值,则返回类型不能用void
}
int main(){
int a,b,c,m1,m2;
scanf("%d%d%d",&a,&b,&c);
m1=max(a,b);
m2=max(m1,c);
printf("%d\n",m2);
return 0;
}
E习题4-10-1 奖金计算
#include<stdio.h>
int main(){
double I,bonus;
scanf("%lf",&I);
if(I<=100000){
bonus=I*0.1;
}else if(100000<I&&I<=200000){
bonus=100000*0.1+(I-100000)*0.075;
}else if(200000<I&&I<=400000){
bonus=100000*0.1+100000*0.075+(I-200000)*0.05;
}else if(400000<I&&I<=600000){
bonus=100000*0.1+100000*0.075+200000*0.05+(I-400000)*0.03;
}else if(600000<I&&I<=1000000){
bonus=100000*0.1+100000*0.075+200000*0.05+200000*0.03+(I-600000)*0.015;
}else{
bonus=100000*0.1+100000*0.075+200000*0.05+200000*0.03+400000*0.015+(I-1000000)*0.01;
}
printf("%.2f\n",bonus);
return 0;
}
作业比赛编号 : 100000568 - 《算法笔记》2.4小节——C/C++快速入门->循环结构
A例题5-1-1 连续自然数求和
#include<stdio.h>
int main(){
int i=1,sum=0;
while(i<=100){
sum=sum+i;
i++;
}
printf("%d",sum);
return 0;
}
B例题5-1-2 连续自然数求和
#include<stdio.h>
int main(){
int i=1,sum=0;
do{
sum=sum+i;
i++;
}while(i<=100);
printf("%d",sum);
return 0;
}
C例题5-1-3 连续自然数求和
#include<stdio.h>
int main(){
int i,sum=0;
for(i=1;i<=100;i++){
sum=sum+i;
}
printf("%d",sum);
return 0;
}
D例题5-1-4 连续自然数求和
#include<stdio.h>
int main(){
//题目要求用break,感觉是多此一举
int i,n,sum=0;
scanf("%d",&n);
for(i=1;i<2*n;i++){
sum=sum+i;
if(i>=n) break;
}
printf("%d\n",sum);
return 0;
}
E例题5-1-5 连续自然数求和
#include<stdio.h>
int main() {
// 求1+2+3+...和的程序,要求得到使和数大于1000的最小正整数N。
int i, sum = 0;
for (i = 1; sum <= 1000; i++, sum += i);
printf("%d\n", i);-
return 0;
}
F例题5-6 矩阵输出
#include<stdio.h>
int main(){
for(int i=1;i<=4;i++){
for(int j=1;j<=5;j++){
printf("%3d",i*j);
if (j==5){
printf("\n");
}
}
}
return 0;
}
G例题5-7 求圆周率pi的近似值(repeat)
需要注意的问题:
1.10的次方的表示方法:
image.png
#include<stdio.h>
#include<math.h>
/* 用如下公式 pi/4 = 1-1/3+1/5-1/7....求圆周率PI的近似值,直到发现某一项的绝对值
小于10-6为止(该项不累加)。
如果需要计算绝对值,可以使用C语言数学库提供的函数fabs,如求x的绝对值,则为fabs(x).
输出 PI=圆周率的近似值 输出的结果总宽度占10位,其中小数部分为8位。末尾输出换行。 */
int main(){
double pi=0.0;
//term表示每一项,如1、-1/3、1/5等
for(double term = 1, i = 1, j = 3;fabs(term)>=1e-6;j+=2){
pi+=term;
i=-i;
term=i/j;
}
printf("PI=%10.8f\n",pi*4);
return 0;
}
H例题5-8 Fibonacci数列
#include<stdio.h>
//方法一:递归
/*
输入 一个不超过50的正整数
输出 Fibonacci数列的第n个数,末尾输出换行
*/
int fibo(int n) {
if (n == 1 || n == 2) return 1;
else return fibo(n-2) + fibo(n-1);
}
int main(){
int N;
scanf("%d",&N);
printf("%d\n",fibo(N));
return 0;
}
/*
int整形的取值范围是-2147483648~21474836479(-2^31~(2^31-1))
第46项之后,即从第47项开始,大小超出int的范围
因此47项及以后按照此方法输出的数都为负数
*/
I习题5-10 分数序列求和
注意一点:类型一致的问题
#include<stdio.h>
/*
有分数序列:2/1,3/2,5/3,8/5,13/8,21/13,...
求前20项的和
输出 小数点后保留6 位小数,末尾输出换行
*/
double top(int n) {
if(n==1) return 2;
else if(n==2) return 3;
else return top(n-2)+top(n-1);
}
double bottom(int n) {
if(n==1) return 1;
else if(n==2) return 2;
else return bottom(n-2)+bottom(n-1);
}
int main(){
double sum=0.0;
for(int i=1;i<=20;i++){
sum+=top(i)/bottom(i);
/*如果在定义函数top和bottom时
用整型的话最后计算结果即使进行强制类型转化算出来的也是整数并且结果偏差较大
因此在定义函数时就应该用double,那么在main函数中也不必再进行强制类型转换了
*/
}
printf("%.6f\n",sum);
return 0;
}
作业比赛编号 : 100000569 - 《算法笔记》2.5小节——C/C++快速入门->数组
A | 习题6-4 有序插入(repeat)
注意:做这个题之前先搞懂插入排序
#include<stdio.h>
/*
输入 第一行输入以空格分隔的9个整数,要求按照从小到大的顺序输入
第二行输入一个整数,将此整数插入到前有序的9个数中,
使得最终的10个数依然是从小到大有序的
输出 从小到大输出这10个数,每个数一行
提示 定义数组时,把数组长度定义为10
*/
int main(){
int a[10],temp;
int j=10;
//一次性向数组中输入几个数字中间用空格需要利用循环
for(int i=1;i<=9;i++){
scanf("%d",&a[i]);
}
scanf("%d",&temp);
/*
类似插入排序
但由于前面9个数是已经按照大小顺序排好了
所以只需要比较一趟
具体比较办法是从后往前枚举已有序部分来确定插入的位置
*/
while(j>1 && temp<a[j-1]){
a[j]=a[j-1];
j--;
}
a[j]=temp;
for(int i=1;i<=10;i++){
printf("%d\n",a[i]);
}
return 0;
}
B | 习题6-5 数组元素逆置
#include<stdio.h>
/*
将一个长度为10的整数数组中的值按逆序重新存放
输入 以空格分隔的10个整数
输出 按相反的顺序输出这10个数,每个数占一行
*/
int main(){
int str[10],temp;
for(int i=0;i<=9;i++){
scanf("%d",&str[i]);
}
for(int i=0;i<=4;i++){
temp=str[i]; //temp暂存str[i]的值
str[i]=str[9-i];
str[9-i]=temp;
}
for(int i=0;i<=9;i++){
printf("%d\n",str[i]);
}
return 0;
}
C | 习题6-6 杨辉三角(repeat)
#include<stdio.h>
/*
输入 正整数n,表示将要输出的杨辉三角的层数
输出 输出n层杨辉三角,每一层的整数之间用一个空格隔开,最多输出10层
*/
/*
思路:开两个数组,a[10] 和temp[10]
temp用于临时存放由a推导出的下一层
然后某一层推导并打印过后再将temp中的数据存入a中
*/
int main(){
int n, a[10] = {1, 1};
scanf("%d",&n);
for (int i=1; i<=n; i++){
if (i == 1) printf("%d\n", a[0]);
else if (i == 2) printf("%d %d\n", a[0], a[1]);
else { /*打印第一、二层以外的其他层*/
int temp[10];
temp[0] = 1;
temp[i-1] = 1;
int j;
for (int j=1; j<=i-2; j++){
temp[j] = a[j-1] + a[j];
}
/*打印这一层*/
for (int k=0; k<=i-1; k++){
printf("%d ",temp[k]);
}
printf("\n");
/*更新a[10]即是将temp存入数组a中,以供下一次循环使用*/
for (int m=0; m<=i-1; m++){
a[m] = temp[m];
}
}
}
return 0;
}
D | 习题6-12 解密
#include<stdio.h>
#include<string.h>
/*
输入 一行密文
输出 解密后的原文,单独占一行
加密原则:第一个字母变成第26个字母,
第i个字母变成第(26-i+1)个字母
非字符字符不变
*/
int main() {
char a[100];
gets(a);
for (int i=0; i<=strlen(a); i++) {
/*利用ASCII*/
if (a[i] >= 65 && a[i] <= 90) {
a[i] = 155 - a[i]; //A~Z:65~90
} else if (a[i] >=97 && a[i] <= 122) {
a[i] = 219 - a[i]; //a~z:97~122
}
}
puts(a);
return 0;
}
E | 习题6-13 字符串比较
#include<stdio.h>
#include<string.h>
/* 比较两个字符串s1和s2的大小,如果s1>s2,则输出一个正数;
若s1=s2,则输出0;若s1<s2,则输出一个负数。
要求:不用strcpy函数;两个字符串用gets函数读入。
输入 输入2行字符串
输出 一个整数,表示这两个字符串 比较的差值,单独占一行。*/
int main() {
char str1[100],str2[100];
gets(str1);
gets(str2);
int result;
int L = strlen(str1) < strlen(str2) ? strlen(str1) : strlen(str2);
for (int i = 0; i < L; i++) {
result = str1[i] - str2[i];
if (result != 0) break;
}
printf("%d\n", result);
return 0;
}
F | 例题6-1 逆序输出数组元素
#include<stdio.h>
/*
输入 10个整数(存储在一个长度为10的整形数组中),以空格分隔
输出 将输入的10个整数逆序输出,每个数占一行
*/
int main() {
int a[10],temp;
for (int i = 0; i <= 9; i++) {
scanf("%d", &a[i]);
}
for (int i=0; i <=4; i++) {
temp = a[i];
a[i] = a[9-i];
a[9-i] = temp;
}
for (int i = 0; i <= 9; i++) {
printf("%d\n", a[i]);
}
return 0;
}
G | 例题6-2 数组求解Fibonacci数列问题
#include<stdio.h>
/*
要求用数组求解 Fibonacci数列
输出 Fibonacci数列的前20个数,每个数占一行
*/
int main() {
int a[100];
a[0] = 1;
a[1] = 1;
for (int i = 2; i <=19; i++) {
a[i] = a[i-2] + a[i-1];
}
for(int i = 0; i <=19; i++) {
printf("%d\n", a[i]);
}
}
H | 例题6-3 冒泡排序
#include<stdio.h>
/*
冒泡排序
输入 以空格分隔的10个整数
输出 依次输出排好序的10个整数,每个数占一行
*/
int main() {
int a[10];
for (int i=0; i<=9; i++) {
scanf("%d",&a[i]);
}
for (int i=1; i<=9; i++) { //10个数比较9躺
//每一趟从a[0]到a[10-j-1]都要与后面一个数比较
//例如:第一趟时,从a[0]到a[8]都需要和后面一个数进行比较,8=10-1-1
for (int j=0; j<=10-i-1; j++) {
if (a[j] > a[j+1]) {
int temp = a[j+1];
a[j+1] = a[j];
a[j] = temp;
}
}
}
for (int i=0; i<=9; i++) {
printf("%d\n",a[i]);
}
return 0;
}
I | 例题6-4 矩阵转置
J | 例题6-9 字符串求最大值(repeat)
#include<stdio.h>
#include<string.h>
/*
输入 3行字符串,每行均为一个字符串
输出 一行,输出三个字符串中的最大者
*/
int main() {
//使用strcmp()和strcpy()
char str1[50], str2[50], str3[50],max[50];
gets(str1);
gets(str2);
gets(str3);
if (strcmp(str1, str2) > 0) {
strcpy(max, str1);
}else {
strcpy(max, str2);
}
if (strcmp(max, str3) < 0) {
strcpy(max, str3);
}
puts(max);
return 0;
}