小知识点
1.printf()一行一个双引号“”
2.double->%lf
3.例题
4.
这两者不一样
上行:先转化成了浮点数,再运算
下行:先运算的整数,得到结果,再转化成浮点数
no1 = no / ((n - yes_count) * 1.0);
no1 = no / (n-yes_count) * 1.0 ;
下行会丢失精度
典题
算法真是博大精深
这是高精度乘法计算1到n的阶乘之和
你细品
这是我的代码
#include<stdio.h>
int main()
{int i, j, a[105], b[105], n;a[0] = 1;b[0] = 1;scanf("%d", &n);for (i = 2; i <= n; i++){//每一位都乘以i,也就是得到了b所代表的数字乘以i的结果for (j = 0; j < 105; j++){b[j] *= i;}for (j = 0; j < 105; j++){if (b[j] > 9){b[j + 1] += b[j] / 10;b[j] %= 10;}}for (j = 0; j < 105; j++){//+=意思是,阶乘之和a[j] += b[j];if (a[j] > 9){a[j + 1] += a[j] / 10;a[j] %= 10;}}}for (i = 104; i >= 0 && a[i] == 0; i--){}for (j = i; j >= 0; j--){printf("%d", a[j]);}return 0;
}
将类型大小不足的问题转化成数组问题,用人类手算的规则来编写程序,与我在《计算机科学导论》中看到的位置化数字系统 有联系
即:每一位代表不同含义
计算机的连除和十进制的连除不同
整数的连除是这样的
100
50
25
12
6
3
1
思路不对
正解如下:
#include<stdio.h>
int main()
{int n, x;scanf("%d %d", &n, &x);int i , j ;int count = 0;int arr[100] = { 0 };for (i = 1; i <= n; i++){j = 0;int tmp = i;while (tmp){j = tmp % 10;if (j == x){count++;}tmp /= 10;}}printf("%d", count);return 0;
}
得到某一位数的时候直接比较,然后/=即可
想歪了