问题一:Fibonacci数列定义为f0=f1=1,fn=fn-1+fn-2,从键盘输入n,计算fn的位数并输出,同时输出fn的结果(0<=n<=1000)
问题二:不能用基本数据类型存储的整数称为大整数,涉及到大整数的乘法运算称为大整数乘法。现给你两个不超过200位的非负整数,请编程输出它们的准确乘积。
事实上将这个两个题放在一起,在于它们都有共通之处,实现斐波那契数列的计算,n较大时难以用基本数据类型储存,同理, 大整数也是一样的,此时就需要采用数组,并得实现进位操作。
问题一代码:
#include<stdio.h>
#include<string.h>
#define MAXSIZE 1000//定义符号常量MAXSIZE
int main()
{
int f0[MAXSIZE] = { 0 }, f1[MAXSIZE] = { 0 }, f2[MAXSIZE] = { 0 };
int i, j, n, s0 = 1, s1 = 1, s2 = 1;//s0,s1,s2储存位数
f0[0] = f1[0] = f2[0] = 1; scanf("%d", &n);
for (i = 2; i <= n; i++) {//递推计算n
memeset(f2, 0, sizeof(f2));//fn清零
for (j = 0; j < s1; j++) {
f2[j] += f1[j] + f0[j];
if (f2[j] >= 10) {
f2[j + 1] += f2[j] / 10; f2[j] %= 10;//进位处理
}
}
if (f2[j] != 0)s2 = s1 + 1; else s2 = s1;
for (j = 0; j < s2; j++) {//为计算下一个数做准备
f0[j] = f1[j]; f1[j] = f2[j];
}
s0 = s1; s1 = s2;
}
printf("f%d,%d", n, s2);
for (i = s2 - 1; i >= 0; i--)printf("%d", f2[i]);//从最高位依次输出
return 0;
}
问题二代码:
#include<stdio.h>
#include<string.h>
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
char s1[200], s2[200];
int i, j, len1, len2, a, b, n, a1[200] = { 0 }, a2[200] = { 0 }, s3[400] = { 0 };
scanf("%s%s", s1, s2);
len1 = strlen(s1);
len2 = strlen(s2);
for (i = len1 - 1, j = 0; i >= 0; i--, j++) {
a1[j] = s1[i] - '0';
}
for (i = len2 - 1, j = 0; i >= 0; i--, j++) {
a2[j] = s2[i] - '0';
}
for (i = 0; i < len1; i++)
{
for (j = 0; j < len2; j++)
{
s3[i + j] += a1[i] * a2[j];
}
}
for (int l = 0; l <= len1 + len2 - 2; l++)
{
s3[l + 1] += (s3[l] / 10);
s3[l] = s3[l] % 10;
}
int k;
for (k = len1 + len2 - 1; k >= 0; k--)
{
if (s3[k] != 0)
{
break;
}
}
if (k == -1)
printf("%d", k + 1);
else
{
for (int m = k; m >= 0; m--)
{
printf("%d", s3[m]);
}
}
printf("\n");
}
return 0;
}