C语言100以内偶数积
百度上有好多类似代码,但是只是逻辑上正确却不能正常运行例如:下面展示一些 。
#include <stdio.h>
main()
{
long s,n;
s=1;
for(n=2;n<=100;n=n+2)
s=s*n;
printf("s=%ld\n",s);
}
但是就算是long long也只有2^64,也就是说只能表示大约20位数字,完全不够使用。于是我们需要用字符串去处理还记得三年级学的竖式乘法么?这里归类一下
out[i+j-1]=in1[i]*in2[j];
但是输入到数组内的为倒序所以实际上为(比如out,in1,in2都设10位,所有数组的最后一位是个位)
out [9-j-i]=in1[9-i]*in2[9-j];
但是这样的话out的每一位可能超过10,还需要进行进位一下。
进位代码类似这样
//进位控制
for (k = 99;k > 0;k--)
{
if (output[k] >= 10)
{
output[k - 1] += output[k] / 10;
output[k] = output[k] % 10;
}
}
输出的时候需要吧数字转化为ascll码,需要将所有的数字+‘0’
这时候我们转化完了需要输出,但是数组开头可能是’0’!所以我们需要先获取道第一位有效值得下标,然后从第一位有效值输出。
所以这里我们有需要写输出函数
for (k = 0;output[k] == '0';k++);//寻找第一位有效数字
/***************字符输出*****************/
printf("100以内的偶数积为:");
for (i = k;i < 100;i++)
{
putchar(output[i]);
}
整体就是这样了,再加上一(亿)点判断挑选出100以内偶数
在添加一(亿)点点代码就好了
具体代码在下方:
//6. 编写程序求1到100之间的偶数之积。
#include "stdio.h"
int main()
{
unsigned char output[100] = { 0 };
int i = 0, j, k, l;
unsigned char temp[103] = { 0 };
temp[99] = 1;
output[99] = 1;
temp[101] = 0;
temp[102] = 0;
while (++temp[102])
{
if (temp[102] == 10)
{
temp[102] = 0;
temp[101]++;
if (temp[101] >= 10)
break;
}
if (temp[102] % 2 == 1)
{
/**************输入部分 *****************/
for (j = 0;j < 100;j++)
{
temp[j] = output[j];
}
i = 100;
j = 2;
/**************按位乘(竖式乘法)**********/
for (l = 0;l < i;l++)
{
for (k = 0;k < j;k++)
{
output[99 - (l + k)] += (temp[i - l - 1] * temp[i + j - k]);
}
}
/*****************进位控制***************/
for (k = 99;k > 0;k--)
{
if (output[k] >= 10)
{
output[k - 1] += output[k] / 10;
output[k] = output[k] % 10;
}
}
}
}
/***************数字转字符***************/
for (k = 0;k < 100;k++)
output[k] += '0';
for (k = 0;output[k] == '0';k++);//寻找第一位有效数字
/***************字符输出*****************/
printf("100以内的偶数积为:");
for (i = k;i < 100;i++)
{
putchar(output[i]);
}
return 0;
}
计算完成后值是:
34243224702511976248246432895208185975118675053719198827915654463488000000000000