#include<stdio.h>
#include<math.h>
int main()
{
// 第2章 算法
// 2.1. 书p17: 求1*2*3*4*5
//int bc, c;
//int ji;
//for (bc = 1; bc < 5; bc++)
// c = bc + 1;
// ji = c * bc;
//printf("%d", ji);
// 上面的错了,按照书上的提示改成如下:
//int bc = 1;
//int c = 2;
//for (c=2; c < 6; c++)
//{
// bc = bc * c;
//}
//printf("1*2*3*4*5=%d", bc);
// 2.2. 衍生题: 1*3*5*7*9*11
//int bc = 1;
//int c = 3;
////for (c = 3; c < 13; c+=2) //c+=2 等于 c=c+2
//for (c = 3; c <=11; c += 2) //或者
//{
// bc = bc * c;
//}
//printf("%d", bc);
// //!! 成功啦,开森
// 2.3. 判定2000-2500年中的每一年是否为闰年,并输出结果
// //我的原版:
//int r;
////int syear;
////int eyear;
//int syear = 2000;
//int eyear = 2500;
//printf("请输入始末年份:");
////scanf_s("%d %d", &syear, &eyear);
//printf("在%d年到%d年之间的闰年有:\n", syear, eyear);
//for (r = syear; r <= eyear; )
//{
// r++;
// if (r % 4 == 0)
// {
// printf("%12d", r);
// }
//}
// 书上的版本:输出某段时间内的闰年
//int year = 1500;
//int i = 1;
//for (year; year <= 2000; year++)
//{ // 👇指能不等于
// if (year % 4 == 0 && year % 100 != 0) // 这一行,写了十次
// // 意思是,倘使year的值同时满足这两个条件:①与4整除;②与100不整除
// printf("%d 是闰年,", year);
// if (year % 400 == 0) // 此时剩下来的,是不与4整除的数,或者是与4整除但是与100整除的数,如2100。对于其中第二种情况,倘使是与400整除的数,也是闰年
// printf("%d 是闰年,", year); // 这两个if是平行的,那么第二个if是承接上一个if剩下来的值,还是说不是这样?
// else
// printf("%d 不是闰年,", year); // else对象是经过两个if过滤后的?
//}
// 魔改版1(暂时未能实现):制定列数
//int r;
////int syear;
////int eyear;
//int syear=2000;
//int eyear=2100;
//int row = 4;
//int i;
//printf("请输入始末年份:");
////scanf_s("%d %d", &syear, &eyear);
//printf("在%d年到%d年之间的闰年有:\n", syear, eyear);
//for (r = syear; r <= eyear; )
//{
// r++;
// if (r % 4 == 0)
// {
//
// for (i = 1; i <= 1; i++)
// {
// if (i % row == 0)
// printf("\n");
// }
// printf("%12d", r);
// }
//}
// 魔改版2(暂时未能实现):加计算总个数
//int r;
//int syear;
//int eyear;
//printf("请输入始末年份:");
//scanf_s("%d %d",&syear,&eyear);
//for (r = syear; r <= eyear; )
//{
// r++;
// if (r % 4 == 0)
// printf("%12d", r);
//}
////为什么sizeof(r)的结果一直是4????为什么不会变??
//int n1;
//n1 = sizeof(r);
//printf("在%d年到%d年之间的闰年有%d个:\n", syear, eyear,n1);
//2.4.累加和
// 这题我完全没有思路
//int sign = 1;
//int sum = 1;
//int deno = 2;
//int sign = (-1) * sign;
//int term = sign * (1 / deno);
//for (deno; deno <= 100;)
//{
//
// deno = deno + 1;
// sum = sum + 1;
//}
//printf("%d", sum);
// 2.5 给出一个>=3的正整数,判断它是不是一个素数
// 素数:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数,如2,3,5,7,11,13,17,19,23,29
//int a = 0; // 素数的个数 // 这是啥? 什么叫素数的个数,是当前值所包含的素数?确定不是因数
//int num ; // 输入的整数 // 按照素数的定义,num的值限定在自然数集
//printf("输入一个整数:");
//scanf_s("%d", &num);
//for (int i = 2; i < num; i++) { //
// if (num % i == 0) {
// a++; // 素数个数加1 // ??这是什么意思
// }
//}
//if (a == 0) {
// printf("%d是素数。\n", num);
//}
//else {
// printf("%d不是素数,他有%d个因数。\n", num, a);
//}
/*
让我想想这一段,从后往前看,
是不是素数取决于a的值,a的值取决于if是否为是;
if是否为是,取决于输入的num和起始值为2,逐次递增1的i
①可以肯定的是,num如果是偶数,那么num这个数就不可能是 素数了,因为if一旦成立,a会自加1;
②如果num是奇数,那么肯定的是,for的第一次循环,对if来说,必然是 否 ,但是if否了以后不代
表整个循环结束了,显然,这次a不会自加1,但是i会,i是for循环里的,只要条件i<num满足,就会
i就会一直加,一直循环验证 判断if,直到不再满足条件;
③那么其实这个for循环是为了让i替代num以内的所有数,if判断i是否是num的因数;
④至于i为什么从2开始,因为素数的定义是“除了1和她本身以外,不再有其他因数的自然数”,这
两个条件体现在 int i=2(除了1) 和 i<num (不包含它本身,所以这里没有等于),这就限定了i
的范围在[2,num-1]这个区间内;
*/
// 30:2,15,5,6,10,3
// 80:2,40;4,20;5,16;8,10;
// 2.5-自习-判断素数
//int a = 0;
//int num;
//printf("please input a number: ");
//scanf_s("%d", &num);
//for (int i = 2; i < num; i++) // 这一个循环和判断用来验证num是否
// if (num % i == 0)
// a++;
//if (a == 0)
// printf("%d是素数", num);
//else
// printf("%d不是素数", num);
// 2.5-p30版本
//int n;
//int w = 0;
//int i = 2;
//scanf_s("%d", &n);
//for (; i < n; i++) //倘使n是素数,那么其中必有一个因数是小于或等于根号n的,
// // 根号n以内,n的因数(根号n~n之间的数都没有)
//{
// if (n % i == 0)
// {
// printf("因数有%d\n", i);
// w = 1;
// }
//}
//if (w == 0)
// printf("是素数");
//else
// printf("不是素数");
// 练习册
// 1.输出最大数
//int a[10];
//int max;
////int i;
//printf("请输入10个数字: ");
//for (int i = 0; i < 10; i++)
//{
// scanf_s("%d", &a[i]);
//}
//for (int j = 0; j < 10-1; j++)
//{
// max = a[j];
// if (a[j] < a[j + 1])
// {
// int t=0;
// a[j] = t; a[j] = a[j + 1]; a[j + 1] = t;
// }
// printf("%d,", a[j]);
//}
// 1-1.起泡排序
//int a[10];
//int max, i,j,t;
////int i;
//printf("请输入10个数字: ");
//for (i = 0; i < 10; i++)
//{
// scanf_s("%d", &a[i]);
//}
//for (j = 0; j < 10 - 1; j++)
//{
// for (i = 0; i < 9; i++)
// if (a[i] > a[i + 1])
// {
// t=a[i]; a[i] = a[i + 1]; a[i + 1] = t;
// printf("a[%d],%d; ",i,a[i-1]);
// }
//}
//printf("\n");
//printf("排序后的数列: ");
//for (i = 0; i < 10; i++)
// printf("%d,", a[i]);
//printf("\n");
// 1-2.最大数
//int a[10];
//int max, i, j, t;
////int i;
//printf("请输入10个数字: ");
//for (i = 0; i < 10; i++)
//{
// scanf_s("%d", &a[i]);
//}
//for (j = 0; j < 10 - 1; j++)
//{
// for (i = 0; i < 9; i++)
// if (a[i] > a[i + 1])
// {
// t = a[i]; a[i] = a[i + 1]; a[i + 1] = t;
// //printf("a[%d],%d; ", i, a[i - 1]);
// }
//}
//printf("\n");
//printf("最大值: ");
////for (i = 0; i < 10; i++)
// printf("%d ", a[9]);
//printf("\n");
// 2.求3个数的升序排序
// int a, b, c,t;
// scanf_s("%d %d %d", &a, &b, &c);
//
// if (a > b)
// {
// t = a; a = b; b = t;
// }
// if (a > c)
// {
// t = a; a = c; c = t;
// }
// if ( b > c)
//t = b; b = c; c = t;
// printf("%d %d %d", a, b, c);
// 3.求100(包括)以内和
//
//int n = 1;
//int sum = 0;
//for (n; n <= 100; n++)
//{
// sum = sum + n;
//}
//printf("%d", sum);
// 4.判断一个数n能否同时被3和5整除
//int n;
//scanf_s("%d",&n);
//if (n % 3 == 0 && n % 5 == 0) {
// printf("%d可以被3和5整除", n);
//}
//else {
// printf("不可以哦。");
//}
// 5. 将100-200的素数输出
//int num, j,i, a=0;
//for (j = 2; j <= 200; j++)
// for (num = 100; num <= 200; num++)
//
// if (num % j == 0)
// a++;
// if (a == 0)
// printf("不是素数");
// else
// printf("是素数");
//int n = 100, i = 2;
//for (i; i < 14; i++)
//
//{
// for (n; n < 200; n++)
// {
// if (n % i == 0)
// {
//
// printf("%d,", n);
// }
// }
//}
//if (i < n)
// printf("%d", n);
// 6. 求两个数n和m的最大公约数
//int n, m;
////scanf_s("%d %d", &n, &m);
//n = 2000;
//m = 5000;
//int sm = n;
//if (n > m)
// sm = m;
//printf("%d和%d的公约数:", n, m);
//for (int i=1; i < sm; i++)
// if (n % i == 0 && m % i == 0)
// printf("%d,",i);
// 7.求方程式ax^2+bx+c=0的根,分别考虑①有两个不相等的实根;②有两个相等的实根
// ①有两个不相等的实根; 即x1≠x2
// ②有两个相等的实根;
//int a, b, c;
//a = 3;
//b = -6;
//c = 3;
//int delta = b * b - 4 * a * c;
//int p = -b / 2 * a;
//int q = sqrt(delta) / 2 * a;
//if (delta > 0)
//{
// printf("x1=%d\n", p + q);
// printf("x2=%d\n", p - q);
//}
//else
////if (delta = 0)
// printf("x1=x2=%d\n", p - q / p + q);
// 8.没法运行的版本-依次输入10个数,输出其中最大的值
//int a[5];
//int i;
//int max;
//printf("请输入3个数: ");
//
//for (i = 0; i <5; i++) {
// scanf_s("%d", &a[i]);
// printf("%d,", a[i]);
//}
//printf("\n");
//int j;
//for (j = 0; j < 5-1; j++) {
// max = a[j];
//
// if (a[j] < a[j + 1])
// max = a[j + 1];
//}
//printf("max=%d", max);
// 8-1.正确版本:依次输入10个数,输出其中最大的值
//练习册的答案
//int n = 1;
//int max;
//int a;
//scanf_s("%d", &max);
////while (n < 10) { // while 和 for 的替换
//for (n;n<10;){
// scanf_s("%d", &a);
// if (a > max) { // 啊哦,似乎根本用不上数组下标
// max = a;
// }
// n++;
//}
//printf("%d\n", max);
// 9.有3个数a\b\c,按大到小顺序输出
//int a, b, c;
//printf("请输入三个数字:");
//scanf_s("%d %d %d", &a, &b, &c);
//if (a < b) { // 若a<b,那么b和a互换,把大的数值转移到a
// int t = a;
// a = b;
// b = t;
//}
//if (a > c) { // 由于此时的a是前两个数中的最大值,接下来的事情就是比较a和c,如果a>c,那么输出abc即可
// if (c > b) { // 但是如果c>b,那么c是最大值,
// printf("%d %d %d", a, c, b);
// }
// printf("排序后: %d %d %d", a,b,c);
//}
//else
// printf("排序后:%d,%d,%d",c, a, b);
// 9-1.初始残缺版-衍生题:有5个数,按大到小顺序输出
//int a[5];
//printf("请输入五个数字:");
//for (int i = 0; i < 5; i++) {
// scanf_s("%d", &a[i]);
//}
//for (int j = 0; j < 4; j++) {
// printf("1、a[j]=%d;a[j+1]=%d;\n", a[j], a[j + 1]);
// if (a[j] < a[j + 1]) {
// int t = a[j];
// a[j] = a[j + 1];
// a[j + 1] = t;
// }
// printf("2、a[j]=%d;a[j+1]=%d;\n", a[j], a[j + 1]);
//}
//for (int i = 0; i < 5; i++)
// printf("%d," ,a[i]);
// 9-2.修改版:
//int a[5];
//printf("请输入五个数字:");
//for (int i = 0; i < 5; i++) {
// scanf_s("%d", &a[i]);
//}
//for (int i = 0; i < 5; i++) {
// for (int j = 0; j < 4; j++) {
// if (a[j] < a[j + 1]) {
// int t = a[j];
// a[j] = a[j + 1];
// a[j + 1] = t;
// printf("a[j]=%d;a[j+1]=%d;\n", a[j], a[j + 1]);
// }
// }
//}
//for (int i = 0; i < 5; i++)
// printf("%d,", a[i]);
// 10.
//书p32的两题
// 求多项式 1-1/2+1/3-1/4+1/5-...+1/99-1/100 的值
//int sign = 1;
//double deno = 2.0, sum = 1.0, term;
//while (deno <= 100)
//{
// sign = -sign; // 从这里开始没看懂
// term = sign / deno;
// sum = sum + term;
// deno = deno + 1;
//}
//printf("%f\n", sum);
// 求16以内的阶乘(包括16)
//int i;
//int sum=1; // sum为什么从1开始?
//int num;
//scanf_s("%d", &num);
//for (i = 1; i <= num; i++) // i为什么从1开始?
//{
// printf("%d*%d=%d\n",i,sum, i * sum);
// sum = sum * i; // 相当于(i-1的阶乘*i)
// printf("i=%d,sum=%d\n", i, sum);
//
//}
//printf("sum=%d", sum);
//
return 0;
}