阶乘求和
求Sn=1!+2!+3!+4!+5!+…+n!之值,其中n是一个数字(n不超过20)。
错误示例
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a;
int sum=0;
for(int i=1;i<=n;i++)
{
a=1;
for(int j=1;j<=i;j++)
{
a=a*j;
}
sum=sum+a;
}
printf("%d",sum);
}
错因:数据溢出
变量类型 | 取值范围 |
---|---|
整型[signed]int | 整型[signed]int |
整型[signed]int | -2147483648~+2147483648 |
无符号整型unsigned[int] | 0~4294967295 |
短整型 short [int] | -32768~32768 |
无符号短整型unsigned short[int] | 0~65535 |
长整型 Long int | -2147483648~+2147483648 |
无符号长整型unsigned [int] | 0~4294967295 |
字符型[signed] char | -128~+127 |
无符号字符型 unsigned char | 0~255 |
单精度 float | 3.4 x 10^(-38)~ 3.4 x 10^(+38) |
双精度double | 1.7 x 10^(-308)~ 1.7 x 10^(+308) |
长双精度 long double | 1.7 x 10^(-308)~ 1.7 x 10^(+308) |
进阶
#include<stdio.h>
int main()
{
long long sn = 0 ;//总结果
int n ;//输入
scanf("%d",&n) ;
long long sum = 1 ;//部分阶乘结果
for(int i = 1;i <= n;i++)//每个阶乘数的累加
{
for(int j = 1;j <= i;j++)//阶乘内部计算
{
sum *= j ;
}
sn += sum ;//将每部分阶乘的计算结果加入总结果
sum = 1 ;//回溯,初始化,方便储存下次循环的部分结果
}
printf("%d",sn) ;//输出结果
return 0 ;
}
完数判断
一个数如果恰好等于不包含它本身所有因子之和,这个数就称为"完数"。 例如,6的因子为1、2、3,而6=1+2+3,因此6是"完数"。 编程序找出N之内的所有完数,并按下面格式输出其因子
N
? its factors are ? ? ?
#include <stdio.h>
int main()
{
int N;
scanf("%d", &N);
int yinzi[N]; //用来存放所查询的数的因子,打印需要
int sum = 0; //因子总和
int n = 0; //含有因子的个数
int i, j, k;
for (i = 2; i < N; i++) //遍历N之内的所有数,从2~N
{
for (j = 1; j < i; j++) //用该数除以该数内所有数,若余数为0,则为其因子,不考虑它本身
{
if (i % j == 0)
{
yinzi[n++] = j;
sum += j; //对因子求和
}
}
if (sum == i)
{
printf("%d its factors are ", i);
for (k = 0; k < n; k++)
printf("%d ", yinzi[k]);
printf("\n");
}
sum = 0; //注意清0
n = 0;
//memset(yinzi, 0, sizeof(yinzi)); //可以不用这一步,因为n清0了
}
return 0;
}
这里超时了,修改如下:
#include <stdio.h>
int main()
{
int N;
scanf("%d", &N);
int yinzi[N]; //用来存放所查询的数的因子,打印需要
int sum = 0; //因子总和
int n = 0; //含有因子的个数
int i, j, k;
for (i = 2; i < N; i++) //遍历N之内的所有数,从2~N
{
for (j = 1; j <= i/2; j++) //用该数除以该数内所有数,若余数为0,则为其因子,不考虑它本身
//加快速度1 一个数的因子不可能超过它的1/2
{
if (i % j == 0)
{
yinzi[n++] = j;
sum += j; //对因子求和
if (sum > i) //加快速度2 当求得sum已经大于该数的时候,提前break
{
sum = 0;
n = 0;
break;
}
}
}
if (sum == i)
{
printf("%d its factors are ", i);
for (k = 0; k < n; k++)
printf("%d ", yinzi[k]);
printf("\n");
}
sum = 0; //注意清0
n = 0;
}
return 0;
}
今天就这么多了,偷懒了。。