ACM练习总结(二)

阶乘求和

求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 char0~255
单精度 float3.4 x 10^(-38)~ 3.4 x 10^(+38)
双精度double1.7 x 10^(-308)~ 1.7 x 10^(+308)
长双精度 long double1.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;
}

今天就这么多了,偷懒了。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值