目前是写论文时期,不是IT专业,本来准备写完论文再开始好好学学算法,学学IT方面知识,为今后的工作添砖加瓦。
慵懒的下午,论文写不进去,咋办,刷刷题目。由于算法太弱了,只能先找点简单题目做做。
PTA的基础部分,6-10。要求实现一个打印非负整数阶乘的函数。
void Print_Factorial ( const int N ); 实现该接口。
N最大可到1000;
用普通的数字肯定是存不了最后的答案的,肯定会出现溢出问题。
因此想到用数组或者链表记录结果的每一位,最后输出每一位就可以了。
最后答案大概有多少位呢? 可以简单估计一下,一位数乘以二位数最大是三位数,二位数乘以二位数最大四位数,本题N最大1000,那么最后答案最大位数为:
1*9+2*9+3*900+3 小于3000
那么用C语言可以定义一个数组 大概3000元素的容量大小即可存放最后答案。c++可以用vector java可以用ArrayList等
实现代码:
void Print_Factorial ( const int N ) {
if (N < 0) {
printf("Invalid input\n");
return;
}
if (N <= 1) {
printf("%d\n", 1);
return;
}
int res[3096] = {1};//记录答案数组
int res_size = 1; //开始时答案只有1位
int carry_bit = 0; //表示进位数字
for (int i = 1; i <= N; ++i) {
for (int j = 0; j < res_size; ++j) {
int tmp = res[j]*i + carry_bit; //用乘数i,算出本位乘积 假设为34
res[j] = tmp % 10; //例如 34 则本位写4 进位3
carry_bit = tmp / 10; //算出 进位 3
}
while (carry_bit) { //最后是否要进位
res[res_size++] = carry_bit % 10;
carry_bit /= 10;
}
}
for (int i = res_size-1; i >=0; --i) //res 数组中存的数字从前到后分别为个、十、百。。。。
printf("%d", res[i]);
printf("\n");
}